From bb374b68afd5e1288afc132699d62d49554b696f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Tue, 22 Aug 2023 15:07:53 +0300 Subject: [PATCH 01/11] restructure, rename manifest file --- .../{ => emailReportTask}/EmailSender.ts | 0 .../{ => emailReportTask}/IReportSender.ts | 0 .../{ => emailReportTask}/README.md | 0 .../{ => emailReportTask}/ReportManager.ts | 0 .../config/ConfigurationProvider.ts | 0 .../config/IConfigurationProvider.ts | 0 .../config/ReportConfiguration.ts | 0 .../config/TaskConstants.ts | 0 .../config/mail/MailConfiguration.ts | 0 .../config/mail/RecipientsConfiguration.ts | 0 .../config/mail/SmtpConfiguration.ts | 0 .../config/pipeline/PipelineConfiguration.ts | 0 .../config/pipeline/PipelineType.ts | 0 .../config/report/GroupTestResultsBy.ts | 0 .../config/report/ReportDataConfiguration.ts | 0 .../config/report/SendMailCondition.ts | 0 .../config/report/TestResultsConfiguration.ts | 0 .../exceptions/DataProviderError.ts | 0 .../exceptions/InputError.ts | 0 .../exceptions/InvalidTestResultDataError.ts | 0 .../exceptions/MailError.ts | 0 .../exceptions/MissingDataError.ts | 0 .../exceptions/PipelineNotFoundError.ts | 0 .../exceptions/PostProcessorError.ts | 0 .../exceptions/ReportError.ts | 0 .../htmlreport/EmailTemplate.xslt | 0 .../htmlreport/HTMLReportCreator.ts | 0 .../htmlreport/IHTMLReportCreator.ts | 0 .../images/GenericEndPoint.png | Bin .../images/TaskConfig.png | Bin .../images/TaskConfig2.png | Bin .../{ => emailReportTask}/images/icon.png | Bin .../{ => emailReportTask}/index.ts | 0 .../model/BuildReport.ts | 0 .../model/ChangeModel.ts | 0 .../{ => emailReportTask}/model/IssueModel.ts | 0 .../{ => emailReportTask}/model/JobModel.ts | 0 .../{ => emailReportTask}/model/PhaseModel.ts | 0 .../model/ReleaseReport.ts | 0 .../{ => emailReportTask}/model/Report.ts | 0 .../model/ReportFactory.ts | 0 .../{ => emailReportTask}/model/TaskModel.ts | 0 .../model/helpers/LinkHelper.ts | 0 .../model/helpers/TestResultsHelper.ts | 0 .../model/helpers/TimeFormatter.ts | 0 .../testresults/TestOutcomeForPriority.ts | 0 .../model/testresults/TestResultGroupModel.ts | 0 .../model/testresults/TestResultModel.ts | 0 .../testresults/TestSummaryGroupModel.ts | 0 .../model/testresults/TestSummaryItemModel.ts | 0 .../model/viewmodel/ArtifactViewModel.ts | 0 .../viewmodel/BuildReferenceViewModel.ts | 0 .../model/viewmodel/ChangeViewModel.ts | 0 .../model/viewmodel/DeploymentJobViewModel.ts | 0 .../model/viewmodel/EmailReportViewModel.ts | 0 .../model/viewmodel/MailAddressViewModel.ts | 0 .../model/viewmodel/PhaseIssuesViewModel.ts | 0 .../model/viewmodel/PhaseViewModel.ts | 0 .../viewmodel/ReleaseEnvironmentViewModel.ts | 0 .../viewmodel/ReleaseReferenceViewModel.ts | 0 .../model/viewmodel/ReleaseViewModel.ts | 0 .../viewmodel/TaskIssueSummaryViewModel.ts | 0 .../model/viewmodel/TaskIssueViewModel.ts | 0 .../model/viewmodel/TaskResultViewModel.ts | 0 .../viewmodel/TestInfoByPriorityViewModel.ts | 0 .../viewmodel/TestResultSummaryViewModel.ts | 0 .../model/viewmodel/TestResultViewModel.ts | 0 .../viewmodel/TestResultsGroupViewModel.ts | 0 .../viewmodel/TestSummaryGroupViewModel.ts | 0 .../viewmodel/TestSummaryItemViewModel.ts | 0 .../model/viewmodel/WorkItemViewModel.ts | 0 .../{ => emailReportTask}/package.json | 0 .../providers/DataProviderFactory.ts | 0 .../providers/IDataProvider.ts | 0 .../providers/IDataProviderFactory.ts | 0 .../providers/IPostProcessor.ts | 0 .../providers/IReportProvider.ts | 0 .../providers/ReportProvider.ts | 0 .../providers/SendMailConditionProcessor.ts | 0 .../AbstractTestResultsDetailsParser.ts | 0 .../helpers/TestResultDetailsParserFactory.ts | 0 .../TestResultDetailsParserForPriority.ts | 0 .../helpers/TestResultDetailsParserForRun.ts | 0 .../providers/pipeline/BuildDataProvider.ts | 0 .../providers/pipeline/ReleaseDataProvider.ts | 0 .../providers/restclients/AbstractClient.ts | 0 .../restclients/AbstractTestResultsClient.ts | 0 .../providers/restclients/BuildClient.ts | 0 .../restclients/BuildTestResultsClient.ts | 0 .../restclients/IPipelineRestClient.ts | 0 .../restclients/ITestResultsClient.ts | 0 .../providers/restclients/IWorkItemClient.ts | 0 .../providers/restclients/ReleaseClient.ts | 0 .../restclients/ReleaseTestResultsClient.ts | 0 .../providers/restclients/RetryablePromise.ts | 0 .../providers/restclients/WorkItemClient.ts | 0 .../providers/tcmproviders/TcmHelper.ts | 0 .../tcmproviders/TestOwnersDataProvider.ts | 0 .../tcmproviders/TestResultsDataProvider.ts | 0 .../tcmproviders/TestSummaryDataProvider.ts | 0 .../{ => emailReportTask}/task.dev.json | 0 .../{ => emailReportTask}/task.prod.json | 0 .../telemetry/TelemetryLogger.ts | 0 .../tests/__e_to_e_tests__/InvokeTest.ts | 0 .../tests/__tests__/ReportManagerTests.ts | 0 .../{ => emailReportTask}/tsconfig.json | 0 .../utils/DisplayNameHelper.ts | 0 .../{ => emailReportTask}/utils/EnumUtils.ts | 0 .../utils/EnvironmentExtensions.ts | 0 .../utils/StringUtils.ts | 0 .../{ => emailReportTask}/vss-extension.json | 0 .../emailReportTaskV2/EmailSender.ts | 89 + .../emailReportTaskV2/IReportSender.ts | 6 + .../emailReportTaskV2/README.md | 56 + .../emailReportTaskV2/ReportManager.ts | 45 + .../azure-devops-extensions.json | 55 + .../config/ConfigurationProvider.ts | 169 ++ .../config/IConfigurationProvider.ts | 16 + .../config/ReportConfiguration.ts | 69 + .../emailReportTaskV2/config/TaskConstants.ts | 33 + .../config/mail/MailConfiguration.ts | 68 + .../config/mail/RecipientsConfiguration.ts | 55 + .../config/mail/SmtpConfiguration.ts | 45 + .../config/pipeline/PipelineConfiguration.ts | 118 ++ .../config/pipeline/PipelineType.ts | 4 + .../config/report/GroupTestResultsBy.ts | 5 + .../config/report/ReportDataConfiguration.ts | 63 + .../config/report/SendMailCondition.ts | 6 + .../config/report/TestResultsConfiguration.ts | 77 + .../exceptions/DataProviderError.ts | 8 + .../exceptions/InputError.ts | 8 + .../exceptions/InvalidTestResultDataError.ts | 8 + .../emailReportTaskV2/exceptions/MailError.ts | 8 + .../exceptions/MissingDataError.ts | 8 + .../exceptions/PipelineNotFoundError.ts | 8 + .../exceptions/PostProcessorError.ts | 8 + .../exceptions/ReportError.ts | 26 + .../htmlreport/EmailTemplate.xslt | 1470 +++++++++++++++++ .../htmlreport/HTMLReportCreator.ts | 34 + .../htmlreport/IHTMLReportCreator.ts | 6 + .../images/GenericEndPoint.png | Bin 0 -> 43334 bytes .../emailReportTaskV2/images/TaskConfig.png | Bin 0 -> 112368 bytes .../emailReportTaskV2/images/TaskConfig2.png | Bin 0 -> 68726 bytes .../emailReportTaskV2/images/icon.png | Bin 0 -> 4223 bytes .../emailReportTaskV2/index.ts | 63 + .../emailReportTaskV2/model/BuildReport.ts | 106 ++ .../emailReportTaskV2/model/ChangeModel.ts | 58 + .../emailReportTaskV2/model/IssueModel.ts | 26 + .../emailReportTaskV2/model/JobModel.ts | 50 + .../emailReportTaskV2/model/PhaseModel.ts | 48 + .../emailReportTaskV2/model/ReleaseReport.ts | 217 +++ .../emailReportTaskV2/model/Report.ts | 147 ++ .../emailReportTaskV2/model/ReportFactory.ts | 91 + .../emailReportTaskV2/model/TaskModel.ts | 69 + .../model/helpers/LinkHelper.ts | 154 ++ .../model/helpers/TestResultsHelper.ts | 61 + .../model/helpers/TimeFormatter.ts | 84 + .../testresults/TestOutcomeForPriority.ts | 7 + .../model/testresults/TestResultGroupModel.ts | 8 + .../model/testresults/TestResultModel.ts | 9 + .../testresults/TestSummaryGroupModel.ts | 9 + .../model/testresults/TestSummaryItemModel.ts | 108 ++ .../model/viewmodel/ArtifactViewModel.ts | 41 + .../viewmodel/BuildReferenceViewModel.ts | 32 + .../model/viewmodel/ChangeViewModel.ts | 28 + .../model/viewmodel/DeploymentJobViewModel.ts | 59 + .../model/viewmodel/EmailReportViewModel.ts | 180 ++ .../model/viewmodel/MailAddressViewModel.ts | 158 ++ .../model/viewmodel/PhaseIssuesViewModel.ts | 30 + .../model/viewmodel/PhaseViewModel.ts | 43 + .../viewmodel/ReleaseEnvironmentViewModel.ts | 11 + .../viewmodel/ReleaseReferenceViewModel.ts | 15 + .../model/viewmodel/ReleaseViewModel.ts | 35 + .../viewmodel/TaskIssueSummaryViewModel.ts | 63 + .../model/viewmodel/TaskIssueViewModel.ts | 16 + .../model/viewmodel/TaskResultViewModel.ts | 103 ++ .../viewmodel/TestInfoByPriorityViewModel.ts | 30 + .../viewmodel/TestResultSummaryViewModel.ts | 50 + .../model/viewmodel/TestResultViewModel.ts | 96 ++ .../viewmodel/TestResultsGroupViewModel.ts | 56 + .../viewmodel/TestSummaryGroupViewModel.ts | 55 + .../viewmodel/TestSummaryItemViewModel.ts | 49 + .../model/viewmodel/WorkItemViewModel.ts | 37 + .../emailReportTaskV2/package.json | 18 + .../providers/DataProviderFactory.ts | 67 + .../providers/IDataProvider.ts | 7 + .../providers/IDataProviderFactory.ts | 7 + .../providers/IPostProcessor.ts | 6 + .../providers/IReportProvider.ts | 6 + .../providers/ReportProvider.ts | 79 + .../providers/SendMailConditionProcessor.ts | 147 ++ .../AbstractTestResultsDetailsParser.ts | 47 + .../helpers/TestResultDetailsParserFactory.ts | 20 + .../TestResultDetailsParserForPriority.ts | 76 + .../helpers/TestResultDetailsParserForRun.ts | 47 + .../providers/pipeline/BuildDataProvider.ts | 113 ++ .../providers/pipeline/ReleaseDataProvider.ts | 121 ++ .../providers/restclients/AbstractClient.ts | 27 + .../restclients/AbstractTestResultsClient.ts | 107 ++ .../providers/restclients/BuildClient.ts | 60 + .../restclients/BuildTestResultsClient.ts | 28 + .../restclients/IPipelineRestClient.ts | 9 + .../restclients/ITestResultsClient.ts | 13 + .../providers/restclients/IWorkItemClient.ts | 5 + .../providers/restclients/ReleaseClient.ts | 93 ++ .../restclients/ReleaseTestResultsClient.ts | 30 + .../providers/restclients/RetryablePromise.ts | 38 + .../providers/restclients/WorkItemClient.ts | 33 + .../providers/tcmproviders/TcmHelper.ts | 65 + .../tcmproviders/TestOwnersDataProvider.ts | 32 + .../tcmproviders/TestResultsDataProvider.ts | 194 +++ .../tcmproviders/TestSummaryDataProvider.ts | 158 ++ .../emailReportTaskV2/task.dev.json | 238 +++ .../emailReportTaskV2/task.prod.json | 238 +++ .../telemetry/TelemetryLogger.ts | 101 ++ .../tests/__e_to_e_tests__/InvokeTest.ts | 83 + .../tests/__tests__/ReportManagerTests.ts | 22 + .../emailReportTaskV2/tsconfig.json | 18 + .../utils/DisplayNameHelper.ts | 10 + .../emailReportTaskV2/utils/EnumUtils.ts | 45 + .../utils/EnvironmentExtensions.ts | 19 + .../emailReportTaskV2/utils/StringUtils.ts | 40 + 222 files changed, 7540 insertions(+) rename Tasks/emailReportTask/{ => emailReportTask}/EmailSender.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/IReportSender.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/README.md (100%) rename Tasks/emailReportTask/{ => emailReportTask}/ReportManager.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/ConfigurationProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/IConfigurationProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/ReportConfiguration.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/TaskConstants.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/mail/MailConfiguration.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/mail/RecipientsConfiguration.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/mail/SmtpConfiguration.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/pipeline/PipelineConfiguration.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/pipeline/PipelineType.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/report/GroupTestResultsBy.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/report/ReportDataConfiguration.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/report/SendMailCondition.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/config/report/TestResultsConfiguration.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/exceptions/DataProviderError.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/exceptions/InputError.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/exceptions/InvalidTestResultDataError.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/exceptions/MailError.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/exceptions/MissingDataError.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/exceptions/PipelineNotFoundError.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/exceptions/PostProcessorError.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/exceptions/ReportError.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/htmlreport/EmailTemplate.xslt (100%) rename Tasks/emailReportTask/{ => emailReportTask}/htmlreport/HTMLReportCreator.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/htmlreport/IHTMLReportCreator.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/images/GenericEndPoint.png (100%) rename Tasks/emailReportTask/{ => emailReportTask}/images/TaskConfig.png (100%) rename Tasks/emailReportTask/{ => emailReportTask}/images/TaskConfig2.png (100%) rename Tasks/emailReportTask/{ => emailReportTask}/images/icon.png (100%) rename Tasks/emailReportTask/{ => emailReportTask}/index.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/BuildReport.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/ChangeModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/IssueModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/JobModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/PhaseModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/ReleaseReport.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/Report.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/ReportFactory.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/TaskModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/helpers/LinkHelper.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/helpers/TestResultsHelper.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/helpers/TimeFormatter.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/testresults/TestOutcomeForPriority.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/testresults/TestResultGroupModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/testresults/TestResultModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/testresults/TestSummaryGroupModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/testresults/TestSummaryItemModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/ArtifactViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/BuildReferenceViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/ChangeViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/DeploymentJobViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/EmailReportViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/MailAddressViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/PhaseIssuesViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/PhaseViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/ReleaseEnvironmentViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/ReleaseReferenceViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/ReleaseViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TaskIssueSummaryViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TaskIssueViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TaskResultViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TestInfoByPriorityViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TestResultSummaryViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TestResultViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TestResultsGroupViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TestSummaryGroupViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/TestSummaryItemViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/model/viewmodel/WorkItemViewModel.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/package.json (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/DataProviderFactory.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/IDataProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/IDataProviderFactory.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/IPostProcessor.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/IReportProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/ReportProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/SendMailConditionProcessor.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/helpers/AbstractTestResultsDetailsParser.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/helpers/TestResultDetailsParserFactory.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/helpers/TestResultDetailsParserForPriority.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/helpers/TestResultDetailsParserForRun.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/pipeline/BuildDataProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/pipeline/ReleaseDataProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/AbstractClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/AbstractTestResultsClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/BuildClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/BuildTestResultsClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/IPipelineRestClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/ITestResultsClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/IWorkItemClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/ReleaseClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/ReleaseTestResultsClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/RetryablePromise.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/restclients/WorkItemClient.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/tcmproviders/TcmHelper.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/tcmproviders/TestOwnersDataProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/tcmproviders/TestResultsDataProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/providers/tcmproviders/TestSummaryDataProvider.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/task.dev.json (100%) rename Tasks/emailReportTask/{ => emailReportTask}/task.prod.json (100%) rename Tasks/emailReportTask/{ => emailReportTask}/telemetry/TelemetryLogger.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/tests/__e_to_e_tests__/InvokeTest.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/tests/__tests__/ReportManagerTests.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/tsconfig.json (100%) rename Tasks/emailReportTask/{ => emailReportTask}/utils/DisplayNameHelper.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/utils/EnumUtils.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/utils/EnvironmentExtensions.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/utils/StringUtils.ts (100%) rename Tasks/emailReportTask/{ => emailReportTask}/vss-extension.json (100%) create mode 100644 Tasks/emailReportTask/emailReportTaskV2/EmailSender.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/IReportSender.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/README.md create mode 100644 Tasks/emailReportTask/emailReportTaskV2/ReportManager.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/azure-devops-extensions.json create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/htmlreport/EmailTemplate.xslt create mode 100644 Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/images/GenericEndPoint.png create mode 100644 Tasks/emailReportTask/emailReportTaskV2/images/TaskConfig.png create mode 100644 Tasks/emailReportTask/emailReportTaskV2/images/TaskConfig2.png create mode 100644 Tasks/emailReportTask/emailReportTaskV2/images/icon.png create mode 100644 Tasks/emailReportTask/emailReportTaskV2/index.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/JobModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/Report.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/package.json create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/task.dev.json create mode 100644 Tasks/emailReportTask/emailReportTaskV2/task.prod.json create mode 100644 Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/tsconfig.json create mode 100644 Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.ts create mode 100644 Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.ts diff --git a/Tasks/emailReportTask/EmailSender.ts b/Tasks/emailReportTask/emailReportTask/EmailSender.ts similarity index 100% rename from Tasks/emailReportTask/EmailSender.ts rename to Tasks/emailReportTask/emailReportTask/EmailSender.ts diff --git a/Tasks/emailReportTask/IReportSender.ts b/Tasks/emailReportTask/emailReportTask/IReportSender.ts similarity index 100% rename from Tasks/emailReportTask/IReportSender.ts rename to Tasks/emailReportTask/emailReportTask/IReportSender.ts diff --git a/Tasks/emailReportTask/README.md b/Tasks/emailReportTask/emailReportTask/README.md similarity index 100% rename from Tasks/emailReportTask/README.md rename to Tasks/emailReportTask/emailReportTask/README.md diff --git a/Tasks/emailReportTask/ReportManager.ts b/Tasks/emailReportTask/emailReportTask/ReportManager.ts similarity index 100% rename from Tasks/emailReportTask/ReportManager.ts rename to Tasks/emailReportTask/emailReportTask/ReportManager.ts diff --git a/Tasks/emailReportTask/config/ConfigurationProvider.ts b/Tasks/emailReportTask/emailReportTask/config/ConfigurationProvider.ts similarity index 100% rename from Tasks/emailReportTask/config/ConfigurationProvider.ts rename to Tasks/emailReportTask/emailReportTask/config/ConfigurationProvider.ts diff --git a/Tasks/emailReportTask/config/IConfigurationProvider.ts b/Tasks/emailReportTask/emailReportTask/config/IConfigurationProvider.ts similarity index 100% rename from Tasks/emailReportTask/config/IConfigurationProvider.ts rename to Tasks/emailReportTask/emailReportTask/config/IConfigurationProvider.ts diff --git a/Tasks/emailReportTask/config/ReportConfiguration.ts b/Tasks/emailReportTask/emailReportTask/config/ReportConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/config/ReportConfiguration.ts rename to Tasks/emailReportTask/emailReportTask/config/ReportConfiguration.ts diff --git a/Tasks/emailReportTask/config/TaskConstants.ts b/Tasks/emailReportTask/emailReportTask/config/TaskConstants.ts similarity index 100% rename from Tasks/emailReportTask/config/TaskConstants.ts rename to Tasks/emailReportTask/emailReportTask/config/TaskConstants.ts diff --git a/Tasks/emailReportTask/config/mail/MailConfiguration.ts b/Tasks/emailReportTask/emailReportTask/config/mail/MailConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/config/mail/MailConfiguration.ts rename to Tasks/emailReportTask/emailReportTask/config/mail/MailConfiguration.ts diff --git a/Tasks/emailReportTask/config/mail/RecipientsConfiguration.ts b/Tasks/emailReportTask/emailReportTask/config/mail/RecipientsConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/config/mail/RecipientsConfiguration.ts rename to Tasks/emailReportTask/emailReportTask/config/mail/RecipientsConfiguration.ts diff --git a/Tasks/emailReportTask/config/mail/SmtpConfiguration.ts b/Tasks/emailReportTask/emailReportTask/config/mail/SmtpConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/config/mail/SmtpConfiguration.ts rename to Tasks/emailReportTask/emailReportTask/config/mail/SmtpConfiguration.ts diff --git a/Tasks/emailReportTask/config/pipeline/PipelineConfiguration.ts b/Tasks/emailReportTask/emailReportTask/config/pipeline/PipelineConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/config/pipeline/PipelineConfiguration.ts rename to Tasks/emailReportTask/emailReportTask/config/pipeline/PipelineConfiguration.ts diff --git a/Tasks/emailReportTask/config/pipeline/PipelineType.ts b/Tasks/emailReportTask/emailReportTask/config/pipeline/PipelineType.ts similarity index 100% rename from Tasks/emailReportTask/config/pipeline/PipelineType.ts rename to Tasks/emailReportTask/emailReportTask/config/pipeline/PipelineType.ts diff --git a/Tasks/emailReportTask/config/report/GroupTestResultsBy.ts b/Tasks/emailReportTask/emailReportTask/config/report/GroupTestResultsBy.ts similarity index 100% rename from Tasks/emailReportTask/config/report/GroupTestResultsBy.ts rename to Tasks/emailReportTask/emailReportTask/config/report/GroupTestResultsBy.ts diff --git a/Tasks/emailReportTask/config/report/ReportDataConfiguration.ts b/Tasks/emailReportTask/emailReportTask/config/report/ReportDataConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/config/report/ReportDataConfiguration.ts rename to Tasks/emailReportTask/emailReportTask/config/report/ReportDataConfiguration.ts diff --git a/Tasks/emailReportTask/config/report/SendMailCondition.ts b/Tasks/emailReportTask/emailReportTask/config/report/SendMailCondition.ts similarity index 100% rename from Tasks/emailReportTask/config/report/SendMailCondition.ts rename to Tasks/emailReportTask/emailReportTask/config/report/SendMailCondition.ts diff --git a/Tasks/emailReportTask/config/report/TestResultsConfiguration.ts b/Tasks/emailReportTask/emailReportTask/config/report/TestResultsConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/config/report/TestResultsConfiguration.ts rename to Tasks/emailReportTask/emailReportTask/config/report/TestResultsConfiguration.ts diff --git a/Tasks/emailReportTask/exceptions/DataProviderError.ts b/Tasks/emailReportTask/emailReportTask/exceptions/DataProviderError.ts similarity index 100% rename from Tasks/emailReportTask/exceptions/DataProviderError.ts rename to Tasks/emailReportTask/emailReportTask/exceptions/DataProviderError.ts diff --git a/Tasks/emailReportTask/exceptions/InputError.ts b/Tasks/emailReportTask/emailReportTask/exceptions/InputError.ts similarity index 100% rename from Tasks/emailReportTask/exceptions/InputError.ts rename to Tasks/emailReportTask/emailReportTask/exceptions/InputError.ts diff --git a/Tasks/emailReportTask/exceptions/InvalidTestResultDataError.ts b/Tasks/emailReportTask/emailReportTask/exceptions/InvalidTestResultDataError.ts similarity index 100% rename from Tasks/emailReportTask/exceptions/InvalidTestResultDataError.ts rename to Tasks/emailReportTask/emailReportTask/exceptions/InvalidTestResultDataError.ts diff --git a/Tasks/emailReportTask/exceptions/MailError.ts b/Tasks/emailReportTask/emailReportTask/exceptions/MailError.ts similarity index 100% rename from Tasks/emailReportTask/exceptions/MailError.ts rename to Tasks/emailReportTask/emailReportTask/exceptions/MailError.ts diff --git a/Tasks/emailReportTask/exceptions/MissingDataError.ts b/Tasks/emailReportTask/emailReportTask/exceptions/MissingDataError.ts similarity index 100% rename from Tasks/emailReportTask/exceptions/MissingDataError.ts rename to Tasks/emailReportTask/emailReportTask/exceptions/MissingDataError.ts diff --git a/Tasks/emailReportTask/exceptions/PipelineNotFoundError.ts b/Tasks/emailReportTask/emailReportTask/exceptions/PipelineNotFoundError.ts similarity index 100% rename from Tasks/emailReportTask/exceptions/PipelineNotFoundError.ts rename to Tasks/emailReportTask/emailReportTask/exceptions/PipelineNotFoundError.ts diff --git a/Tasks/emailReportTask/exceptions/PostProcessorError.ts b/Tasks/emailReportTask/emailReportTask/exceptions/PostProcessorError.ts similarity index 100% rename from Tasks/emailReportTask/exceptions/PostProcessorError.ts rename to Tasks/emailReportTask/emailReportTask/exceptions/PostProcessorError.ts diff --git a/Tasks/emailReportTask/exceptions/ReportError.ts b/Tasks/emailReportTask/emailReportTask/exceptions/ReportError.ts similarity index 100% rename from Tasks/emailReportTask/exceptions/ReportError.ts rename to Tasks/emailReportTask/emailReportTask/exceptions/ReportError.ts diff --git a/Tasks/emailReportTask/htmlreport/EmailTemplate.xslt b/Tasks/emailReportTask/emailReportTask/htmlreport/EmailTemplate.xslt similarity index 100% rename from Tasks/emailReportTask/htmlreport/EmailTemplate.xslt rename to Tasks/emailReportTask/emailReportTask/htmlreport/EmailTemplate.xslt diff --git a/Tasks/emailReportTask/htmlreport/HTMLReportCreator.ts b/Tasks/emailReportTask/emailReportTask/htmlreport/HTMLReportCreator.ts similarity index 100% rename from Tasks/emailReportTask/htmlreport/HTMLReportCreator.ts rename to Tasks/emailReportTask/emailReportTask/htmlreport/HTMLReportCreator.ts diff --git a/Tasks/emailReportTask/htmlreport/IHTMLReportCreator.ts b/Tasks/emailReportTask/emailReportTask/htmlreport/IHTMLReportCreator.ts similarity index 100% rename from Tasks/emailReportTask/htmlreport/IHTMLReportCreator.ts rename to Tasks/emailReportTask/emailReportTask/htmlreport/IHTMLReportCreator.ts diff --git a/Tasks/emailReportTask/images/GenericEndPoint.png b/Tasks/emailReportTask/emailReportTask/images/GenericEndPoint.png similarity index 100% rename from Tasks/emailReportTask/images/GenericEndPoint.png rename to Tasks/emailReportTask/emailReportTask/images/GenericEndPoint.png diff --git a/Tasks/emailReportTask/images/TaskConfig.png b/Tasks/emailReportTask/emailReportTask/images/TaskConfig.png similarity index 100% rename from Tasks/emailReportTask/images/TaskConfig.png rename to Tasks/emailReportTask/emailReportTask/images/TaskConfig.png diff --git a/Tasks/emailReportTask/images/TaskConfig2.png b/Tasks/emailReportTask/emailReportTask/images/TaskConfig2.png similarity index 100% rename from Tasks/emailReportTask/images/TaskConfig2.png rename to Tasks/emailReportTask/emailReportTask/images/TaskConfig2.png diff --git a/Tasks/emailReportTask/images/icon.png b/Tasks/emailReportTask/emailReportTask/images/icon.png similarity index 100% rename from Tasks/emailReportTask/images/icon.png rename to Tasks/emailReportTask/emailReportTask/images/icon.png diff --git a/Tasks/emailReportTask/index.ts b/Tasks/emailReportTask/emailReportTask/index.ts similarity index 100% rename from Tasks/emailReportTask/index.ts rename to Tasks/emailReportTask/emailReportTask/index.ts diff --git a/Tasks/emailReportTask/model/BuildReport.ts b/Tasks/emailReportTask/emailReportTask/model/BuildReport.ts similarity index 100% rename from Tasks/emailReportTask/model/BuildReport.ts rename to Tasks/emailReportTask/emailReportTask/model/BuildReport.ts diff --git a/Tasks/emailReportTask/model/ChangeModel.ts b/Tasks/emailReportTask/emailReportTask/model/ChangeModel.ts similarity index 100% rename from Tasks/emailReportTask/model/ChangeModel.ts rename to Tasks/emailReportTask/emailReportTask/model/ChangeModel.ts diff --git a/Tasks/emailReportTask/model/IssueModel.ts b/Tasks/emailReportTask/emailReportTask/model/IssueModel.ts similarity index 100% rename from Tasks/emailReportTask/model/IssueModel.ts rename to Tasks/emailReportTask/emailReportTask/model/IssueModel.ts diff --git a/Tasks/emailReportTask/model/JobModel.ts b/Tasks/emailReportTask/emailReportTask/model/JobModel.ts similarity index 100% rename from Tasks/emailReportTask/model/JobModel.ts rename to Tasks/emailReportTask/emailReportTask/model/JobModel.ts diff --git a/Tasks/emailReportTask/model/PhaseModel.ts b/Tasks/emailReportTask/emailReportTask/model/PhaseModel.ts similarity index 100% rename from Tasks/emailReportTask/model/PhaseModel.ts rename to Tasks/emailReportTask/emailReportTask/model/PhaseModel.ts diff --git a/Tasks/emailReportTask/model/ReleaseReport.ts b/Tasks/emailReportTask/emailReportTask/model/ReleaseReport.ts similarity index 100% rename from Tasks/emailReportTask/model/ReleaseReport.ts rename to Tasks/emailReportTask/emailReportTask/model/ReleaseReport.ts diff --git a/Tasks/emailReportTask/model/Report.ts b/Tasks/emailReportTask/emailReportTask/model/Report.ts similarity index 100% rename from Tasks/emailReportTask/model/Report.ts rename to Tasks/emailReportTask/emailReportTask/model/Report.ts diff --git a/Tasks/emailReportTask/model/ReportFactory.ts b/Tasks/emailReportTask/emailReportTask/model/ReportFactory.ts similarity index 100% rename from Tasks/emailReportTask/model/ReportFactory.ts rename to Tasks/emailReportTask/emailReportTask/model/ReportFactory.ts diff --git a/Tasks/emailReportTask/model/TaskModel.ts b/Tasks/emailReportTask/emailReportTask/model/TaskModel.ts similarity index 100% rename from Tasks/emailReportTask/model/TaskModel.ts rename to Tasks/emailReportTask/emailReportTask/model/TaskModel.ts diff --git a/Tasks/emailReportTask/model/helpers/LinkHelper.ts b/Tasks/emailReportTask/emailReportTask/model/helpers/LinkHelper.ts similarity index 100% rename from Tasks/emailReportTask/model/helpers/LinkHelper.ts rename to Tasks/emailReportTask/emailReportTask/model/helpers/LinkHelper.ts diff --git a/Tasks/emailReportTask/model/helpers/TestResultsHelper.ts b/Tasks/emailReportTask/emailReportTask/model/helpers/TestResultsHelper.ts similarity index 100% rename from Tasks/emailReportTask/model/helpers/TestResultsHelper.ts rename to Tasks/emailReportTask/emailReportTask/model/helpers/TestResultsHelper.ts diff --git a/Tasks/emailReportTask/model/helpers/TimeFormatter.ts b/Tasks/emailReportTask/emailReportTask/model/helpers/TimeFormatter.ts similarity index 100% rename from Tasks/emailReportTask/model/helpers/TimeFormatter.ts rename to Tasks/emailReportTask/emailReportTask/model/helpers/TimeFormatter.ts diff --git a/Tasks/emailReportTask/model/testresults/TestOutcomeForPriority.ts b/Tasks/emailReportTask/emailReportTask/model/testresults/TestOutcomeForPriority.ts similarity index 100% rename from Tasks/emailReportTask/model/testresults/TestOutcomeForPriority.ts rename to Tasks/emailReportTask/emailReportTask/model/testresults/TestOutcomeForPriority.ts diff --git a/Tasks/emailReportTask/model/testresults/TestResultGroupModel.ts b/Tasks/emailReportTask/emailReportTask/model/testresults/TestResultGroupModel.ts similarity index 100% rename from Tasks/emailReportTask/model/testresults/TestResultGroupModel.ts rename to Tasks/emailReportTask/emailReportTask/model/testresults/TestResultGroupModel.ts diff --git a/Tasks/emailReportTask/model/testresults/TestResultModel.ts b/Tasks/emailReportTask/emailReportTask/model/testresults/TestResultModel.ts similarity index 100% rename from Tasks/emailReportTask/model/testresults/TestResultModel.ts rename to Tasks/emailReportTask/emailReportTask/model/testresults/TestResultModel.ts diff --git a/Tasks/emailReportTask/model/testresults/TestSummaryGroupModel.ts b/Tasks/emailReportTask/emailReportTask/model/testresults/TestSummaryGroupModel.ts similarity index 100% rename from Tasks/emailReportTask/model/testresults/TestSummaryGroupModel.ts rename to Tasks/emailReportTask/emailReportTask/model/testresults/TestSummaryGroupModel.ts diff --git a/Tasks/emailReportTask/model/testresults/TestSummaryItemModel.ts b/Tasks/emailReportTask/emailReportTask/model/testresults/TestSummaryItemModel.ts similarity index 100% rename from Tasks/emailReportTask/model/testresults/TestSummaryItemModel.ts rename to Tasks/emailReportTask/emailReportTask/model/testresults/TestSummaryItemModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/ArtifactViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/ArtifactViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/ArtifactViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/ArtifactViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/BuildReferenceViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/BuildReferenceViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/BuildReferenceViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/BuildReferenceViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/ChangeViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/ChangeViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/ChangeViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/ChangeViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/DeploymentJobViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/DeploymentJobViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/DeploymentJobViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/DeploymentJobViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/EmailReportViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/EmailReportViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/EmailReportViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/EmailReportViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/MailAddressViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/MailAddressViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/MailAddressViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/MailAddressViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/PhaseIssuesViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/PhaseIssuesViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/PhaseIssuesViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/PhaseIssuesViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/PhaseViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/PhaseViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/PhaseViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/PhaseViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/ReleaseEnvironmentViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseEnvironmentViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/ReleaseEnvironmentViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseEnvironmentViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/ReleaseReferenceViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseReferenceViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/ReleaseReferenceViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseReferenceViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/ReleaseViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/ReleaseViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TaskIssueSummaryViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskIssueSummaryViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TaskIssueSummaryViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskIssueSummaryViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TaskIssueViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskIssueViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TaskIssueViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskIssueViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TaskResultViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskResultViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TaskResultViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskResultViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TestInfoByPriorityViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestInfoByPriorityViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TestInfoByPriorityViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TestInfoByPriorityViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TestResultSummaryViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultSummaryViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TestResultSummaryViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultSummaryViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TestResultViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TestResultViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TestResultsGroupViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultsGroupViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TestResultsGroupViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultsGroupViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TestSummaryGroupViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestSummaryGroupViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TestSummaryGroupViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TestSummaryGroupViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/TestSummaryItemViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestSummaryItemViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/TestSummaryItemViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/TestSummaryItemViewModel.ts diff --git a/Tasks/emailReportTask/model/viewmodel/WorkItemViewModel.ts b/Tasks/emailReportTask/emailReportTask/model/viewmodel/WorkItemViewModel.ts similarity index 100% rename from Tasks/emailReportTask/model/viewmodel/WorkItemViewModel.ts rename to Tasks/emailReportTask/emailReportTask/model/viewmodel/WorkItemViewModel.ts diff --git a/Tasks/emailReportTask/package.json b/Tasks/emailReportTask/emailReportTask/package.json similarity index 100% rename from Tasks/emailReportTask/package.json rename to Tasks/emailReportTask/emailReportTask/package.json diff --git a/Tasks/emailReportTask/providers/DataProviderFactory.ts b/Tasks/emailReportTask/emailReportTask/providers/DataProviderFactory.ts similarity index 100% rename from Tasks/emailReportTask/providers/DataProviderFactory.ts rename to Tasks/emailReportTask/emailReportTask/providers/DataProviderFactory.ts diff --git a/Tasks/emailReportTask/providers/IDataProvider.ts b/Tasks/emailReportTask/emailReportTask/providers/IDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/providers/IDataProvider.ts rename to Tasks/emailReportTask/emailReportTask/providers/IDataProvider.ts diff --git a/Tasks/emailReportTask/providers/IDataProviderFactory.ts b/Tasks/emailReportTask/emailReportTask/providers/IDataProviderFactory.ts similarity index 100% rename from Tasks/emailReportTask/providers/IDataProviderFactory.ts rename to Tasks/emailReportTask/emailReportTask/providers/IDataProviderFactory.ts diff --git a/Tasks/emailReportTask/providers/IPostProcessor.ts b/Tasks/emailReportTask/emailReportTask/providers/IPostProcessor.ts similarity index 100% rename from Tasks/emailReportTask/providers/IPostProcessor.ts rename to Tasks/emailReportTask/emailReportTask/providers/IPostProcessor.ts diff --git a/Tasks/emailReportTask/providers/IReportProvider.ts b/Tasks/emailReportTask/emailReportTask/providers/IReportProvider.ts similarity index 100% rename from Tasks/emailReportTask/providers/IReportProvider.ts rename to Tasks/emailReportTask/emailReportTask/providers/IReportProvider.ts diff --git a/Tasks/emailReportTask/providers/ReportProvider.ts b/Tasks/emailReportTask/emailReportTask/providers/ReportProvider.ts similarity index 100% rename from Tasks/emailReportTask/providers/ReportProvider.ts rename to Tasks/emailReportTask/emailReportTask/providers/ReportProvider.ts diff --git a/Tasks/emailReportTask/providers/SendMailConditionProcessor.ts b/Tasks/emailReportTask/emailReportTask/providers/SendMailConditionProcessor.ts similarity index 100% rename from Tasks/emailReportTask/providers/SendMailConditionProcessor.ts rename to Tasks/emailReportTask/emailReportTask/providers/SendMailConditionProcessor.ts diff --git a/Tasks/emailReportTask/providers/helpers/AbstractTestResultsDetailsParser.ts b/Tasks/emailReportTask/emailReportTask/providers/helpers/AbstractTestResultsDetailsParser.ts similarity index 100% rename from Tasks/emailReportTask/providers/helpers/AbstractTestResultsDetailsParser.ts rename to Tasks/emailReportTask/emailReportTask/providers/helpers/AbstractTestResultsDetailsParser.ts diff --git a/Tasks/emailReportTask/providers/helpers/TestResultDetailsParserFactory.ts b/Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserFactory.ts similarity index 100% rename from Tasks/emailReportTask/providers/helpers/TestResultDetailsParserFactory.ts rename to Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserFactory.ts diff --git a/Tasks/emailReportTask/providers/helpers/TestResultDetailsParserForPriority.ts b/Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserForPriority.ts similarity index 100% rename from Tasks/emailReportTask/providers/helpers/TestResultDetailsParserForPriority.ts rename to Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserForPriority.ts diff --git a/Tasks/emailReportTask/providers/helpers/TestResultDetailsParserForRun.ts b/Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserForRun.ts similarity index 100% rename from Tasks/emailReportTask/providers/helpers/TestResultDetailsParserForRun.ts rename to Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserForRun.ts diff --git a/Tasks/emailReportTask/providers/pipeline/BuildDataProvider.ts b/Tasks/emailReportTask/emailReportTask/providers/pipeline/BuildDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/providers/pipeline/BuildDataProvider.ts rename to Tasks/emailReportTask/emailReportTask/providers/pipeline/BuildDataProvider.ts diff --git a/Tasks/emailReportTask/providers/pipeline/ReleaseDataProvider.ts b/Tasks/emailReportTask/emailReportTask/providers/pipeline/ReleaseDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/providers/pipeline/ReleaseDataProvider.ts rename to Tasks/emailReportTask/emailReportTask/providers/pipeline/ReleaseDataProvider.ts diff --git a/Tasks/emailReportTask/providers/restclients/AbstractClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/AbstractClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/AbstractClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/AbstractClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/AbstractTestResultsClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/AbstractTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/AbstractTestResultsClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/AbstractTestResultsClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/BuildClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/BuildClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/BuildClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/BuildClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/BuildTestResultsClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/BuildTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/BuildTestResultsClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/BuildTestResultsClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/IPipelineRestClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/IPipelineRestClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/IPipelineRestClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/IPipelineRestClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/ITestResultsClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/ITestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/ITestResultsClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/ITestResultsClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/IWorkItemClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/IWorkItemClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/IWorkItemClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/IWorkItemClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/ReleaseClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/ReleaseClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/ReleaseClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/ReleaseClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/ReleaseTestResultsClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/ReleaseTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/ReleaseTestResultsClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/ReleaseTestResultsClient.ts diff --git a/Tasks/emailReportTask/providers/restclients/RetryablePromise.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/RetryablePromise.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/RetryablePromise.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/RetryablePromise.ts diff --git a/Tasks/emailReportTask/providers/restclients/WorkItemClient.ts b/Tasks/emailReportTask/emailReportTask/providers/restclients/WorkItemClient.ts similarity index 100% rename from Tasks/emailReportTask/providers/restclients/WorkItemClient.ts rename to Tasks/emailReportTask/emailReportTask/providers/restclients/WorkItemClient.ts diff --git a/Tasks/emailReportTask/providers/tcmproviders/TcmHelper.ts b/Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TcmHelper.ts similarity index 100% rename from Tasks/emailReportTask/providers/tcmproviders/TcmHelper.ts rename to Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TcmHelper.ts diff --git a/Tasks/emailReportTask/providers/tcmproviders/TestOwnersDataProvider.ts b/Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestOwnersDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/providers/tcmproviders/TestOwnersDataProvider.ts rename to Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestOwnersDataProvider.ts diff --git a/Tasks/emailReportTask/providers/tcmproviders/TestResultsDataProvider.ts b/Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestResultsDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/providers/tcmproviders/TestResultsDataProvider.ts rename to Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestResultsDataProvider.ts diff --git a/Tasks/emailReportTask/providers/tcmproviders/TestSummaryDataProvider.ts b/Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestSummaryDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/providers/tcmproviders/TestSummaryDataProvider.ts rename to Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestSummaryDataProvider.ts diff --git a/Tasks/emailReportTask/task.dev.json b/Tasks/emailReportTask/emailReportTask/task.dev.json similarity index 100% rename from Tasks/emailReportTask/task.dev.json rename to Tasks/emailReportTask/emailReportTask/task.dev.json diff --git a/Tasks/emailReportTask/task.prod.json b/Tasks/emailReportTask/emailReportTask/task.prod.json similarity index 100% rename from Tasks/emailReportTask/task.prod.json rename to Tasks/emailReportTask/emailReportTask/task.prod.json diff --git a/Tasks/emailReportTask/telemetry/TelemetryLogger.ts b/Tasks/emailReportTask/emailReportTask/telemetry/TelemetryLogger.ts similarity index 100% rename from Tasks/emailReportTask/telemetry/TelemetryLogger.ts rename to Tasks/emailReportTask/emailReportTask/telemetry/TelemetryLogger.ts diff --git a/Tasks/emailReportTask/tests/__e_to_e_tests__/InvokeTest.ts b/Tasks/emailReportTask/emailReportTask/tests/__e_to_e_tests__/InvokeTest.ts similarity index 100% rename from Tasks/emailReportTask/tests/__e_to_e_tests__/InvokeTest.ts rename to Tasks/emailReportTask/emailReportTask/tests/__e_to_e_tests__/InvokeTest.ts diff --git a/Tasks/emailReportTask/tests/__tests__/ReportManagerTests.ts b/Tasks/emailReportTask/emailReportTask/tests/__tests__/ReportManagerTests.ts similarity index 100% rename from Tasks/emailReportTask/tests/__tests__/ReportManagerTests.ts rename to Tasks/emailReportTask/emailReportTask/tests/__tests__/ReportManagerTests.ts diff --git a/Tasks/emailReportTask/tsconfig.json b/Tasks/emailReportTask/emailReportTask/tsconfig.json similarity index 100% rename from Tasks/emailReportTask/tsconfig.json rename to Tasks/emailReportTask/emailReportTask/tsconfig.json diff --git a/Tasks/emailReportTask/utils/DisplayNameHelper.ts b/Tasks/emailReportTask/emailReportTask/utils/DisplayNameHelper.ts similarity index 100% rename from Tasks/emailReportTask/utils/DisplayNameHelper.ts rename to Tasks/emailReportTask/emailReportTask/utils/DisplayNameHelper.ts diff --git a/Tasks/emailReportTask/utils/EnumUtils.ts b/Tasks/emailReportTask/emailReportTask/utils/EnumUtils.ts similarity index 100% rename from Tasks/emailReportTask/utils/EnumUtils.ts rename to Tasks/emailReportTask/emailReportTask/utils/EnumUtils.ts diff --git a/Tasks/emailReportTask/utils/EnvironmentExtensions.ts b/Tasks/emailReportTask/emailReportTask/utils/EnvironmentExtensions.ts similarity index 100% rename from Tasks/emailReportTask/utils/EnvironmentExtensions.ts rename to Tasks/emailReportTask/emailReportTask/utils/EnvironmentExtensions.ts diff --git a/Tasks/emailReportTask/utils/StringUtils.ts b/Tasks/emailReportTask/emailReportTask/utils/StringUtils.ts similarity index 100% rename from Tasks/emailReportTask/utils/StringUtils.ts rename to Tasks/emailReportTask/emailReportTask/utils/StringUtils.ts diff --git a/Tasks/emailReportTask/vss-extension.json b/Tasks/emailReportTask/emailReportTask/vss-extension.json similarity index 100% rename from Tasks/emailReportTask/vss-extension.json rename to Tasks/emailReportTask/emailReportTask/vss-extension.json diff --git a/Tasks/emailReportTask/emailReportTaskV2/EmailSender.ts b/Tasks/emailReportTask/emailReportTaskV2/EmailSender.ts new file mode 100644 index 00000000..b1674998 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/EmailSender.ts @@ -0,0 +1,89 @@ +import { IReportSender } from "./IReportSender"; +import { MailConfiguration } from "./config/mail/MailConfiguration"; +import { MailAddressViewModel } from "./model/viewmodel/MailAddressViewModel"; +import { Report } from "./model/Report"; +import { MailError } from "./exceptions/MailError"; +import { isNullOrUndefined } from "util"; +const nodemailer = require("nodemailer"); +const url = require("url"); + +export class EmailSender implements IReportSender { + public async sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise { + const mailAddressViewModel = new MailAddressViewModel(report, mailConfiguration); + + let smtpUrlProvided = mailConfiguration.$smtpConfig.$smtpHost; + console.log(`Using SmtpHost URL: ${smtpUrlProvided}`); + smtpUrlProvided = smtpUrlProvided.includes("://") ? smtpUrlProvided : "smtp://" + smtpUrlProvided; + console.log(`Parsed Url: ${smtpUrlProvided}`); + let smtpUrl = url.parse(smtpUrlProvided, true); + + console.log(`Host: ${smtpUrl.host}`); + console.log(`HostName: ${smtpUrl.hostname}`); + console.log(`Port: ${smtpUrl.port}`); + console.log(`Protocol: ${smtpUrl.protocol}`); + + const smtpHost = smtpUrl.hostname; + let smtpPort = smtpUrl.port; + smtpPort = isNullOrUndefined(smtpUrl.port) ? 587 : smtpUrl.port; + + console.log(`Using HostName: ${smtpHost} and port: ${smtpPort}`); + + let transporter: any; + if(mailConfiguration.$smtpConfig.$enableTLS) { + transporter = nodemailer.createTransport({ + host: smtpHost, + port: smtpPort, + tls: { + maxVersion: 'TLSv1.2', + minVersion: 'TLSv1.2', + rejectUnauthorized: false + }, + requireTLS: true, + auth: { + user: mailConfiguration.$smtpConfig.$userName, + pass: mailConfiguration.$smtpConfig.$password + } + }); + } + else { + transporter = nodemailer.createTransport({ + host: smtpHost, + port: smtpPort, + auth: { + user: mailConfiguration.$smtpConfig.$userName, + pass: mailConfiguration.$smtpConfig.$password + } + }); + } + + try { + const result = await this.sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, htmlReportMessage); + console.log(`Mail Sent Successfully: ${result.response}`); + return true; + } catch(err) { + throw new MailError(err); + } + } + + private async sendMailAsync(transporter: any, + mailAddressViewModel: MailAddressViewModel, + mailConfiguration: MailConfiguration, + message: string): Promise { + return new Promise(async (resolve, reject) => { + await transporter.sendMail({ + from: mailAddressViewModel.from, + to: mailAddressViewModel.to.join(","), + cc: isNullOrUndefined(mailAddressViewModel.cc) || mailAddressViewModel.cc.length < 1 ? null : mailAddressViewModel.cc.join(","), + subject: mailConfiguration.$mailSubject, + html: message + }, + (err: any, response: any) => { + if (err){ + reject(err); + } else { + resolve(response); + } + }); + }); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/IReportSender.ts b/Tasks/emailReportTask/emailReportTaskV2/IReportSender.ts new file mode 100644 index 00000000..a6c23e56 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/IReportSender.ts @@ -0,0 +1,6 @@ +import { Report } from "./model/Report"; +import { MailConfiguration } from "./config/mail/MailConfiguration"; + +export interface IReportSender { + sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/README.md b/Tasks/emailReportTask/emailReportTaskV2/README.md new file mode 100644 index 00000000..955420ee --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/README.md @@ -0,0 +1,56 @@ +# Email Report Extension for Azure DevOps Marketplace + +Generates a Report with the information from the pipeline and sends it as email. Goal is to provide all the relevant info happened in the pipeline, in a concise and neat manner. + +Report contains: +* Overall Test Summary : This info mirrors the Test Tab in the Pipeline. +* Test Run Summary: Information about individual test runs happened in the Pipeline if any. +* Test Failures: Shows Test Failures, their stack traces (Configurable in the Task Input) and associated workitems. +* Commits/Changeset Information +* Phases/Environments Information +* Task information: Task(s) that ran in the pipeline - Name, Duration and any error logs if failed. + + +## Configuring Email Task + +The Email Task can be added to your pipeline, preferably at the end of the pipeline for the task to be able to gather data for the entire run. The email report task is present under 'Utilities' catagory. + +**Make sure that the "Always run" flag is set for the task so that you get the email report irrespective of previous tasks' outcome in the pipeline.** + +### Send Mail Configuration + +**Send Mail Condition** - You can configure when you want to receive the email. i.e, On New Failures, on Success, on Failure or Always. When on Failure is selected, we send the email only if there is a test failure or there are previous task failures. +Note: "On New Failures" is an experimental option to reduce spam in case of a continously failing pipeline. using this option, report will be sent only in the first instance of the continously failing run. Task will compare failed tasks and any failed tests between the previous run and the current run to see if failures are same or not. It doesn't compare logs, just the taskname and the test result ids that failed. If Tasks or Tests failed are same but with different errors for example, this will consider it as "Same failure" and not a new one. + +**Email Subject** - User can configure the email subject he wants to get. You can add any environment variables here which will be expanded. To add test pass percentage in the email subject, we have exposed a place holder **{passPercentage}**, which you can use in the email subject, as shown below. + +**Include in To/Cc Section** - You can dynamically add who wants to receive the email when the send mail condition is satisfied. For eg, you can configure to send email to the people who authored the commits that were tested in the current release. Or, if there are test failures, u can configure to send email to the failed test owners & active bug owners that are associated to the failing tests. + +**To/Cc** - You can add a fixed list of people who wants to recieve the email when the send mail condition is satisfied. + +![TaskConfig.png](images/TaskConfig.png) + +### Configuring Email content + +**Group Test Summary** - You can add test summary sections by Test run or Test priority. + +**Include Test Results** - If there are test failures, you can configure if you want to see the test result details. You can configure to receive failed tests & Other tests. + +**Group Test Results** - You can group the tests results shown by priority or Test run. + +**Include Commits** - Check this field to receive the commits information that are tested in the current release environment. + +![TaskConfig2.png](images/TaskConfig2.png) + +### Advanced Section + +**Maximum Test results to show** - User can set the maximum test results that they want to receive in the email report. If there are test failures more than this, it will be truncated & will be notified that the test results are truncated. + +**Include Others in Total count** - Used to configure if the others tests (NotExecuted, inconclusive etc), has to be considered as failure for calculating Pass percentage + +### SMTP Connection + +Create a "Generic" Service Connection in 'AzureDevOps' Service Connections with a Username, password and SMTP Server. Select the created endpoint from the dropdown menu in the task. +Try to use public SMTP servers - for example - “smtp.live.com” (Hotmail/Outlook.com). +SMTP credentials generic endpoint can be configured as below for example: +![GenericEndPoint.JPG](images/GenericEndPoint.png) \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/ReportManager.ts b/Tasks/emailReportTask/emailReportTaskV2/ReportManager.ts new file mode 100644 index 00000000..73964e55 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/ReportManager.ts @@ -0,0 +1,45 @@ +import { IReportProvider } from "./providers/IReportProvider"; +import { ReportConfiguration } from "./config/ReportConfiguration"; +import { ReportError } from "./exceptions/ReportError"; +import { IReportSender } from "./IReportSender"; +import { IHTMLReportCreator } from "./htmlreport/IHTMLReportCreator"; +import { MissingDataError } from "./exceptions/MissingDataError"; +import { EnumUtils } from "./utils/EnumUtils"; + +export class ReportManager { + + private reportProvider: IReportProvider; + private reportSender: IReportSender; + private htmlReportCreator: IHTMLReportCreator; + + constructor(reportProvider: IReportProvider, htmlReportCreator: IHTMLReportCreator, reportSender: IReportSender) { + this.reportProvider = reportProvider; + this.reportSender = reportSender; + this.htmlReportCreator = htmlReportCreator; + } + + public async sendReportAsync(reportConfig: ReportConfiguration): Promise { + let mailSent = false; + try { + console.log("Fetching data for email report"); + const report = await this.reportProvider.createReportAsync(reportConfig); + console.log("Created report view model"); + + if (report.$dataMissing) { + throw new MissingDataError("Unable to fetch all data for generating report. Not Sending report."); + } + else if (report.$sendMailConditionSatisfied && this.reportSender != null) { + console.log("Creating report message"); + const htmlMessage = this.htmlReportCreator.createHtmlReport(report, reportConfig); + mailSent = await this.reportSender.sendReportAsync(report, htmlMessage, reportConfig.$mailConfiguration); + } else { + console.log(`Not sending mail, as the user send mail condition - '${EnumUtils.GetMailConditionString(reportConfig.$sendMailCondition)}' is not satisfied.`); + } + } catch (err) { + // Exit Task with Error to fail the task + ReportError.HandleError(err, true); + } + + return mailSent; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/azure-devops-extensions.json b/Tasks/emailReportTask/emailReportTaskV2/azure-devops-extensions.json new file mode 100644 index 00000000..3f83bbdb --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/azure-devops-extensions.json @@ -0,0 +1,55 @@ +{ + "manifestVersion": 1, + "id": "EmailReportExtension", + "name": "Email Report Extension", + "version": "1.1.9", + "publisher": "epsteam", + "public": true, + "targets": [ + { + "id": "Microsoft.VisualStudio.Services" + } + ], + "description": "Sends Detailed email report for a build or release pipeline", + "categories": [ + "Azure Pipelines" + ], + "icons": { + "default": "images/icon.png" + }, + "tags": [], + "scopes": [], + "files": [ + { + "path": "emailReportTask" + }, + { + "path": "images", + "addressable": true + } + ], + "content": { + "details": { + "path": "README.md" + }, + "license": { + "path": "LICENSE" + } + }, + "repository": { + "type": "git", + "uri": "https://github.com/microsoft/azure-devops-engineering-extensions" + }, + "contributions": [ + { + "id": "EmailReport", + "type": "ms.vss-distributed-task.task", + "targets": [ + "ms.vss-distributed-task.tasks" + ], + "properties": { + "name": "emailReportTask" + } + } + ] +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.ts new file mode 100644 index 00000000..c151d80f --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.ts @@ -0,0 +1,169 @@ +import tl = require("azure-pipelines-task-lib"); +import { IConfigurationProvider } from "./IConfigurationProvider"; +import { TaskConstants } from "./TaskConstants"; +import { SendMailCondition } from "./report/SendMailCondition"; +import { MailConfiguration } from "./mail/MailConfiguration"; +import { RecipientsConfiguration } from "./mail/RecipientsConfiguration"; +import { SmtpConfiguration } from "./mail/SmtpConfiguration"; +import { InputError } from "../exceptions/InputError"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; +import { TestResultsConfiguration } from "./report/TestResultsConfiguration"; +import { GroupTestResultsBy } from "./report/GroupTestResultsBy"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +import { PipelineType } from "./pipeline/PipelineType"; +import { StringUtils } from "../utils/StringUtils"; +import { isNullOrUndefined } from "util"; + +export class ConfigurationProvider implements IConfigurationProvider { + private pipelineConfiguration: PipelineConfiguration; + private mailConfiguration: MailConfiguration; + private reportDataConfiguration: ReportDataConfiguration; + private sendMailCondition: SendMailCondition; + + constructor() { + this.initPipelineConfiguration(); + this.initMailConfiguration(); + this.initReportDataConfiguration(); + this.initSendMailCondition(); + } + + getPipelineConfiguration(): PipelineConfiguration { + return this.pipelineConfiguration; + } + getMailConfiguration(): MailConfiguration { + return this.mailConfiguration; + } + getReportDataConfiguration(): ReportDataConfiguration { + return this.reportDataConfiguration; + } + getSendMailCondition(): SendMailCondition { + return this.sendMailCondition; + } + + /** + * Gets access token from system + */ + private getAccessKey(): string { + return tl.getEndpointAuthorizationParameter( + TaskConstants.VSS_CONNECTION_KEY, + TaskConstants.ACCESS_PARAMETER, + false + ); + } + + private initPipelineConfiguration(): void { + const hostType = tl.getVariable(TaskConstants.HOST_KEY); + const pipelineType = hostType == "build" ? PipelineType.Build : PipelineType.Release; + const pipelineIdKey = pipelineType == PipelineType.Build ? TaskConstants.BUILD_ID_KEY : TaskConstants.RELEASE_ID_KEY; + + const pipelineId = Number(tl.getVariable(pipelineIdKey)); + const projectId = tl.getVariable(TaskConstants.PROJECTID_KEY); + const projectName = tl.getVariable(TaskConstants.PROJECTNAME_KEY); + + const envId = Number(tl.getVariable(TaskConstants.ENVIRONMENTID_KEY)); + const envDefId = Number(tl.getVariable(TaskConstants.ENVIRONMENTDEFID_KEY)); + + const usePrevEnvironment = tl.getBoolInput(TaskConstants.USEPREVENV_INPUTKEY); + const teamUri = tl.getVariable(TaskConstants.TEAM_FOUNDATION_KEY) + this.pipelineConfiguration = new PipelineConfiguration(pipelineType, pipelineId, projectId, projectName, envId, envDefId, usePrevEnvironment, teamUri, this.getAccessKey()); + } + + private initMailConfiguration(): void { + const smtpConnectionId = tl.getInput(TaskConstants.SMTPCONNECTION_INPUTKEY, true); + const endPointScheme = tl.getEndpointAuthorizationScheme(smtpConnectionId, true); + if (endPointScheme != "UsernamePassword") { + throw new InputError(`Incorrect EndPoint Scheme Provided - '${endPointScheme}'. Only UserName and Password type Endpoints allowed.`); + } + + const smtpHost = tl.getEndpointUrl(smtpConnectionId, true).replace(/(^\w+:|^)\/\//, '').replace(/\/$/, ''); + const userName = tl.getEndpointAuthorizationParameter(smtpConnectionId, "UserName", true); + const password = tl.getEndpointAuthorizationParameter(smtpConnectionId, "Password", true); + const enableTLS = tl.getBoolInput(TaskConstants.ENABLETLS_INPUTKEY, true); + + const smtpConfig = new SmtpConfiguration(userName, password, smtpHost, enableTLS); + + // Mail Subject + const mailSubject = tl.getInput(TaskConstants.SUBJECT_INPUTKEY, true); + if (StringUtils.isNullOrWhiteSpace(mailSubject)) + { + throw new InputError("Email subject not set"); + } + + // Optional inputs + const toAddresses = tl.getInput(TaskConstants.TOADDRESS_INPUTKEY, false); + const ccAddresses = tl.getInput(TaskConstants.CCADDRESS_INPUTKEY, false); + const includeInToAddressesConfig = tl.getInput(TaskConstants.INCLUDEINTO_INPUTKEY, false); + const includeInCCAddressesConfig = tl.getInput(TaskConstants.INCLUDEINCC_INPUTKEY, false); + + // Addresses Configuration + const toRecipientsConfiguration = this.getRecipientConfiguration(toAddresses, includeInToAddressesConfig); + const ccRecipientsConfiguration = this.getRecipientConfiguration(ccAddresses, includeInCCAddressesConfig); + + const defaultDomain = tl.getInput(TaskConstants.DEFAULTDOMAIN_INPUTKEY, true); + + this.mailConfiguration = new MailConfiguration(mailSubject, toRecipientsConfiguration, ccRecipientsConfiguration, smtpConfig, defaultDomain); + } + + private initReportDataConfiguration(): void { + // required inputs + const groupResultsBy = this.getGroupTestResultsByEnumFromString(tl.getInput(TaskConstants.GROUPTESTRESULTSBY_INPUTKEY, true)); + const includeOthersInTotal = tl.getBoolInput(TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY, true); + const maxTestFailuresToShow = Number(tl.getInput(TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, true)); + const includeCommits = tl.getBoolInput(TaskConstants.INCLUDECOMMITS_INPUTKEY, true); + + // optional inputs + const includeResultsStr = tl.getInput(TaskConstants.INCLUDERESULTS_INPUTKEY, false); + const groupTestSummaryByStr = tl.getInput(TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY, false); + + const groupTestSummaryBy: Array = new Array(); + if (!isNullOrUndefined(groupTestSummaryByStr)) { + (groupTestSummaryByStr as string).split(",").forEach(element => { groupTestSummaryBy.push(this.getGroupTestResultsByEnumFromString(element)) }); + } + + // derived input values + const includeResultsConfig = isNullOrUndefined(includeResultsStr) ? [] : includeResultsStr.split(","); + const includeFailedTests = includeResultsConfig.includes("1"); + const includeOtherTests = includeResultsConfig.includes("2"); + const includePassedTests = includeResultsConfig.includes("3"); + const includeInconclusiveTests = includeResultsConfig.includes("4"); + const includeNotExecutedTests = includeResultsConfig.includes("5"); + + const testResultsConfig = new TestResultsConfiguration(includeFailedTests, includePassedTests, includeInconclusiveTests, includeNotExecutedTests, includeOtherTests, groupResultsBy, maxTestFailuresToShow); + + this.reportDataConfiguration = new ReportDataConfiguration(includeCommits, includeOthersInTotal, true, groupTestSummaryBy, testResultsConfig); + } + + initSendMailCondition(): void { + const sendMailConditionStr = tl.getInput(TaskConstants.SENDMAILCONDITION_INPUTKEY); + let sendMailCondition: SendMailCondition; + switch (sendMailConditionStr) { + case "On Failure": sendMailCondition = SendMailCondition.OnFailure; break; + case "On Success": sendMailCondition = SendMailCondition.OnSuccess; break; + case "On New Failures Only": sendMailCondition = SendMailCondition.OnNewFailuresOnly; break; + default: sendMailCondition = SendMailCondition.Always; break; + } + this.sendMailCondition = sendMailCondition; + } + + private getRecipientConfiguration(namedRecipients: string, includeConfigStr: string): RecipientsConfiguration { + if (includeConfigStr != null) { + const includeConfig = includeConfigStr.split(","); + const includeChangesetOwners = includeConfig.includes("1"); + const includeTestOwners = includeConfig.includes("2"); + const includeActiveBugOwners = includeConfig.includes("3"); + const includeCreatedBy = includeConfig.includes("4"); + + return new RecipientsConfiguration(namedRecipients, includeChangesetOwners, includeTestOwners, includeActiveBugOwners, includeCreatedBy); + } + + return new RecipientsConfiguration(namedRecipients); + } + + private getGroupTestResultsByEnumFromString(groupResultsByStr: string): GroupTestResultsBy { + switch (groupResultsByStr) { + case "Priority": return GroupTestResultsBy.Priority; + case "Team": return GroupTestResultsBy.Team; + default: return GroupTestResultsBy.Run; + } + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.ts new file mode 100644 index 00000000..ab88722d --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.ts @@ -0,0 +1,16 @@ +import { SendMailCondition } from "./report/SendMailCondition"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +import { MailConfiguration } from "./mail/MailConfiguration"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; + +export interface IConfigurationProvider { + + getPipelineConfiguration(): PipelineConfiguration; + + getMailConfiguration(): MailConfiguration; + + getReportDataConfiguration(): ReportDataConfiguration; + + getSendMailCondition(): SendMailCondition; + +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.ts new file mode 100644 index 00000000..5f260419 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.ts @@ -0,0 +1,69 @@ +import { MailConfiguration } from "./mail/MailConfiguration"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; +import { IConfigurationProvider } from "./IConfigurationProvider"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +import { SendMailCondition } from "./report/SendMailCondition"; +import { InputError } from "../exceptions/InputError"; +import { TaskConstants } from "./TaskConstants"; +import { StringUtils } from "../utils/StringUtils"; + +export class ReportConfiguration { + private sendMailCondition: SendMailCondition; + private mailConfiguration: MailConfiguration; + private reportDataConfiguration: ReportDataConfiguration; + private pipelineConfiguration: PipelineConfiguration; + + constructor(configProvider: IConfigurationProvider) { + this.sendMailCondition = configProvider.getSendMailCondition(); + this.mailConfiguration = configProvider.getMailConfiguration(); + this.reportDataConfiguration = configProvider.getReportDataConfiguration(); + this.pipelineConfiguration = configProvider.getPipelineConfiguration(); + } + + validateConfiguration() { + if (this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow <= 0) { + this.throwError(TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow, "be > 0"); + } + + this.validateMailConfig(); + } + + private validateMailConfig() { + if (StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$mailSubject)) { + this.throwError(TaskConstants.SUBJECT_INPUTKEY, this.mailConfiguration.$mailSubject, "be specified"); + } + + if (StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$smtpHost)) { + this.throwError(TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$smtpHost, "specify SMTP Host URL"); + } + + if (StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$userName)) { + this.throwError(TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$userName, "specify SMTP UserName"); + } + + if (StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$password)) { + this.throwError(TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$password, "specify SMTP Password"); + } + } + + // Getters + public get $sendMailCondition(): SendMailCondition { + return this.sendMailCondition; + } + + public get $mailConfiguration(): MailConfiguration { + return this.mailConfiguration; + } + + public get $reportDataConfiguration(): ReportDataConfiguration { + return this.reportDataConfiguration; + } + + public get $pipelineConfiguration(): PipelineConfiguration { + return this.pipelineConfiguration; + } + + private throwError(prefix: string, suffix: any, expectation: string) { + throw new InputError(`${prefix} should ${expectation}. Actual Input value: '${suffix}'`); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.ts b/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.ts new file mode 100644 index 00000000..f8182ecb --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.ts @@ -0,0 +1,33 @@ +export class TaskConstants { + public static readonly SUBJECT_INPUTKEY = "subject"; + public static readonly SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; + public static readonly INCLUDECOMMITS_INPUTKEY = "includeCommits"; + public static readonly GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; + public static readonly INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; + public static readonly MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; + public static readonly GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; + public static readonly INCLUDERESULTS_INPUTKEY = "includeResultsStr"; + public static readonly TOADDRESS_INPUTKEY = "toAddress"; + public static readonly CCADDRESS_INPUTKEY = "ccAddress"; + public static readonly INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; + public static readonly INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; + public static readonly SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; + // Inputkey value should be "enableTLS" - however changing that will break the task for everyone. See task.dev.json or task.prod.json for the confusion. + // For now -inputkey has to be enableSSL... until AzureDevOps marketplace supports a way to rename params in json + public static readonly ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; + public static readonly USEPREVENV_INPUTKEY = "usePreviousEnvironment"; + public static readonly DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; + + public static readonly TEAM_FOUNDATION_KEY: string = + "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"; + public static readonly VSS_CONNECTION_KEY: string = "SYSTEMVSSCONNECTION"; + public static readonly ACCESS_PARAMETER: string = "ACCESSTOKEN"; + public static readonly PROJECTNAME_KEY: string = "SYSTEM_TEAMPROJECT"; + public static readonly PROJECTID_KEY: string = "SYSTEM_TEAMPROJECTID"; + public static readonly BUILD_ID_KEY: string = "BUILD_BUILDID"; + public static readonly RELEASE_ID_KEY: string = "RELEASE_RELEASEID"; + public static readonly HOST_KEY: string = "SYSTEM_HOSTTYPE"; + + public static readonly ENVIRONMENTID_KEY: string = "RELEASE_ENVIRONMENTID"; + public static readonly ENVIRONMENTDEFID_KEY: string = "RELEASE_DEFINITIONENVIRONMENTID"; +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.ts new file mode 100644 index 00000000..d47a9b10 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.ts @@ -0,0 +1,68 @@ +import { RecipientsConfiguration } from "./RecipientsConfiguration"; +import { SmtpConfiguration } from "./SmtpConfiguration"; + +export class MailConfiguration { + + private mailSubject: string; + private toRecipientsConfig: RecipientsConfiguration; + private ccRecipientsConfig: RecipientsConfiguration; + private smtpConfig: SmtpConfiguration; + private defaultDomain: string; + + constructor($mailSubject: string, $toRecipientsConfig: RecipientsConfiguration, $ccRecipientsConfig: RecipientsConfiguration, $smtpConfig: SmtpConfiguration, $defaultDomain: string) { + this.mailSubject = $mailSubject; + this.toRecipientsConfig = $toRecipientsConfig; + this.ccRecipientsConfig = $ccRecipientsConfig; + this.smtpConfig = $smtpConfig; + this.defaultDomain = $defaultDomain; + } + + /** + * Getter $defaultDomain + * @return {string} + */ + public get $defaultDomain(): string { + return this.defaultDomain; + } + + /** + * Getter $mailSubject + * @return {string} + */ + public get $mailSubject(): string { + return this.mailSubject; + } + + /** + * Getter $ccRecipientsConfig + * @return {RecipientsConfiguration} + */ + public get $ccRecipientsConfig(): RecipientsConfiguration { + return this.ccRecipientsConfig; + } + + /** + * Getter $smtpConfig + * @return {SmtpConfiguration} + */ + public get $smtpConfig(): SmtpConfiguration { + return this.smtpConfig; + } + + /** + * Getter $toRecipientsConfig + * @return {RecipientsConfiguration} + */ + public get $toRecipientsConfig(): RecipientsConfiguration { + return this.toRecipientsConfig; + } + + /** + * Setter $mailSubject + * @param {string} value + */ + public set $mailSubject(value: string) { + this.mailSubject = value; + } + +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.ts new file mode 100644 index 00000000..56713a58 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.ts @@ -0,0 +1,55 @@ +export class RecipientsConfiguration { + private defaultRecipients: string; + private includeChangesetOwners: boolean; + private includeTestOwners: boolean; + private includeActiveBugOwners: boolean; + private includeCreatedBy: boolean; + + constructor($defaultRecipients: string, $includeChangesetOwners?: boolean, $includeTestOwners?: boolean, $includeActiveBugOwners?: boolean, $includeCreatedBy?: boolean) { + this.defaultRecipients = $defaultRecipients; + this.includeChangesetOwners = $includeChangesetOwners; + this.includeTestOwners = $includeTestOwners; + this.includeActiveBugOwners = $includeActiveBugOwners; + this.includeCreatedBy = $includeCreatedBy; + } + + /** + * Getter $defaultRecipients + * @return {string} + */ + public get $defaultRecipients(): string { + return this.defaultRecipients; + } + + /** + * Getter $includeChangesetOwners + * @return {boolean} + */ + public get $includeChangesetOwners(): boolean { + return this.includeChangesetOwners; + } + + /** + * Getter $includeTestOwners + * @return {boolean} + */ + public get $includeTestOwners(): boolean { + return this.includeTestOwners; + } + + /** + * Getter $includeActiveBugOwners + * @return {boolean} + */ + public get $includeActiveBugOwners(): boolean { + return this.includeActiveBugOwners; + } + + /** + * Getter $includeCreatedBy + * @return {boolean} + */ + public get $includeCreatedBy(): boolean { + return this.includeCreatedBy; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.ts new file mode 100644 index 00000000..0fa59c24 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.ts @@ -0,0 +1,45 @@ +export class SmtpConfiguration { + private userName: string; + private password: string; + private smtpHost: string; + private enableTLS: boolean; + + constructor($userName: string, $password: string, $smtpHost: string, $enableTLS: boolean) { + this.userName = $userName; + this.password = $password; + this.smtpHost = $smtpHost; + this.enableTLS = $enableTLS; + } + + /** + * Getter $userName + * @return {string} + */ + public get $userName(): string { + return this.userName; + } + + /** + * Getter $password + * @return {string} + */ + public get $password(): string { + return this.password; + } + + /** + * Getter $smtpHost + * @return {string} + */ + public get $smtpHost(): string { + return this.smtpHost; + } + + /** + * Getter $enableSSL + * @return {boolean} + */ + public get $enableTLS(): boolean { + return this.enableTLS; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts new file mode 100644 index 00000000..f1938786 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts @@ -0,0 +1,118 @@ +import { PipelineType } from "./PipelineType"; +import { LinkHelper } from "../../model/helpers/LinkHelper"; + +export class PipelineConfiguration { + private pipelineType: PipelineType; + private pipelineId: number; + private projectId: string; + private projectName: string; + private environmentId: number; + private environmentDefinitionId: number; + private usePreviousEnvironment: boolean; + private teamUri: string; + private accessKey: string; + private testTabLink: string; + + constructor($pipelineType: PipelineType, + $pipelineId: number, + $projectId: string, + $projectName: string, + $environmentId: number, + $environmentDefinitionId: number, + $usePreviousEnvironment: boolean, + $teamUri: string, + $accessKey: string) { + this.pipelineType = $pipelineType; + this.pipelineId = $pipelineId; + this.projectId = $projectId; + this.projectName = $projectName; + this.environmentId = $environmentId; + this.environmentDefinitionId = $environmentDefinitionId; + this.usePreviousEnvironment = $usePreviousEnvironment; + this.teamUri = $teamUri; + this.accessKey = $accessKey; + } + + /** + * Getter $pipelineId + * @return {number} + */ + public get $pipelineType(): number { + return this.pipelineType; + } + + /** + * Getter $pipelineId + * @return {number} + */ + public get $pipelineId(): number { + return this.pipelineId; + } + + /** + * Getter $projectId + * @return {string} + */ + public get $projectId(): string { + return this.projectId; + } + + /** + * Getter $projectName + * @return {string} + */ + public get $projectName(): string { + return this.projectName; + } + + /** + * Getter $environmentId + * @return {number} + */ + public get $environmentId(): number { + return this.environmentId; + } + + /** + * Getter $environmentDefinitionId + * @return {number} + */ + public get $environmentDefinitionId(): number { + return this.environmentDefinitionId; + } + + /** +* Getter $usePreviousEnvironment +* @return {boolean} +*/ + public get $usePreviousEnvironment(): boolean { + return this.usePreviousEnvironment; + } + + /** + * Getter $teamUri + * @return {string} + */ + public get $teamUri(): string { + return this.teamUri; + } + + /** + * Getter $accessKey + * @return {string} + */ + public get $accessKey(): string { + return this.accessKey; + } + + public getTestTabLink(): string { + if (this.testTabLink == null) { + if (this.pipelineType == PipelineType.Release) { + this.testTabLink = LinkHelper.getTestTabLinkInRelease(this); + } else if (this.pipelineType == PipelineType.Build) { + this.testTabLink = LinkHelper.getTestTabLinkInBuild(this); + } + } + return this.testTabLink; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.ts b/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.ts new file mode 100644 index 00000000..4f2d5a88 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.ts @@ -0,0 +1,4 @@ +export enum PipelineType { + Build, + Release +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.ts b/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.ts new file mode 100644 index 00000000..0bcd1a85 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.ts @@ -0,0 +1,5 @@ +export enum GroupTestResultsBy { + Priority = 0, + Run, + Team +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.ts new file mode 100644 index 00000000..ff0828e5 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.ts @@ -0,0 +1,63 @@ +import { GroupTestResultsBy } from "./GroupTestResultsBy"; +import { TestResultsConfiguration } from "./TestResultsConfiguration"; + +export class ReportDataConfiguration { + // Determines which data to include in the Report + private includeCommits: boolean; + private includeOthersInTotal: boolean; + private includeEnvironmentInfo: boolean; + + // Report Summary Pane Grouping + private groupTestSummaryBy: GroupTestResultsBy[]; + + // Determines how to show Test Results in the Report + private testResultsConfig: TestResultsConfiguration; + + constructor($includeCommits: boolean, $includeOthersInTotal: boolean, $includeEnvironmentInfo: boolean, $groupTestSummaryBy: GroupTestResultsBy[], $testResultsConfig: TestResultsConfiguration) { + this.includeCommits = $includeCommits; + this.includeOthersInTotal = $includeOthersInTotal; + this.includeEnvironmentInfo = $includeEnvironmentInfo; + this.groupTestSummaryBy = $groupTestSummaryBy; + this.testResultsConfig = $testResultsConfig; + } + + /** + * Getter $includeCommits + * @return {boolean} + */ + public get $includeCommits(): boolean { + return this.includeCommits; + } + + /** + * Getter $includeOthersInTotal + * @return {boolean} + */ + public get $includeOthersInTotal(): boolean { + return this.includeOthersInTotal; + } + + /** + * Getter $includeEnvironmentInfo + * @return {boolean} + */ + public get $includeEnvironmentInfo(): boolean { + return this.includeEnvironmentInfo; + } + + /** + * Getter $groupTestSummaryBy + * @return {GroupTestResultsBy[]} + */ + public get $groupTestSummaryBy(): GroupTestResultsBy[] { + return this.groupTestSummaryBy; + } + + /** + * Getter $testResultsConfig + * @return {TestResultsConfiguration} + */ + public get $testResultsConfig(): TestResultsConfiguration { + return this.testResultsConfig; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.ts b/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.ts new file mode 100644 index 00000000..785c1178 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.ts @@ -0,0 +1,6 @@ +export enum SendMailCondition { + Always = 0, + OnFailure, + OnSuccess, + OnNewFailuresOnly +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.ts new file mode 100644 index 00000000..6f4d1969 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.ts @@ -0,0 +1,77 @@ +import { GroupTestResultsBy } from "./GroupTestResultsBy"; + +export class TestResultsConfiguration { + private includeFailedTests: boolean; + private includePassedTests: boolean; + private includeInconclusiveTests: boolean; + private includeNotExecutedTests: boolean; + private includeOtherTests: boolean; + private groupTestResultsBy: GroupTestResultsBy; + private maxItemsToShow: number; + + constructor($includeFailedTests: boolean, $includePassedTests: boolean, $includeInconclusiveTests: boolean, $includeNotExecutedTests: boolean, $includeOtherTests: boolean, $groupTestResultsBy: GroupTestResultsBy, $maxItemsToShow: number) { + this.includeFailedTests = $includeFailedTests; + this.includePassedTests = $includePassedTests; + this.includeInconclusiveTests = $includeInconclusiveTests; + this.includeNotExecutedTests = $includeNotExecutedTests; + this.includeOtherTests = $includeOtherTests; + this.groupTestResultsBy = $groupTestResultsBy; + this.maxItemsToShow = $maxItemsToShow; + } + + /** + * Getter $includeFailedTests + * @return {boolean} + */ + public get $includeFailedTests(): boolean { + return this.includeFailedTests; + } + + /** + * Getter $includePassedTests + * @return {boolean} + */ + public get $includePassedTests(): boolean { + return this.includePassedTests; + } + + /** + * Getter $includeInconclusiveTests + * @return {boolean} + */ + public get $includeInconclusiveTests(): boolean { + return this.includeInconclusiveTests; + } + + /** + * Getter $includeNotExecutedTests + * @return {boolean} + */ + public get $includeNotExecutedTests(): boolean { + return this.includeNotExecutedTests; + } + + /** + * Getter $includeOtherTests + * @return {boolean} + */ + public get $includeOtherTests(): boolean { + return this.includeOtherTests; + } + + /** + * Getter $groupTestResultsBy + * @return {GroupTestResultsBy} + */ + public get $groupTestResultsBy(): GroupTestResultsBy { + return this.groupTestResultsBy; + } + + /** + * Getter $maxItemsToShow + * @return {number} + */ + public get $maxItemsToShow(): number { + return this.maxItemsToShow; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.ts b/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.ts new file mode 100644 index 00000000..daabd62e --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.ts @@ -0,0 +1,8 @@ +import { ReportError } from "./ReportError"; + +export class DataProviderError extends ReportError { + constructor(message: string) { + super(message); + this.name = DataProviderError.name; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.ts b/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.ts new file mode 100644 index 00000000..c8a18084 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.ts @@ -0,0 +1,8 @@ +import { ReportError } from "./ReportError"; + +export class InputError extends ReportError { + constructor(message: string) { + super(message); + this.name = InputError.name; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts b/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts new file mode 100644 index 00000000..b6b34282 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts @@ -0,0 +1,8 @@ +import { ReportError } from "./ReportError"; + +export class InvalidTestResultDataError extends ReportError { + constructor(message: string) { + super(message); + this.name = InvalidTestResultDataError.name; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.ts b/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.ts new file mode 100644 index 00000000..b5654e74 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.ts @@ -0,0 +1,8 @@ +import { ReportError } from "./ReportError"; + +export class MailError extends ReportError { + constructor(message: string) { + super(message); + this.name = MailError.name; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.ts b/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.ts new file mode 100644 index 00000000..094f22e3 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.ts @@ -0,0 +1,8 @@ +import { ReportError } from "./ReportError"; + +export class MissingDataError extends ReportError { + constructor(message: string) { + super(message); + this.name = MissingDataError.name; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.ts b/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.ts new file mode 100644 index 00000000..5b94d670 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.ts @@ -0,0 +1,8 @@ +import { ReportError } from "./ReportError"; + +export class PipelineNotFoundError extends ReportError { + constructor(message: string) { + super(message); + this.name = "PipelineNotFoundError"; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.ts b/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.ts new file mode 100644 index 00000000..817564fe --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.ts @@ -0,0 +1,8 @@ +import { ReportError } from "./ReportError"; + +export class PostProcessorError extends ReportError { + constructor(message: string) { + super(message); + this.name = PostProcessorError.name; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.ts b/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.ts new file mode 100644 index 00000000..e30bc664 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.ts @@ -0,0 +1,26 @@ +import { isNullOrUndefined } from "util"; + +export abstract class ReportError extends Error { + public innerError: any; + constructor(message: string) { + super(message); + } + + public getMessage(): string { + const stack = isNullOrUndefined(this.innerError) || isNullOrUndefined(this.innerError.stack) ? this.stack : + `${this.stack}\r\nInnerError:${this.innerError.message}: ${this.innerError.stack}` + return `${this.name}: ${this.message}\r\n ${stack}`; + } + + public static HandleError(err: Error, rethrow: boolean = false): void { + if(err instanceof ReportError) { + console.error((err as ReportError).getMessage()); + } else { + console.error(err); + } + + if(rethrow) { + throw err; + } + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/htmlreport/EmailTemplate.xslt b/Tasks/emailReportTask/emailReportTaskV2/htmlreport/EmailTemplate.xslt new file mode 100644 index 00000000..6f74a03a --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/htmlreport/EmailTemplate.xslt @@ -0,0 +1,1470 @@ + + + + + + + + + + + <xsl:value-of select="EmailReportViewModel/Title" /> + + + + +
+ +
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + padding: 20px 30px 30px 30px;color: black;border-bottom: 2px solid #e8e8e8;background:#fff1f0; + + padding: 20px 30px 30px 30px;color: black;border-bottom: 2px solid #e8e8e8;background:#ebffeb; + + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
Build + + + + + + + on branch + +
Build + + + + + + + on branch + +
Release environment + + + + + + + of + + + + + + +
+
+ + + + + + +
+ + + + + +
+ + + + + + +
+ + + + + View all results + + +
+
+
+
+ +
+
+
+ +
+ + + + + + + + + + + +
+ +
+ Test results are truncated. + + + + + + View all results + + +
+
+ +
+ +
+ +
+ Failed to get all data for the email report. Please look at the Email Report task log under + + + + + + + build logs. + + + + + + + + + release logs. + + + +
+ + + + + + + +
+ We sent you this notification based on the configuration in the + + build - + + of definition - + + + + + + + + + release environment - + + of release definition - + + + + + + + + . +
+
+ +
+
+ + +
+ + + + + + + + + +
+
+
+ + + + + + + failed +
+ +
+ + + + + + + + + +
+
+
+ + + + + + + passed +
+ +
+ + + + + + + + + + + + + + + + +
+ Summary by + + + Tests + + Pass rate + + Duration +
+ + + + / + + Passed + + + + +
+
+ + + + + + + + + +
+ Test Results for + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + +
+
+ +
+
+
+
+
+
+ + + + + + + + + New + + + + +
+ + + Failing since + + + + + + + + + + + + + + + + + on + + + + + Owner: + + + + + + +
+ Owner: + +
+ +
+
Stack trace
+
+ +
+
+
+ Associated Bugs +
+ + + + + + +
+ +
+
+ + + + +
+ + + + + +
+ + + + + + +
+ + + + + Create Bug + + +
+
+
+
+ + +
+ + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + color: rgb(0, 122, 204);font-size:18px;padding:0px + + + + + color: rgb(255, 157, 0);font-size:18px;padding:0px + + + + + rgb(51, 153, 51);font-size:18px;padding:0px + + + + ● + + + +
+
+ +
+ + + Unassigned + + + Assigned to + + +
+
+ + + + + + + + + + + + + + +
TOTAL TESTSFAILED TESTSPASS RATEDURATION
+ + + + + + +
+ + + + + + + + + + + + + + + +
+ + Passed
+ + Failed
+ + Others
+
+
+ + + + + + +
+ +
+
+ + + + + +
+
+ + + + + + +
+ + + + +
+ +
+
+ +
+
+ + + + + + + +
+ + + + + +
+ + + +
+
+ +
+
+
+ + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +
+
+ +
🕓
+
+ +
+
+ +
+
+ +
+
+
+
+ + + +
+ +
+ +
+ + + + + + + + + + + + Step completed with + + errors and + + warnings + +
+ + + + + +
+ + +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + +
+ New commits tested since last results +
+ + + + + + + +
+ + + + + Commit + + + by + + on + +
+ +
+
+
+
\ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.ts b/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.ts new file mode 100644 index 00000000..a0ea3e5c --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.ts @@ -0,0 +1,34 @@ +import { EmailReportViewModel } from '../model/viewmodel/EmailReportViewModel'; +import { IHTMLReportCreator } from './IHTMLReportCreator'; +import { Report } from '../model/Report'; +import { ReportConfiguration } from '../config/ReportConfiguration'; +const fs = require("fs"); +const o2x = require('object-to-xml'); +const xsltProcessor = require("xslt-processor"); +const { xmlParse, xsltProcess } = xsltProcessor; + +export class HTMLReportCreator implements IHTMLReportCreator { + + createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string { + const currDir = __dirname; + console.log(`CurrentDir: ${currDir}`); + var xsltTemplatePath = `${currDir}\\EmailTemplate.xslt`; + console.log("Loading Email Template: " + xsltTemplatePath); + + // Create a view model object before serialize to xml + const reportViewModel = new EmailReportViewModel(report, reportConfiguration); + // Serialize gathered data into xml + const xmlString: string = "" + o2x(reportViewModel) + ""; + // Read XSLT email template + const buffer = fs.readFileSync(xsltTemplatePath); + // Parse the xml string as XmlDocument/Node + const xmlDoc = xmlParse(xmlString, "text/xml"); + // Parse XSLT as XMLDocument + const xsltDoc = xmlParse(buffer.toString(), "application/xml"); + // Fill the XSLT document template with the xml doc data + let outXmlString = xsltProcess(xmlDoc, xsltDoc); + // XML parsing changes
to special chars if they are part of xml nodevalues. Do string replace to fix the jankiness for HTML. + outXmlString = outXmlString.split("<br/>").join("
"); + return outXmlString; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts b/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts new file mode 100644 index 00000000..3123af84 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts @@ -0,0 +1,6 @@ +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; + +export interface IHTMLReportCreator { + createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/images/GenericEndPoint.png b/Tasks/emailReportTask/emailReportTaskV2/images/GenericEndPoint.png new file mode 100644 index 0000000000000000000000000000000000000000..4baa05e31687e68e8000f6fae654f237e494e3fa GIT binary patch literal 43334 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 Ggx>);mBsh~ literal 0 HcmV?d00001 diff --git a/Tasks/emailReportTask/emailReportTaskV2/images/TaskConfig.png b/Tasks/emailReportTask/emailReportTaskV2/images/TaskConfig.png new file mode 100644 index 0000000000000000000000000000000000000000..c26d1bbc742978d43ec3e46a5aafa7e6bece8bd0 GIT binary patch literal 112368 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

dkU!LL#f7eW6%Tne(F46BfVI5|U6r(i> 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 PzYZ)BiJ0bzsy06?LwrG~uLsDGK9>{@my*biJQ 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 { + try { + + console.log('Node Version: ' + process.version); + + const configProvider = new ConfigurationProvider(); + const reportConfiguration = new ReportConfiguration(configProvider); + const reportProvider = new ReportProvider(new DataProviderFactory(configProvider.getPipelineConfiguration())); + + // Log telemetry: Task Inputs and Configuration + TelemetryLogger.LogTaskConfig(reportConfiguration); + + const reportManager = new ReportManager( + reportProvider, + new HTMLReportCreator(), + new EmailSender()); + + const mailSent = await reportManager.sendReportAsync(reportConfiguration); + if(mailSent) { + // Wait for 10 sec and timeout + let val = await Promise.race([sleep(10000), setEmailSentVariable(mailSent)]); + if(!val) { + console.log("Unable to set variable value in 10 sec. Exiting task."); + } + } + } + catch (err) { + if (err instanceof ReportError) { + console.log(err.getMessage()); + } else { + console.log(err); + } + // Fail task + throw err; + } + finally { + console.log("Task Processing Complete."); + } +} + +function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms, false)); +} + +async function setEmailSentVariable(mailSent: boolean) : Promise { + console.log("Setting EmailReportTask.EmailSent Variable value."); + console.log(`##vso[task.setvariable variable=EmailReportTask.EmailSent;]${mailSent}`); + console.log(`EmailReportTask.EmailSent Variable value set as ${mailSent}`); + return true; +} + +run(); \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.ts b/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.ts new file mode 100644 index 00000000..fdea3368 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.ts @@ -0,0 +1,106 @@ +import { Build, Timeline, TaskResult, TimelineRecord } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { Report } from "./Report"; +import { isNullOrUndefined } from "util"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { PipelineType } from "../config/pipeline/PipelineType"; +import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; +import { PhaseModel } from "./PhaseModel"; +import { ChangeModel } from "./ChangeModel"; + +export class BuildReport extends Report { + private build: Build; + private timeline: Timeline; + private lastCompletedBuild: Build; + private lastCompletedTimeline: Timeline; + + setBuildData($build: Build, $timeline: Timeline, $lastCompletedBuild: Build, $lastCompletedTimeline: Timeline, $phases: PhaseModel[], $changes: ChangeModel[]) { + this.build = $build; + this.timeline = $timeline; + this.lastCompletedBuild = $lastCompletedBuild; + this.lastCompletedTimeline = $lastCompletedTimeline; + this.phases = $phases; + this.associatedChanges = $changes; + } + + public hasPrevGotSameFailures(): boolean { + if (this.lastCompletedBuild == null) { + return false; + } + console.log(`Using Last Completed Build: '${this.lastCompletedBuild.id}'.`); + + if (this.lastCompletedBuild.id > this.build.id) { + // We are in a situation where current build completed latter compared to the newer one + // Newer one would have already evaluated the failures and sent a mail to committers anyway + // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer + // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line + return true; + } + + return null; + } + + public hasFailedTasks(): boolean { + return this.timelineHasFailedTasks(this.timeline); + } + + public hasPrevFailedTasks(): boolean { + return this.timelineHasFailedTasks(this.lastCompletedTimeline); + } + + public arePrevFailedTasksSame(): boolean { + var prevfailedTask = this.getTasksByResultinTimeline(this.lastCompletedTimeline, TaskResult.Failed)[0]; + var currentFailedTask = this.getTasksByResultinTimeline(this.timeline, TaskResult.Failed)[0]; + + // if both releases failed without executing any tasks, then they can be null + // otherwise, use name matching + return (prevfailedTask == null && currentFailedTask == null) + || (!isNullOrUndefined(prevfailedTask) && !isNullOrUndefined(currentFailedTask) && prevfailedTask.name.toLowerCase() == currentFailedTask.name.toLowerCase()); + } + + public getPrevConfig(config: PipelineConfiguration): PipelineConfiguration { + var buildConfig = new PipelineConfiguration(PipelineType.Build, + this.lastCompletedBuild.id, + config.$projectId, + config.$projectName, + null, + null, + config.$usePreviousEnvironment, + config.$teamUri, + config.$accessKey); + + return buildConfig; + } + + public getEnvironmentStatus(): string { + if (this.hasFailedTasks()) { + return "Failed"; + } + else if (this.getTasksByResultinTimeline(this.timeline, TaskResult.SucceededWithIssues).length > 0) { + return "Partially Succeeded"; + } + else { + return "Succeeded"; + } + } + + public getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel { + return new BuildReferenceViewModel(config, null, this.build); + } + + public getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[] { + return []; + } + + public hasCanceledPhases(): boolean { + return false; + } + + private timelineHasFailedTasks(timeLine: Timeline): boolean { + return this.getTasksByResultinTimeline(timeLine, TaskResult.Failed).length > 0; + } + + private getTasksByResultinTimeline(timeLine: Timeline, taskResult: TaskResult): TimelineRecord[] { + return this.timeline == null || this.timeline.records == null ? [] : this.timeline.records.filter(r => r.result == taskResult); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.ts new file mode 100644 index 00000000..b30c11d4 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.ts @@ -0,0 +1,58 @@ +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; + +export class ChangeModel { + + private id: string; + private author: IdentityRef; + private location: string; + private timeStamp: Date; + private message: string; + + constructor($id: string, $author: IdentityRef, $location: string, $timeStamp: Date, $message: string) { + this.id = $id; + this.author = $author; + this.location = $location; + this.timeStamp = $timeStamp; + this.message = $message; + } + + /** + * Getter $id + * @return {string} + */ + public get $id(): string { + return this.id; + } + + /** + * Getter $author + * @return {IdentityRef} + */ + public get $author(): IdentityRef { + return this.author; + } + + /** + * Getter $location + * @return {string} + */ + public get $location(): string { + return this.location; + } + + /** + * Getter $timeStamp + * @return {Date} + */ + public get $timeStamp(): Date { + return this.timeStamp; + } + + /** + * Getter $message + * @return {string} + */ + public get $message(): string { + return this.message; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.ts new file mode 100644 index 00000000..bba5220e --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.ts @@ -0,0 +1,26 @@ +export class IssueModel { + + private message: string; + private issueType: string; + + constructor($issueType: string, $message: string) { + this.message = $message; + this.issueType = $issueType; + } + + /** + * Getter $message + * @return {string} + */ + public get $message(): string { + return this.message; + } + + /** + * Getter $issueType + * @return {string} + */ + public get $issueType(): string { + return this.issueType; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.ts new file mode 100644 index 00000000..cd592576 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.ts @@ -0,0 +1,50 @@ +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { TaskModel } from "./TaskModel"; +import { IssueModel } from "./IssueModel"; + +export class JobModel { + + private tasks: TaskModel[]; + private jobStatus: TaskStatus; + private issues: IssueModel[]; + private jobName: string; + + constructor($jobName: string, $jobStatus: TaskStatus, $issues: IssueModel[], $tasks: TaskModel[]) { + this.tasks = $tasks; + this.jobStatus = $jobStatus; + this.issues = $issues; + this.jobName = $jobName; + } + + /** + * Getter $jobName + * @return {string} + */ + public get $jobName(): string { + return this.jobName; + } + + /** + * Getter $issues + * @return {IssueModel[]} + */ + public get $issues(): IssueModel[] { + return this.issues; + } + + /** + * Getter $tasks + * @return {TaskModel[]} + */ + public get $tasks(): TaskModel[] { + return this.tasks; + } + + /** + * Getter $jobStatus + * @return {TaskStatus} + */ + public get $jobStatus(): TaskStatus { + return this.jobStatus; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.ts new file mode 100644 index 00000000..b0466b8a --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.ts @@ -0,0 +1,48 @@ +import { JobModel } from "./JobModel"; + +export class PhaseModel { + + private name: string; + private jobs: JobModel[]; + private status: string; + private rank: number; + + constructor($name: string, $jobs: JobModel[], $status: string, $rank: number) { + this.name = $name; + this.jobs = $jobs; + this.status = $status; + this.rank = $rank; + } + + /** + * Getter $name + * @return {string} + */ + public get $name(): string { + return this.name; + } + + /** + * Getter $jobs + * @return {JobModel[]} + */ + public get $jobs(): JobModel[] { + return this.jobs; + } + + /** + * Getter $status + * @return {string} + */ + public get $status(): string { + return this.status; + } + + /** + * Getter $rank + * @return {number} + */ + public get $rank(): number { + return this.rank; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.ts b/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.ts new file mode 100644 index 00000000..9af1b889 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.ts @@ -0,0 +1,217 @@ +import { Report } from "./Report"; +import { Artifact, Release, ReleaseEnvironment, ReleaseTask, DeploymentAttempt, TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { ChangeModel } from "./ChangeModel"; +import { PhaseModel } from "./PhaseModel"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { JobModel } from "./JobModel"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; +import { isNullOrUndefined } from "util"; + +export class ReleaseReport extends Report { + + private artifacts: Artifact[] = []; + private release: Release; + private environment: ReleaseEnvironment; + private lastCompletedRelease: Release; + private lastCompletedEnvironment: ReleaseEnvironment; + + public setReleaseData($release: Release, $environment: ReleaseEnvironment, $lastCompletedRelease: Release, $phases: PhaseModel[], $changes: ChangeModel[], $lastCompletedEnvironment?: ReleaseEnvironment) { + this.artifacts = $release.artifacts == null ? [] : $release.artifacts; + this.createdBy = $release.createdBy; + this.phases = $phases; + this.associatedChanges = $changes; + + this.release = $release; + this.environment = $environment; + this.lastCompletedRelease = $lastCompletedRelease; + + if ($lastCompletedEnvironment == null) { + if ($lastCompletedRelease != null && $lastCompletedRelease.environments != null) { + var lastEnvironments = $lastCompletedRelease.environments.filter(e => e.definitionEnvironmentId == $environment.definitionEnvironmentId); + if (lastEnvironments != null && lastEnvironments.length > 0) { + this.lastCompletedEnvironment = lastEnvironments[0]; + } + } + } + else { + this.lastCompletedEnvironment = $lastCompletedEnvironment; + } + } + + /** + * Getter $artifacts + * @return {Artifact[]} + */ + public get $artifacts(): Artifact[] { + return this.artifacts; + } + + /** + * Getter $release + * @return {Release} + */ + public get $release(): Release { + return this.release; + } + + /** + * Getter $environment + * @return {ReleaseEnvironment} + */ + public get $environment(): ReleaseEnvironment { + return this.environment; + } + + /** + * Getter $lastCompletedRelease + * @return {Release} + */ + public get $lastCompletedRelease(): Release { + return this.lastCompletedRelease; + } + + /** + * Getter $lastCompletedEnvironment + * @return {ReleaseEnvironment} + */ + public get $lastCompletedEnvironment(): ReleaseEnvironment { + return this.lastCompletedEnvironment; + } + + public hasPrevGotSameFailures(): boolean { + const lastId = this.lastCompletedRelease == null ? "null" : this.lastCompletedRelease.id; + console.log(`Using Last Completed Release: '${lastId}'`); + if (this.lastCompletedRelease == null || this.$lastCompletedEnvironment == null) { + return false; + } + + if (lastId > this.release.id) { + // We are in a situation where current build completed latter compared to the newer one + // Newer one would have already evaluated the failures and sent a mail to committers anyway + // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer + // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line + return true; + } + + return null; + } + + public hasFailedTasks(): boolean { + const tasks = this.getReleaseTasks(this.environment); + return tasks.filter(task => task.status == TaskStatus.Failed).length > 0; + } + + public hasPrevFailedTasks(): boolean { + const tasks = this.getReleaseTasks(this.lastCompletedEnvironment); + return tasks.filter(task => task.status == TaskStatus.Failed).length > 0; + } + + public arePrevFailedTasksSame(): boolean { + const lastTasks = this.getReleaseTasks(this.lastCompletedEnvironment); + const lastFailedTasks = lastTasks.filter(task => task.status == TaskStatus.Failed); + var prevfailedTask = lastFailedTasks.length > 0 ? lastFailedTasks[0] : null; + + const currentTasks = this.getReleaseTasks(this.environment); + const currentFailedTasks = currentTasks.filter(task => task.status == TaskStatus.Failed); + var currfailedTask = currentFailedTasks.length > 0 ? currentFailedTasks[0] : null; + + const prevfailedTaskName = prevfailedTask == null ? "" : prevfailedTask.name; + const currfailedTaskName = currfailedTask == null ? "" : currfailedTask.name; + // if both releases failed without executing any tasks, then they can be null + // otherwise, use name matching + return (prevfailedTask == null && currfailedTask == null) || prevfailedTaskName == currfailedTaskName; + } + + public getPrevConfig(config: PipelineConfiguration): PipelineConfiguration { + if(isNullOrUndefined(this.lastCompletedRelease) || isNullOrUndefined(this.lastCompletedEnvironment)) { + return null; + } + var prevConfig = new PipelineConfiguration( + config.$pipelineType, + this.lastCompletedRelease.id, + config.$projectId, + config.$projectName, + this.lastCompletedEnvironment.id, + this.lastCompletedEnvironment.definitionEnvironmentId, + config.$usePreviousEnvironment, + config.$teamUri, + config.$accessKey); + + return prevConfig; + } + + public getEnvironmentStatus(): string { + if (this.hasFailedTasks() || this.hasCanceledPhases()) { + return "Failed"; + } + else if (this.hasPartiallySucceededTasks(this.environment)) { + return "Partially Succeeded"; + } + else { + return "Succeeded"; + } + } + + private hasPartiallySucceededTasks(source: ReleaseEnvironment): boolean { + if (source == null) { + return false; + } + const tasks = this.getReleaseTasks(source); + return tasks.filter(t => t.status == TaskStatus.PartiallySucceeded).length > 0; + } + + public hasCanceledPhases(): boolean { + if (this.phases == null) { + return false; + } + const jobs: JobModel[] = []; + this.phases.forEach(p => { + if (p.$jobs != null) { + p.$jobs.forEach(j => { + if (j.$jobStatus == TaskStatus.Canceled) { + jobs.push(j); + } + }); + } + }); + return jobs.length > 0; + } + + public getPipelineViewModel(config: PipelineConfiguration): ReleaseViewModel { + return new ReleaseViewModel(this.environment, config); + } + + public getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[] { + var artifacts: ArtifactViewModel[] = []; + if (this.artifacts != null && this.artifacts.length > 0) { + this.artifacts.forEach(artifact => { + artifacts.push(new ArtifactViewModel(artifact, config)); + }); + } + + return artifacts; + } + + public getReleaseTasks(source: ReleaseEnvironment): ReleaseTask[] { + const tasks: ReleaseTask[] = []; + + if (source != null && source.deploySteps != null && source.deploySteps.length > 0) { + let attempt = 0; + let deploymentAttempt: DeploymentAttempt = source.deploySteps[0]; + for (var i: number = 0; i < source.deploySteps.length; i++) { + if (source.deploySteps[i].attempt > attempt) { + deploymentAttempt = source.deploySteps[i]; + } + } + + deploymentAttempt.releaseDeployPhases.forEach(releaseDeployPhase => { + releaseDeployPhase.deploymentJobs.forEach(deploymentJob => { + tasks.push(...deploymentJob.tasks); + }); + }); + } + + return tasks; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/Report.ts b/Tasks/emailReportTask/emailReportTaskV2/model/Report.ts new file mode 100644 index 00000000..fa7c5ee7 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/Report.ts @@ -0,0 +1,147 @@ +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +import { ChangeModel } from "./ChangeModel"; +import { PhaseModel } from "./PhaseModel"; +import { TestSummaryGroupModel } from "./testresults/TestSummaryGroupModel"; +import { TestResultSummary, AggregatedResultsByOutcome, TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestResultsGroupModel } from "./testresults/TestResultGroupModel"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { isNullOrUndefined } from "util"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; +import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; + +export abstract class Report { + private dataMissing: boolean = false; + + private sendMailConditionSatisfied: boolean = false; + + public createdBy: IdentityRef; + + protected associatedChanges: ChangeModel[] = []; + + protected phases: PhaseModel[] = []; + + private failedTestOwners: IdentityRef[] = []; + + public filteredResults: TestResultsGroupModel[] = []; + + public hasFilteredTests: boolean = false; + + private testSummaryGroups: TestSummaryGroupModel[] = []; + + public testResultSummary: TestResultSummary; + + /** + * Getter $dataMissing + * @return {boolean} + */ + public get $dataMissing(): boolean { + return this.dataMissing; + } + + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + public get $associatedChanges(): ChangeModel[] { + return this.associatedChanges; + } + + /** +* Getter $associatedChanges +* @return {ChangeModel[]} +*/ + public get $phases(): PhaseModel[] { + return this.phases; + } + + /** + * Getter $sendMailConditionSatisfied + * @return {boolean} + */ + public get $sendMailConditionSatisfied(): boolean { + return this.sendMailConditionSatisfied; + } + + /** + * Setter $dataMissing + * @param {boolean} value + */ + public set $dataMissing(value: boolean) { + this.dataMissing = value; + } + + /** + * Setter $sendMailConditionSatisfied + * @param {boolean} value + */ + public set $sendMailConditionSatisfied(value: boolean) { + this.sendMailConditionSatisfied = value; + } + + /** + * Getter $testSummaryGroups + * @return {TestSummaryGroupModel[]} + */ + public get $testSummaryGroups(): TestSummaryGroupModel[] { + return this.testSummaryGroups; + } + + + /** + * Getter $failedTestOwners + * @return {IdentityRef[] } + */ + public get $failedTestOwners(): IdentityRef[] { + return this.failedTestOwners; + } + + public abstract hasPrevGotSameFailures(): boolean; + + public abstract hasFailedTasks(): boolean; + + public abstract hasPrevFailedTasks(): boolean; + + public abstract arePrevFailedTasksSame(): boolean; + + public abstract getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; + + public abstract getEnvironmentStatus(): string; + + public abstract getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel | ReleaseViewModel; + + public abstract getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; + + public hasFailedTests(includeOthersInTotal: boolean): boolean { + if (isNullOrUndefined(this.testResultSummary)) { + return false; + } + + if (!includeOthersInTotal) { + return this.getTestCountForOutcome(TestOutcome.Failed) > 0; + } + + // Others need to be included - Calculate failed as (total - passed) + const passedCount = this.getTestCountForOutcome(TestOutcome.Passed); + if (passedCount > 0) { + return (this.testResultSummary.aggregatedResultsAnalysis.totalTests - passedCount) > 0; + } + + // If no passed tests, then anything ran should be considered as failed since "other" outcomes need to be considered as failures + // if no tests ran, then we don't have failed tests + return this.testResultSummary.aggregatedResultsAnalysis.totalTests > 0; + } + + private getTestCountForOutcome(outcome: TestOutcome) : number { + const resultsByOutcome = this.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome; + + let testsForOutcome = 0; + if (!isNullOrUndefined(resultsByOutcome) && !isNullOrUndefined(resultsByOutcome[outcome])) { + testsForOutcome += resultsByOutcome[outcome].count; + } + + return testsForOutcome; + } + + public abstract hasCanceledPhases(): boolean; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.ts b/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.ts new file mode 100644 index 00000000..c16300d6 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.ts @@ -0,0 +1,91 @@ +import { ReleaseReport } from "./ReleaseReport"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { PipelineType } from "../config/pipeline/PipelineType"; +import { Report } from "./Report"; +import { Release, ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { ChangeModel } from "./ChangeModel"; +import { PhaseModel } from "./PhaseModel"; +import { BuildReport } from "./BuildReport"; + +export class ReportFactory { + + static createNewReport(pipelineConfig: PipelineConfiguration) { + return (pipelineConfig.$pipelineType == PipelineType.Build) ? new BuildReport() : new ReleaseReport(); + } + + static mergeReports(reports: Report[]): Report { + if (reports == null || reports.length == 0) return null; + if (reports.length == 1) return reports[0]; + + let finalReport = reports[0]; + for (var i = 1; i < reports.length; i++) { + finalReport = ReportFactory.mergeTwoReports(finalReport, reports[i]); + } + + return finalReport; + } + + private static mergeTwoReports(source: Report, target: Report): Report { + let associatedChanges: ChangeModel[] = []; + let phases: PhaseModel[] = []; + if (target.$testSummaryGroups != null) { + source.$testSummaryGroups.push(...target.$testSummaryGroups); + } + + if (target.$associatedChanges != null) { + associatedChanges = target.$associatedChanges; + } + + if (target.$failedTestOwners != null) { + source.$failedTestOwners.push(...target.$failedTestOwners); + } + + if (target.filteredResults != null) { + source.filteredResults = target.filteredResults; + } + + if (target.hasFilteredTests) { + source.hasFilteredTests = target.hasFilteredTests; + } + + if (target.testResultSummary != null) { + source.testResultSummary = target.testResultSummary; + } + + if (target.$phases != null) { + phases = target.$phases; + } + + if (source instanceof ReleaseReport) { + var releaseTarget = target as ReleaseReport; + var releaseSource = source as ReleaseReport; + + let targetRelease: Release = null; + let targetEnv: ReleaseEnvironment = null; + let targetLastRelease: Release = null; + let targetLastEnv: ReleaseEnvironment = null; + + if (releaseTarget.$release != null) { + targetRelease = releaseTarget.$release; + } + + if (releaseTarget.$environment != null) { + targetEnv = releaseTarget.$environment; + } + + if (releaseTarget.$lastCompletedEnvironment != null) { + targetLastRelease = releaseTarget.$lastCompletedRelease; + } + + if (releaseTarget.$lastCompletedEnvironment != null) { + targetLastEnv = releaseTarget.$lastCompletedEnvironment; + } + + if (targetRelease != null) { + releaseSource.setReleaseData(targetRelease, targetEnv, targetLastRelease, phases, associatedChanges, targetLastEnv); + } + } + + return source; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.ts new file mode 100644 index 00000000..d83938d3 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.ts @@ -0,0 +1,69 @@ +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { IssueModel } from "./IssueModel"; + +export class TaskModel { + + private name: string; + private status: TaskStatus; + private issues: IssueModel[]; + private agentName: string; + private finishTime: Date; + private startTime: Date; + + constructor($name: string, $status: TaskStatus, $issues: IssueModel[], $agentName: string, $finishTime: Date, $startTime: Date) { + this.name = $name; + this.status = $status; + this.issues = $issues; + this.agentName = $agentName; + this.finishTime = $finishTime; + this.startTime = $startTime; + } + + /** + * Getter $name + * @return {string} + */ + public get $name(): string { + return this.name; + } + + /** + * Getter $status + * @return {TaskStatus} + */ + public get $status(): TaskStatus { + return this.status; + } + + /** + * Getter $issues + * @return {IssueModel[]} + */ + public get $issues(): IssueModel[] { + return this.issues; + } + + /** + * Getter $agentName + * @return {string} + */ + public get $agentName(): string { + return this.agentName; + } + + /** + * Getter $finishTime + * @return {Date} + */ + public get $finishTime(): Date { + return this.finishTime; + } + + /** + * Getter $startTime + * @return {Date} + */ + public get $startTime(): Date { + return this.startTime; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.ts b/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.ts new file mode 100644 index 00000000..2eb8ad99 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.ts @@ -0,0 +1,154 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Artifact, ArtifactSourceReference } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { TestCaseResult } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { isNullOrUndefined } from "util"; +import { PipelineType } from "../../config/pipeline/PipelineType"; + +export class LinkHelper { + private static readonly TcmPipelineExtension = "_TestManagement/Runs"; + + // Release related strings + private static readonly ReleaseProgressView = "_releaseProgress"; + private static readonly ReleaseDefView = "_releaseDefinition"; + private static readonly ReleaseEnvironmentExtension = "release-environment-extension"; + private static readonly ReleaseEnvironmentLogsExtension = "release-environment-logs"; + private static readonly ReleaseLinkTestExtensionId = "ms.vss-test-web.test-result-in-release-environment-editor-tab"; + + private static readonly WorkItemPipelineExtension = "_workitems"; + private static readonly BuildPipelineExtension = "_build"; + + public static getBuildDefinitionLinkById(definitionId: any, config: PipelineConfiguration): string { + var collectionUri = config.$teamUri; + var parameters = new Map(); + parameters.set("definitionId", definitionId.toString()); + parameters.set("_a", "summary"); + var uri = this.getBuildLink(config, collectionUri, parameters); + + return uri; + } + + private static getBuildLink(config: PipelineConfiguration, collectionUri: string, parameters: Map): string { + return collectionUri + "/" + this.getBuildRelativeUrl(config.$projectName) + "/results" + this.getQueryParameter(parameters); + } + + public static getCommitLink(changeId: string, changeUri: string, config: PipelineConfiguration): string { + var collectionUri = config.$teamUri; + let repoId = null; + var pos = changeUri.indexOf("repositories"); + if (pos > 0) { + repoId = changeUri.substr(pos).split("/")[1]; + } + + var uri = collectionUri + `/${config.$projectName}/_git/${repoId}/commit/${changeId})`; + return uri; + } + + public static getCreateBugLinkForTest(config: PipelineConfiguration, testResult: TestCaseResult): string { + const testRunId = testResult.testRun == null ? null : testResult.testRun.id; + const parameters = new Map(); + parameters.set("create-bug", "true"); + return LinkHelper.getTestResultLink(config, testRunId, testResult.id, parameters); + } + + public static getQueryParameter(parameterValues: Map): string { + var queryString = ""; + parameterValues.forEach((value: string, key: string) => { + queryString = (queryString == "") + ? "?" + key + "=" + value + : queryString + "&" + key + "=" + value; + }); + + return queryString; + } + + public static getReleaseDefinitionLink(config: PipelineConfiguration, releaseDefinitionId: number): string { + var collectionUri = config.$teamUri; + const parameters = new Map(); + parameters.set("definitionId", releaseDefinitionId.toString()); + parameters.set("_a", "environments-editor"); + + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseDefView + "/" + LinkHelper.getQueryParameter(parameters); + } + + public static getReleaseLogsTabLink(config: PipelineConfiguration): string { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + queryParams.set("_a", LinkHelper.ReleaseEnvironmentLogsExtension); + queryParams.set("environmentId", config.$environmentId.toString()); + + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + + public static getReleaseSummaryLink(config: PipelineConfiguration): string { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + + public static getTestResultLink(config: PipelineConfiguration, runId: string, resultId: number, queryParams?: Map): string { + var collectionUri = config.$teamUri; + const parameters = new Map(); + parameters.set("runId", runId); + parameters.set("_a", "resultSummary"); + parameters.set("resultId", resultId.toString()); + + if (queryParams != null) { + queryParams.forEach((value: string, key: string) => {6 + parameters.set(key, value); + }); + } + + return collectionUri + "\\" + LinkHelper.getTcmRelativeUrl(config.$projectName) + "\\" + LinkHelper.getQueryParameter(parameters); + } + + public static getTestTabLinkInRelease(config: PipelineConfiguration): string { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + queryParams.set("_a", LinkHelper.ReleaseEnvironmentExtension); + queryParams.set("environmentId", config.$environmentId.toString()); + queryParams.set("extensionId", LinkHelper.ReleaseLinkTestExtensionId); + + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + + public static getWorkItemLink(config: PipelineConfiguration, workItemId: number): string { + const queryParams = new Map(); + queryParams.set("id", workItemId.toString()); + + return config.$teamUri + "/" + LinkHelper.getWorkItemRelativeUrl(config.$projectName) + "/" + LinkHelper.getQueryParameter(queryParams); + } + + private static getBuildRelativeUrl(projectName: string): string { + return projectName + "/" + LinkHelper.BuildPipelineExtension; + } + + public static getTestTabLinkInBuild(config: PipelineConfiguration) { + var collectionUri = config.$teamUri; + var parameters = new Map( + [ + ["buildId", config.$pipelineId.toString()], + ["view", "ms.vss-test-web.build-test-results-tab"] + ]); + + var uri = this.getBuildLink(config, collectionUri, parameters); + return uri; + } + + private static getTcmRelativeUrl(projectName: string): string { + return projectName + "/" + LinkHelper.TcmPipelineExtension; + } + + private static getWorkItemRelativeUrl(projectName: string): string { + return projectName + "/" + LinkHelper.WorkItemPipelineExtension; + } + + public static getTestTabLink(pipelineConfiguration: PipelineConfiguration): string { + return pipelineConfiguration.$pipelineType == PipelineType.Release ? + this.getTestTabLinkInRelease(pipelineConfiguration) : + this.getTestTabLinkInBuild(pipelineConfiguration); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.ts b/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.ts new file mode 100644 index 00000000..cb769ec9 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.ts @@ -0,0 +1,61 @@ +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; + +export class TestResultsHelper { + public static readonly PercentagePrecision = 2; + + public static getTestOutcomePercentage(testCountForOutcome: number, totalTests: number): number { + if (totalTests == 0) { + console.log("Total Test count is 0. Setting outcome percentage to 0"); + } + + let testOutcomePercentage = totalTests == 0 ? + 0 : + testCountForOutcome / totalTests * 100; + + return TestResultsHelper.getCustomizedDecimalValue(testOutcomePercentage); + } + + private static getCustomizedDecimalValue(value: number): number { + var fixedValue = Math.pow(10, TestResultsHelper.PercentagePrecision); + return ((Math.floor(value * fixedValue)) / fixedValue); + } + + public static getTestOutcomePercentageString(testCountForOutcome: number, totalTests: number): string { + return this.getTestOutcomePercentage(testCountForOutcome, totalTests) + "%"; + } + + public static getTotalTestCountBasedOnUserConfiguration( + testCountsByOutcome: Map, + includeOthersInTotal: boolean): number { + var totalTests = 0; + + testCountsByOutcome.forEach((testCount: number, testOutcome: TestOutcome) => { + var isPassedTest = testOutcome == TestOutcome.Passed; + var isFailedTest = testOutcome == TestOutcome.Failed; + + if (isPassedTest || isFailedTest || includeOthersInTotal) { + totalTests += testCount; + } + }); + + return totalTests; + } + + public static getTotalTestCountBasedOnUserConfigurationPriority( + testCountsByOutcome: Map, + includeOthersInTotal: boolean): number { + var totalTests = 0; + + testCountsByOutcome.forEach((testCount: number, testOutcome: TestOutcomeForPriority) => { + var isPassedTest = testOutcome == TestOutcomeForPriority.Passed; + var isFailedTest = testOutcome == TestOutcomeForPriority.Failed; + + if (isPassedTest || isFailedTest || includeOthersInTotal) { + totalTests += testCount; + } + }); + + return totalTests; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.ts b/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.ts new file mode 100644 index 00000000..f1157bab --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.ts @@ -0,0 +1,84 @@ +import { isNullOrUndefined } from "util"; + +export class TimeFormatter { + static ConvertTimeStringToMilliSeconds(duration: string) : number { + const timeSpanArray = duration.split("."); + let durationNum: number = 0; + + let hmsIndex = 0; + if(timeSpanArray.length > 3) { + console.warn("cannot format time duration"); + return 0; + } else if(timeSpanArray.length == 3) { + // Eg: 1.03:04:05.567 = 1 day, 3 hours, 4 min, 5 seconds and 567 ms. + // Days to ms + durationNum += Number(timeSpanArray[0]) * 24 * 3600; + hmsIndex = 1; + } + + let timeStrArray = timeSpanArray[hmsIndex].split(":"); + + if(timeStrArray.length != 3) { + console.warn("cannot format time duration properly. test run duration will not be accurate"); + } else { + durationNum += Number(timeStrArray[2]); // secs + durationNum += Number(timeStrArray[1]) * 60; // mins to secs + durationNum += Number(timeStrArray[0]) * 3600; // hours to secs + } + return durationNum * 1000; + } + + public static FormatDuration(timeInMilliseconds: number): string { + let timeStr = ""; + // 1- Convert to seconds: + var seconds = timeInMilliseconds / 1000; + // 2- Extract hours: + var hours = Math.round(seconds / 3600); // 3,600 seconds in 1 hour + seconds = seconds % 3600; // seconds remaining after extracting hours + // 3- Extract minutes: + var minutes = Math.round(seconds / 60); // 60 seconds in 1 minute + // 4- Keep only seconds not extracted to minutes: + seconds = seconds % 60; + seconds = Math.round(seconds); + if(minutes == 60) { + hours += 1; + minutes = 0; + } + return this.getCombinedTimeString(hours, minutes, seconds); + } + + public static FormatDurationStr(timeStr: string): string { + let resultStr = ""; + if (!isNullOrUndefined(timeStr)) { + // strip off milliseconds if any, and then split into hh:mm:ss + const timeStrArray = timeStr.split(".")[0].split(":"); + if (timeStrArray.length != 3) { + // not supported + return timeStr; + } + + // 1- Convert to seconds: + var seconds = Math.round(Number.parseInt(timeStrArray[2])); + var minutes = Math.round(Number.parseInt(timeStrArray[1])); + var hours = Math.round(Number.parseInt(timeStrArray[0])); + + resultStr = this.getCombinedTimeString(hours, minutes, seconds); + } + return resultStr; + } + + private static getCombinedTimeString(hours: number, minutes: number, seconds: number): string { + let timeStr = ""; + + timeStr += this.getTimeUnitString(hours, "h"); + timeStr += this.getTimeUnitString(minutes, "m"); + timeStr += this.getTimeUnitString(seconds, "s"); + timeStr = timeStr.trim(); + + return (timeStr == "" ? "0s" : timeStr); + } + + private static getTimeUnitString(timeUnit: number, suffix: string): string { + return timeUnit < 1 ? "" : timeUnit + suffix + " "; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts new file mode 100644 index 00000000..3cbff8a1 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts @@ -0,0 +1,7 @@ +export enum TestOutcomeForPriority { + Failed, + Inconclusive, + NotExecuted, + Passed, + Other +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.ts new file mode 100644 index 00000000..7256dc12 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.ts @@ -0,0 +1,8 @@ +import { TestResultModel } from "./TestResultModel"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; + +export class TestResultsGroupModel { + public groupName: string; + + public testResults: Map = new Map(); +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.ts new file mode 100644 index 00000000..50ba86df --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.ts @@ -0,0 +1,9 @@ +import { TestCaseResult, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; + +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; + +export class TestResultModel { + public testResult: TestCaseResult; + public associatedBugRefs: WorkItemReference[] = []; + public associatedBugs: WorkItem[] = []; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts new file mode 100644 index 00000000..c92e438d --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts @@ -0,0 +1,9 @@ +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +import { TestSummaryItemModel } from "./TestSummaryItemModel"; + +export class TestSummaryGroupModel { + + public groupedBy: GroupTestResultsBy; + + public runs: TestSummaryItemModel[] = []; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts new file mode 100644 index 00000000..0802009f --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts @@ -0,0 +1,108 @@ +import { TestOutcomeForPriority } from "./TestOutcomeForPriority"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; + +export class TestSummaryItemModel { + private name: string; + private id: string; + private totalTestCount: number; + private testCountByOutcome: Map; + private testCountForOutcomeByPriority: Map>; + private duration: number; + + constructor($name: string, $id: string) { + this.name = $name; + this.id = $id; + this.testCountByOutcome = new Map(); + this.testCountForOutcomeByPriority = new Map>(); + } + + /** + * Getter $name + * @return {string} + */ + public get $name(): string { + return this.name; + } + + /** + * Getter $id + * @return {string} + */ + public get $id(): string { + return this.id; + } + + /** + * Getter $totalTestCount + * @return {number} + */ + public get $totalTestCount(): number { + return this.totalTestCount; + } + + /** + * Getter $testCountByOutcome + * @return {Map} + */ + public get $testCountByOutcome(): Map { + return this.testCountByOutcome; + } + + /** + * Getter $testCountForOutcomeByPriority + * @return {Map} + */ + public get $testCountForOutcomeByPriority(): Map> { + return this.testCountForOutcomeByPriority; + } + + /** + * Getter $duration + * @return {any} + */ + public get $duration(): number { + return this.duration; + } + + + /** + * Setter $totalTestCount + * @param {number} value + */ + public set $totalTestCount(value: number) { + this.totalTestCount = value; + } + + /** + * Setter $duration + * @param {any} value + */ + public set $duration(value: number) { + this.duration = value; + } + + public getFailedTestsCount(): number { + return this.getTestOutcomeCount(TestOutcome.Failed); + } + + public getOtherTestsCount(): number { + let totalCount = 0; + this.testCountByOutcome.forEach((value: number, key: TestOutcome) => { + if (key != TestOutcome.Passed && key != TestOutcome.Failed) { + totalCount += value; + } + }); + return totalCount; + } + + public getPassedTestsCount(): number { + return this.getTestOutcomeCount(TestOutcome.Passed); + } + + private getTestOutcomeCount(testOutcome: TestOutcome): number { + if (this.testCountByOutcome.has(testOutcome)) { + return this.testCountByOutcome.get(testOutcome); + } + return 0; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts new file mode 100644 index 00000000..c75de7e2 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts @@ -0,0 +1,41 @@ +import { Artifact } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { LinkHelper } from "../helpers/LinkHelper"; +import { isNullOrUndefined } from "util"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; + +export class ArtifactViewModelWrapper { + public ArtifactViewModel: ArtifactViewModel[]; +} + +export class ArtifactViewModel { + public ArtifactDefinitionUrl: string; + public BranchName: string; + public BuildSummaryUrl: string; + public Name: string; + public Version: string; + public IsPrimary: boolean; + + constructor(artifact: Artifact, config: PipelineConfiguration) { + this.Version = this.getArtifactInfo(artifact, "version"); + this.BranchName = this.getArtifactInfo(artifact, "branch"); + this.Name = artifact.alias; + this.IsPrimary = artifact.isPrimary; + + if (!isNullOrUndefined(artifact.definitionReference)) { + if (!isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl) && + !isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl.id)) { + this.ArtifactDefinitionUrl = artifact.definitionReference.artifactSourceDefinitionUrl.id; + } + + if (!isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl) && + !isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl.id)) { + this.BuildSummaryUrl = artifact.definitionReference.artifactSourceVersionUrl.id; + } + } + } + + private getArtifactInfo(artifact: Artifact, key: string): string { + const sourceRef = artifact.definitionReference[key]; + return isNullOrUndefined(sourceRef) ? null : sourceRef.name; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts new file mode 100644 index 00000000..ac24d901 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts @@ -0,0 +1,32 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { BuildReference, Build } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { LinkHelper } from "../helpers/LinkHelper"; +import { isNullOrUndefined } from "util"; + +export class BuildReferenceViewModel { + public Id: string; + public Number: string; + public Branch: string; + public Url: string; + public DefinitionUrl: string; + public DefinitionName: string; + + constructor(config: PipelineConfiguration, buildReference: BuildReference, build: Build) { + if(buildReference != null) { + this.Id = buildReference.id.toString(); + this.Number = buildReference.buildNumber; + if(!isNullOrUndefined(buildReference._links) && !isNullOrUndefined(buildReference._links.web) && !isNullOrUndefined(buildReference._links.web.href)) { + this.Url = buildReference._links.web.href; + } + } else if (build != null) { + this.Id = build.id.toString(); + this.Number = build.buildNumber; + this.Branch = build.sourceBranch; + if(!isNullOrUndefined(build._links) && !isNullOrUndefined(build._links.web) && !isNullOrUndefined(build._links.web.href)) { + this.Url = build._links.web.href; + } + this.DefinitionUrl = LinkHelper.getBuildDefinitionLinkById(build.definition.id, config); + this.DefinitionName = build.definition.name; + } + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts new file mode 100644 index 00000000..1fbb93e8 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts @@ -0,0 +1,28 @@ +import { ChangeModel } from "../ChangeModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { StringUtils } from "../../utils/StringUtils"; +import { LinkHelper } from "../helpers/LinkHelper"; + +export class ChangeViewModelWrapper { + public ChangeViewModel: ChangeViewModel[]; +} + +export class ChangeViewModel { + public readonly ConstHashLength = 8; + public AuthorName: string; + public Id: string; + public Message: string; + public TimeStamp: string; + public Url: string; + public ShortId: string; + + constructor(change: ChangeModel, config: PipelineConfiguration) { + this.Id = change.$id; + this.ShortId = isNaN(Number.parseInt(this.Id)) ? this.Id : this.Id.substring(0, this.ConstHashLength); + this.Message = StringUtils.CompressNewLines(change.$message); + this.AuthorName = change.$author == null ? null : change.$author.displayName; + this.TimeStamp = change.$timeStamp.toDateString(); + + this.Url = LinkHelper.getCommitLink(change.$id, change.$location, config); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts new file mode 100644 index 00000000..e3169c8f --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts @@ -0,0 +1,59 @@ +import { JobModel } from "../JobModel"; +import { TaskModel } from "../TaskModel"; +import { TaskResultViewModel, TaskResultViewModelWrapper } from "./TaskResultViewModel"; + +export class DeploymentJobViewModel { + public Tasks: TaskResultViewModelWrapper; + public MinTaskStartTime: Date; + public MaxTaskFinishTime: Date; + + constructor(jobs: JobModel[]) { + this.Tasks = new TaskResultViewModelWrapper(); + this.Tasks.TaskResultViewModel = []; + + if (jobs.length > 0) { + let taskIndex = 0; + let releaseTasks: TaskModel[] = []; + do { + releaseTasks = []; + jobs.forEach(job => { + // Not all jobs have same set of tasks + if (taskIndex < job.$tasks.length) { + releaseTasks.push(job.$tasks[taskIndex]); + this.MinTaskStartTime = this.getMinTime(this.MinTaskStartTime, job.$tasks[taskIndex].$startTime); + this.MaxTaskFinishTime = this.getMaxTime(this.MaxTaskFinishTime, job.$tasks[taskIndex].$finishTime); + } + }); + + if (releaseTasks != null && releaseTasks.length > 0) { + this.Tasks.TaskResultViewModel.push(new TaskResultViewModel(releaseTasks)); + } + + taskIndex++; + + } while (releaseTasks.length > 0); + } + } + + private getMinTime(time1: Date, time2: Date): Date { + if (time1 == null) { + return time2; + } + else if (time2 != null && time2 < time1) { + return time2; + } + + return time1; + } + + private getMaxTime(time1: Date, time2: Date): Date { + if (time1 == null) { + return time2; + } + else if (time2 != null && time2 > time1) { + return time2; + } + + return time1; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts new file mode 100644 index 00000000..04591b6b --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts @@ -0,0 +1,180 @@ +import { Report } from "../Report"; +import { ReportConfiguration } from "../../config/ReportConfiguration"; +import { isNullOrUndefined } from "util"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestOutcome, AggregatedResultsByOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { LinkHelper } from "../helpers/LinkHelper"; +import { ReleaseViewModel } from "./ReleaseViewModel"; +import { PhaseViewModel, PhaseViewModelWrapper } from "./PhaseViewModel"; +import { PhaseIssuesViewModel } from "./PhaseIssuesViewModel"; +import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; +import { TestResultsHelper } from "../helpers/TestResultsHelper"; +import { ArtifactViewModelWrapper } from "./ArtifactViewModel"; +import { ChangeViewModel, ChangeViewModelWrapper } from "./ChangeViewModel"; +import { TestSummaryGroupViewModel, TestSummaryGroupViewModelWrapper } from "./TestSummaryGroupViewModel"; +import { TestResultsGroupViewModel, TestResultsGroupViewModelWrapper } from "./TestResultsGroupViewModel"; +import { PipelineType } from "../../config/pipeline/PipelineType"; +import { BuildReferenceViewModel } from "./BuildReferenceViewModel"; + +export class EmailReportViewModel { + + public DataMissing: boolean; + public HasTestResultsToShow: boolean; + public HasFailedTests: boolean; + public HasFilteredTests: boolean; + public HasTaskFailures: boolean; + public HasCanceledPhases: boolean; + public MaxTestResultsToShow: number; + public ProjectName: string; + public Release: ReleaseViewModel; + public Build: any; + public Phases: PhaseViewModelWrapper; + public PhaseIssuesSummary: PhaseIssuesViewModel; + public AllTests: TestResultSummaryViewModel; + public Artifacts: ArtifactViewModelWrapper; + public AssociatedChanges: ChangeViewModelWrapper; + public SummaryGroups: TestSummaryGroupViewModelWrapper; + public TestResultsGroups: TestResultsGroupViewModelWrapper; + public TestTabLink: string; + public ShowAssociatedChanges: boolean; + + constructor(report: Report, reportConfiguration: ReportConfiguration) { + this.ProjectName = reportConfiguration.$pipelineConfiguration.$projectName; + this.HasTaskFailures = report.hasFailedTasks(); + + if (reportConfiguration.$pipelineConfiguration.$pipelineType == PipelineType.Build) { + this.Build = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration) as BuildReferenceViewModel; + } else { + this.Release = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration) as ReleaseViewModel; + } + + this.Artifacts = new ArtifactViewModelWrapper(); + this.Artifacts.ArtifactViewModel = report.getArtifactViewModels(reportConfiguration.$pipelineConfiguration); + + this.HasCanceledPhases = report.hasCanceledPhases(); + this.InitializePhases(report); + + this.SetMailSubject(report, reportConfiguration); + this.HasFailedTests = report.hasFailedTests(reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); + + if (report.testResultSummary != null) { + this.AllTests = new TestResultSummaryViewModel(null, report.testResultSummary, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); + } + + this.InitializeSummaryGroupViewModel(report, reportConfiguration); + this.ShowAssociatedChanges = reportConfiguration.$reportDataConfiguration.$includeCommits; + if (this.ShowAssociatedChanges) { + this.InitializeAssociatedChanges(report, reportConfiguration.$pipelineConfiguration); + } + + this.InitializeTestResultGroups(report, reportConfiguration); + + this.TestTabLink = LinkHelper.getTestTabLink(reportConfiguration.$pipelineConfiguration); + this.DataMissing = report.$dataMissing; + } + + private InitializePhases(report: Report): void { + const phases: PhaseViewModel[] = []; + if (isNullOrUndefined(report.$phases) || report.$phases.length < 1) { + return; + } + + report.$phases.forEach(phase => { + phases.push(new PhaseViewModel(phase)); + }); + + this.Phases = new PhaseViewModelWrapper(); + this.Phases.PhaseViewModel = phases; + + if (this.HasCanceledPhases) { + this.PhaseIssuesSummary = new PhaseIssuesViewModel(report.$phases); + } + } + + private SetMailSubject(report: Report, reportConfig: ReportConfiguration): void { + var subject = reportConfig.$mailConfiguration.$mailSubject; + + if (subject.includes("{passPercentage}")) { + var passPercentage = this.GetPassPercentage(report, reportConfig.$reportDataConfiguration.$includeOthersInTotal); + subject = subject.replace("{passPercentage}", passPercentage); + } + + if (subject.includes("{environmentStatus}")) { + subject = subject.replace("{environmentStatus}", report.getEnvironmentStatus()); + } + reportConfig.$mailConfiguration.$mailSubject = subject; + } + + private InitializeAssociatedChanges(report: Report, pipelineConfig: PipelineConfiguration): void { + if (!isNullOrUndefined(report.$associatedChanges) && report.$associatedChanges.length > 0) { + this.AssociatedChanges = new ChangeViewModelWrapper(); + this.AssociatedChanges.ChangeViewModel = []; + report.$associatedChanges.forEach(associatedChange => { + this.AssociatedChanges.ChangeViewModel.push(new ChangeViewModel(associatedChange, pipelineConfig)); + }); + } + } + + private InitializeSummaryGroupViewModel(report: Report, reportConfiguration: ReportConfiguration): void { + this.SummaryGroups = new TestSummaryGroupViewModelWrapper(); + this.SummaryGroups.TestSummaryGroupViewModel = []; + if (!isNullOrUndefined(report.$testSummaryGroups)) { + report.$testSummaryGroups.forEach(summaryGroup => { + reportConfiguration.$reportDataConfiguration.$groupTestSummaryBy.forEach(group => { + if (summaryGroup.groupedBy == group) { + console.log(`Creating summary group viewmodel for ${summaryGroup.groupedBy}`); + this.SummaryGroups.TestSummaryGroupViewModel.push(new TestSummaryGroupViewModel(summaryGroup, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal)); + } + }); + }); + } + } + + private InitializeTestResultGroups(report: Report, reportConfig: ReportConfiguration): void { + this.TestResultsGroups = new TestResultsGroupViewModelWrapper(); + this.TestResultsGroups.TestResultsGroupViewModel = []; + + if (report.filteredResults != null) { + report.filteredResults.forEach(testResultGroupModel => { + var testResultsGroupViewModel = new TestResultsGroupViewModel(testResultGroupModel, reportConfig); + this.TestResultsGroups.TestResultsGroupViewModel.push(testResultsGroupViewModel); + }); + } + + this.HasFilteredTests = report.hasFilteredTests; + + if (this.TestResultsGroups.TestResultsGroupViewModel.length > 0) { + const testResultsConfig = reportConfig.$reportDataConfiguration.$testResultsConfig; + if (testResultsConfig.$includePassedTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.PassedTests.TestResultViewModel.length > 0).length > 0; + } + if (testResultsConfig.$includeFailedTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.FailedTests.TestResultViewModel.length > 0).length > 0; + } + if (testResultsConfig.$includeOtherTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.OtherTests.TestResultViewModel.length > 0).length > 0; + } + } + } + + private GetPassPercentage(report: Report, includeOthersInTotal: boolean): string { + var summary = report.testResultSummary; + let passedTests = 0, totalTests = 0; + if (summary != null) { + + const passedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestOutcome.Passed]; + passedTests = isNullOrUndefined(passedTestsAggregation) ? 0 : passedTestsAggregation.count; + + const failedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestOutcome.Failed]; + const failedTests = isNullOrUndefined(failedTestsAggregation) ? 0 : failedTestsAggregation.count; + + totalTests = summary.aggregatedResultsAnalysis.totalTests; + + if (!includeOthersInTotal) { + totalTests = passedTests + failedTests; + } + } + + return TestResultsHelper.getTestOutcomePercentageString(passedTests, totalTests); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts new file mode 100644 index 00000000..d3e64757 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts @@ -0,0 +1,158 @@ +import { MailConfiguration } from "../../config/mail/MailConfiguration"; +import { Report } from "../Report"; +import { RecipientsConfiguration } from "../../config/mail/RecipientsConfiguration"; +import { isNullOrUndefined } from "util"; +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +import { StringUtils } from "../../utils/StringUtils"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ChangeModel } from "../ChangeModel"; + +export class MailAddressViewModel { + public cc: string[] = []; + + public from: string; + public to: string[] = []; + + private defaultDomain: string; + + constructor(report: Report, mailConfig: MailConfiguration) { + this.from = mailConfig.$smtpConfig.$userName; + this.defaultDomain = mailConfig.$defaultDomain; + + console.log("computing email addresses for to section"); + this.to = this.getMailAddresses(report, mailConfig.$toRecipientsConfig); + + console.log("computing email addresses for Cc section"); + this.cc = this.getMailAddresses(report, mailConfig.$ccRecipientsConfig); + } + + private getMailAddresses(report: Report, recipientsConfiguration: RecipientsConfiguration): string[] { + var addressHashSet = new Set(); + + if (recipientsConfiguration.$includeTestOwners) { + const owners = this.getFailedTestOwners(report); + owners.forEach(o => addressHashSet.add(o)); + } + + if (recipientsConfiguration.$includeActiveBugOwners) { + const bugOwners = this.getActiveBugOwnersForFailedTests(report); + bugOwners.forEach(o => addressHashSet.add(o)); + } + + if (recipientsConfiguration.$includeChangesetOwners) { + const changesetOwners = this.getChangesetOwners(report.$associatedChanges); + changesetOwners.forEach(o => addressHashSet.add(o)); + } + + if (recipientsConfiguration.$includeCreatedBy) { + if (!isNullOrUndefined(report.createdBy)) { + addressHashSet.add(report.createdBy.uniqueName); + } + } + + if(!isNullOrUndefined(recipientsConfiguration.$defaultRecipients)) { + recipientsConfiguration.$defaultRecipients.split(";").forEach(a => addressHashSet.add(a)); + } + return this.filterValidMailAddresses(addressHashSet); + } + + private getFailedTestOwners(report: Report): string[] { + var mailAddresses: string[] = []; + if (!isNullOrUndefined(report.$failedTestOwners)) { + report.$failedTestOwners.forEach(identity => { + var mailAddress = this.getMailAddressFromIdentityRef(identity); + if (!StringUtils.isNullOrWhiteSpace(mailAddress)) { + mailAddresses.push(mailAddress); + } + }); + } + + console.log(`Failed Test owners - ${mailAddresses.join(",")}`); + return mailAddresses; + } + + private getActiveBugOwnersForFailedTests(report: Report): string[] { + if (report.filteredResults == null) { + return []; + } + + const bugOwners: string[] = []; + + report.filteredResults.forEach(group => { + if (group.testResults.has(TestOutcome.Failed)) { + group.testResults.forEach(tr => { + tr.forEach(tr => { + tr.associatedBugs.forEach(bug => { + const bugState = bug.fields["System.State"] as string; + if (!isNullOrUndefined(bugState) && bugState.toLowerCase() == "Active".toLowerCase()) { + bugOwners.push(bug.fields["System.AssignedTo"]); + } + }); + }); + }); + } + }); + + console.log(`Failed Test owners - ${bugOwners.join(",")}`); + return bugOwners; + } + + private getChangesetOwners(associatedChanges: ChangeModel[]): string[] { + var mailAddresses: string[] = []; + if (!isNullOrUndefined(associatedChanges) && associatedChanges.length < 1) { + console.log("No changeset owner mail addresses"); + return mailAddresses; + } + + associatedChanges.forEach(associatedChange => { + var mailAddress = associatedChange.$author.uniqueName; + if (StringUtils.isNullOrWhiteSpace(mailAddress)) { + console.log(`Unable to get mail address for associated change - ${associatedChange.$id}`); + } + else { + mailAddresses.push(mailAddress); + } + }); + + console.log(`Changeset owner mail addresses - ${mailAddresses.join(",")}`); + return mailAddresses; + } + + private filterValidMailAddresses(addressHashSet: Set): string[] { + var mailAddresses: string[] = []; + addressHashSet.forEach(address => { + var validAddress = this.getValidEmailAddress(address); + if (!StringUtils.isNullOrWhiteSpace(validAddress)) { + mailAddresses.push(validAddress); + } + }); + return mailAddresses; + } + + private getValidEmailAddress(address: string): string { + if (!StringUtils.isNullOrWhiteSpace(address) && !this.isValidEmail(address)) { + console.log(`Address ${address} is not a valid email address. Adding domain: ${this.defaultDomain}`); + address = `${address}@${this.defaultDomain}`; + } + + return address; + } + + private isValidEmail(email: string): boolean { + var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(String(email)); + } + + private getMailAddressFromIdentityRef(identity: IdentityRef): string { + if (!identity.isContainer) { + return this.getUniqueName(identity); + } + + console.log(`Not fetching email address for container - ${identity.displayName}`); + return null; + } + + private getUniqueName(identity: IdentityRef): string { + return identity.uniqueName == null ? identity.displayName : identity.uniqueName; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts new file mode 100644 index 00000000..32b50c1f --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts @@ -0,0 +1,30 @@ +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { TaskResultViewModel, TaskResultViewModelWrapper } from "./TaskResultViewModel"; +import { PhaseModel } from "../PhaseModel"; +import { TaskModel } from "../TaskModel"; + +export class PhaseIssuesViewModel { + ///

+ /// Use TaskResultViewModel as Phase level issue as the viewmodel is same + /// + public Tasks: TaskResultViewModelWrapper = new TaskResultViewModelWrapper(); + public Name: string; + + constructor(phases: PhaseModel[]) { + this.Name = "Phase Issues"; + this.Tasks.TaskResultViewModel = []; + phases.forEach(phase => { + if (phase != null && phase.$jobs != null) { + const canceledJobs = phase.$jobs.filter(job => job.$jobStatus == TaskStatus.Canceled); + if (canceledJobs.length > 0) { + var failedJobsAsTasks = canceledJobs.map(job => { + return new TaskModel(job.$jobName, job.$jobStatus, job.$issues, null, null, null); + }); + var taskResViewModel = new TaskResultViewModel(failedJobsAsTasks); + taskResViewModel.IssuesSummary.ErrorMessage = `Failed on ${canceledJobs.length}/${phase.$jobs.length} Agents`; + this.Tasks.TaskResultViewModel.push(taskResViewModel); + } + } + }); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts new file mode 100644 index 00000000..0b622765 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts @@ -0,0 +1,43 @@ +import { DeploymentJobViewModel } from "./DeploymentJobViewModel"; +import { PhaseModel } from "../PhaseModel"; +import { TimeFormatter } from "../helpers/TimeFormatter"; + +export class PhaseViewModelWrapper { + public PhaseViewModel: PhaseViewModel[]; +} + +export class PhaseViewModel { + public DeploymentJob: DeploymentJobViewModel; + public TasksDuration: string; + public Status: string; + public Rank: number; + public Name: string; + + constructor(phase: PhaseModel) { + this.Status = phase.$status; + this.Rank = phase.$rank; + this.Name = phase.$name; + this.InitializeDeploymentJobs(phase); + } + + private InitializeDeploymentJobs(phase: PhaseModel) { + const deploymentJobs = phase.$jobs; + + if (deploymentJobs.length > 0) { + this.DeploymentJob = new DeploymentJobViewModel(deploymentJobs); + this.InitializeTasksDuration(); + } + else { + // This can happen if we have an empty phase or a phase with only disabled steps + console.warn(`No deployment jobs found in phase ${this.Name}`); + } + } + + private InitializeTasksDuration(): void { + // Evaluate job duration and format it + if (this.DeploymentJob.MaxTaskFinishTime != null && this.DeploymentJob.MinTaskStartTime != null) { + this.TasksDuration = `${TimeFormatter.FormatDuration( + this.DeploymentJob.MaxTaskFinishTime.getTime() - this.DeploymentJob.MinTaskStartTime.getTime())}`; + } + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts new file mode 100644 index 00000000..641b3cc3 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts @@ -0,0 +1,11 @@ +import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; + +export class ReleaseEnvironmentViewModel { + public EnvironmentName: string; + public EnvironmentOwnerEmail: string; + + constructor(environment: ReleaseEnvironment) { + this.EnvironmentName = environment == null ? null : environment.name; + this.EnvironmentOwnerEmail = environment != null && environment.owner != null ? environment.owner.uniqueName : null; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts new file mode 100644 index 00000000..e4517fee --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts @@ -0,0 +1,15 @@ +import { LinkHelper } from "../helpers/LinkHelper"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReleaseReference } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; + +export class ReleaseReferenceViewModel { + public Id: number; + public Name: string; + public Url: string; + + constructor(config: PipelineConfiguration, releaseReference: ReleaseReference) { + this.Id = releaseReference.id; + this.Name = releaseReference.name; + this.Url = LinkHelper.getReleaseSummaryLink(config); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts new file mode 100644 index 00000000..c240773f --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts @@ -0,0 +1,35 @@ +import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { LinkHelper } from "../helpers/LinkHelper"; +import { ReleaseEnvironmentViewModel } from "./ReleaseEnvironmentViewModel"; +import { isNullOrUndefined } from "util"; + +export class ReleaseViewModel { + public CurrentEnvironment: ReleaseEnvironmentViewModel; + public ReleaseDefinitionName: string; + public ReleaseDefinitionUrl: string; + public ReleaseId: number; + public ReleaseName: string; + public ReleaseSummaryUrl: string; + public ReleaseLogsLink: string; + + constructor(currentEnvironment: ReleaseEnvironment, releaseConfig: PipelineConfiguration) { + if (currentEnvironment != null) { + this.CurrentEnvironment = new ReleaseEnvironmentViewModel(currentEnvironment); + this.ReleaseDefinitionName = currentEnvironment.releaseDefinition == null ? null : currentEnvironment.releaseDefinition.name; + + if (currentEnvironment.releaseDefinition != null) { + this.ReleaseDefinitionUrl = LinkHelper.getReleaseDefinitionLink(releaseConfig, + currentEnvironment.releaseDefinition.id); + } + + this.ReleaseName = currentEnvironment.release == null ? null : currentEnvironment.release.name; + } + + this.ReleaseId = releaseConfig.$pipelineId; + if(!isNullOrUndefined(currentEnvironment.release) && !isNullOrUndefined(currentEnvironment.release._links) && !isNullOrUndefined(currentEnvironment.release._links.web)) { + this.ReleaseSummaryUrl = currentEnvironment.release._links.web.href; + } + this.ReleaseLogsLink = LinkHelper.getReleaseLogsTabLink(releaseConfig); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts new file mode 100644 index 00000000..5145e0b7 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts @@ -0,0 +1,63 @@ +import { TaskIssueViewModel, TaskIssueViewModelWrapper } from "./TaskIssueViewModel"; +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { StringUtils } from "../../utils/StringUtils"; +import { TaskModel } from "../TaskModel"; + +export class TaskIssueSummaryViewModel { + public Issues: TaskIssueViewModelWrapper; + public ErrorMessage: string = ""; + public ErrorCount: number = 0; + public WarningCount: number = 0; + + constructor(tasks: TaskModel[]) { + var allIssues: TaskIssueViewModel[] = []; + this.ErrorMessage = `Failed on ${tasks.filter(t => t.$status == TaskStatus.Failed || t.$status == TaskStatus.Canceled).length}/${tasks.length} Agents`; + tasks.forEach(task => { + if (task.$issues != null && task.$issues.length > 0) { + task.$issues.forEach(issue => { + if (!StringUtils.isNullOrWhiteSpace(issue.$message)) { + if (issue.$issueType.toLowerCase() == IssueTypeConstants.Error) { + this.ErrorCount++; + } + else if (issue.$issueType.toLowerCase() == IssueTypeConstants.Warning) { + this.WarningCount++; + } + + allIssues.push(new TaskIssueViewModel(issue.$message, issue.$issueType, task.$agentName)); + } + }); + } + }); + this.Issues = new TaskIssueViewModelWrapper(); + this.Issues.TaskIssueViewModel = this.TruncateIssues(allIssues); + } + + public TruncateIssues(issues: TaskIssueViewModel[], characterLimit: number = 1000): TaskIssueViewModel[] { + const truncatedIssues: TaskIssueViewModel[] = []; + var warningIssues = issues.filter(t => t.IssueType.toLowerCase() != IssueTypeConstants.Error); + var errorIssues = issues.filter(t => t.IssueType.toLowerCase() == IssueTypeConstants.Error); + + const sortedIssues: TaskIssueViewModel[] = []; + sortedIssues.push(...warningIssues); + sortedIssues.push(...errorIssues); + + let currentCharCount = 0; + for (var i = 0; i < sortedIssues.length; i++) { + const issue = sortedIssues[i]; + if (currentCharCount >= characterLimit) { + return truncatedIssues; + } + + issue.Message = issue.Message.substring(0, characterLimit - currentCharCount); + currentCharCount += issue.Message.length; + truncatedIssues.push(issue); + } + + return truncatedIssues; + } +} + +export class IssueTypeConstants { + public static readonly Error = "error"; + public static readonly Warning = "warning"; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts new file mode 100644 index 00000000..8dee1c68 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts @@ -0,0 +1,16 @@ +export class TaskIssueViewModelWrapper { + public TaskIssueViewModel: TaskIssueViewModel[]; +} + +export class TaskIssueViewModel { + + public Message: string; + public IssueType: string; + public AgentName: string; + + constructor(issueMessage: string, issueType: string, agentName: string) { + this.Message = `(${agentName}) ${issueMessage.trim()}`; + this.IssueType = issueType; + this.AgentName = agentName; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts new file mode 100644 index 00000000..66006a60 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts @@ -0,0 +1,103 @@ +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { TaskIssueSummaryViewModel } from "./TaskIssueSummaryViewModel"; +import { TaskModel } from "../TaskModel"; +import { TimeFormatter } from "../helpers/TimeFormatter"; + +export class TaskResultViewModelWrapper { + public TaskResultViewModel: TaskResultViewModel[] +} + +export class TaskResultViewModel { + + public Duration: string; + public HasFailed: boolean; + public HasSkipped: boolean; + public NotYetRun: boolean; // tasks ahead of current email task + public HasPartiallySucceeded: boolean; + public HasNotRunOnSomeAgents: boolean; + public GotCancelled: boolean; + public NotRunMessage: string; + public IssuesSummary: TaskIssueSummaryViewModel; + public Name: string; + public StartTime: string; + public Status: string; + + constructor(tasks: TaskModel[]) { + this.Name = tasks.length > 0 ? tasks[0].$name : ""; + + this.HasFailed = tasks.filter(t => t.$status == TaskStatus.Failed || t.$status == TaskStatus.Canceled).length > 0; + this.HasSkipped = tasks.filter(t => t.$status == TaskStatus.Skipped).length == tasks.length; + this.NotYetRun = tasks.filter(t => t.$status == TaskStatus.InProgress || t.$status == TaskStatus.Unknown || t.$status == TaskStatus.Pending).length > 0; + this.HasPartiallySucceeded = tasks.filter(t => t.$status == TaskStatus.PartiallySucceeded).length > 0; + this.GotCancelled = tasks.filter(t => t.$status == TaskStatus.Canceled).length > 0; + + const inProgressTasks = tasks.filter(t => t.$status == TaskStatus.InProgress); + if(inProgressTasks.length == 1) { + // Must be this task - Mark it as completed assuming we will pass + // If we don't, then the email report won't be sent with this data + this.NotYetRun = false; + } + + if (tasks.length > 1) { + this.HasNotRunOnSomeAgents = tasks.filter(t => t.$status == TaskStatus.Skipped).length > 0; + this.NotRunMessage = `Not run on ${tasks.filter(t => t.$status == TaskStatus.Skipped).length}/${tasks.length} agents`; + } + + this.IssuesSummary = new TaskIssueSummaryViewModel(tasks); + + // No point in calculating duration for skipped/cancelled/not-yet-run tasks + if (!this.HasSkipped && !this.NotYetRun && !this.GotCancelled) { + this.InitializeDuration(tasks.filter(t => t.$status != TaskStatus.Skipped)); + } else { + this.Duration = ""; + } + } + + private InitializeDuration(tasks: TaskModel[]): void { + if (tasks.length == 1) { + var firstTask = tasks[0]; + if (firstTask.$finishTime != null && firstTask.$startTime != null) { + this.Duration = TimeFormatter.FormatDuration(this.getTimeDiff(firstTask)); + } + } + else { + const nonNullTasks = tasks.filter(t => t.$finishTime != null && t.$startTime != null); + if (nonNullTasks.length > 0) { + var minTime = this.getMinTime(nonNullTasks); + var maxTime = this.getMaxTime(nonNullTasks); + + if (minTime != null && maxTime != null) { + const minTimeStr = TimeFormatter.FormatDuration(minTime); + const maxTimeStr = TimeFormatter.FormatDuration(maxTime); + this.Duration = minTimeStr == maxTimeStr ? minTimeStr : `${minTimeStr} - ${maxTimeStr}`; + } + } + } + } + + private getMinTime(tasks: TaskModel[]): number { + let minTime = this.getTimeDiff(tasks[0]); + for (var i = 1; i < tasks.length; i++) { + const diffTime = this.getTimeDiff(tasks[i]); + if (diffTime < minTime) { + minTime = diffTime; + } + } + return minTime; + } + + private getMaxTime(tasks: TaskModel[]): number { + let maxTime = this.getTimeDiff(tasks[0]); + for (var i = 1; i < tasks.length; i++) { + const diffTime = this.getTimeDiff(tasks[i]); + if (diffTime > maxTime) { + maxTime = diffTime; + } + } + return maxTime; + } + + private getTimeDiff(task: TaskModel): number { + return task.$finishTime.getTime() - task.$startTime.getTime(); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts new file mode 100644 index 00000000..182b0e6c --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts @@ -0,0 +1,30 @@ +import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; +import { TestResultsHelper } from "../helpers/TestResultsHelper"; + +export class TestInfoByPriorityViewModelWrapper { + public TestInfoByPriorityViewModel: TestInfoByPriorityViewModel[]; +} + +export class TestInfoByPriorityViewModel { + public Priority: number; + public PassingRate: string; + public TestCount: number; + + constructor(priority: number, + testCountByOutcome: Map, + includeOthersInTotal: boolean) { + this.Priority = priority; + this.TestCount = TestResultsHelper.getTotalTestCountBasedOnUserConfigurationPriority( + testCountByOutcome, includeOthersInTotal); + if (this.TestCount > 0) { + var passingTests = this.getPassingTestCountByOutcome(testCountByOutcome); + this.PassingRate = TestResultsHelper.getTestOutcomePercentageString(passingTests, this.TestCount); + } + } + + private getPassingTestCountByOutcome(testCountByOutcome: Map): number { + return testCountByOutcome.has(TestOutcomeForPriority.Passed) + ? testCountByOutcome.get(TestOutcomeForPriority.Passed) + : 0; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts new file mode 100644 index 00000000..c25b9140 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts @@ -0,0 +1,50 @@ +import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TimeFormatter } from "../helpers/TimeFormatter"; +import { TestResultSummary, TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestResultsHelper } from "../helpers/TestResultsHelper"; +import { isNullOrUndefined } from "util"; + +export class TestResultSummaryViewModel { + public static readonly MaxSupportedPriority = 2; + public Duration: string; + public FailedTests: number; + public OtherTests: number; + public PassedTests: number; + public PassingRate: string; + public TotalTests: number; + public Url: string; + + constructor(summaryItemModel: TestSummaryItemModel, summary: TestResultSummary, pipelineConfiguration: PipelineConfiguration, includeOthersInTotal: boolean) { + if (summaryItemModel != null) { + this.PassedTests = summaryItemModel.getPassedTestsCount(); + this.FailedTests = summaryItemModel.getFailedTestsCount(); + this.OtherTests = summaryItemModel.getOtherTestsCount(); + + this.TotalTests = TestResultsHelper.getTotalTestCountBasedOnUserConfiguration(summaryItemModel.$testCountByOutcome, + includeOthersInTotal); + + this.PassingRate = TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); + + this.Duration = TimeFormatter.FormatDuration(summaryItemModel.$duration); + + this.Url = pipelineConfiguration.getTestTabLink(); + } + else if (summary != null) { + const passedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestOutcome.Passed]; + const failedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestOutcome.Failed]; + this.PassedTests = isNullOrUndefined(passedAnalysis) ? 0 : passedAnalysis.count; + this.FailedTests = isNullOrUndefined(failedAnalysis) ? 0 : failedAnalysis.count; + this.TotalTests = summary.aggregatedResultsAnalysis.totalTests; + this.OtherTests = this.TotalTests - this.PassedTests - this.FailedTests; + + if (!includeOthersInTotal) { + this.TotalTests -= this.OtherTests; + } + + this.Duration = TimeFormatter.FormatDurationStr(summary.aggregatedResultsAnalysis.duration); + this.PassingRate = TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); + this.Url = pipelineConfiguration.getTestTabLink(); + } + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts new file mode 100644 index 00000000..a171b62d --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts @@ -0,0 +1,96 @@ +import { WorkItemViewModel, WorkItemViewModelWrapper } from "./WorkItemViewModel"; +import { TestResultModel } from "../testresults/TestResultModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { StringUtils } from "../../utils/StringUtils"; +import { LinkHelper } from "../helpers/LinkHelper"; +import { TimeFormatter } from "../helpers/TimeFormatter"; +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +import { DisplayNameHelper } from "../../utils/DisplayNameHelper"; +import { ReleaseReferenceViewModel } from "./ReleaseReferenceViewModel"; +import { PipelineType } from "../../config/pipeline/PipelineType"; +import { BuildReferenceViewModel } from "./BuildReferenceViewModel"; +import { isNullOrUndefined } from "util"; + +export class TestResultViewModelWrapper { + public TestResultViewModel: TestResultViewModel[]; +} + +export class TestResultViewModel { + private readonly StackTraceLineCount = 5; + public AssociatedBugs: WorkItemViewModelWrapper; + public CreateBugLink: string; + public Duration: string; + public ErrorMessage: string; + public FailingSinceBuild: any; + public FailingSinceRelease: ReleaseReferenceViewModel; + public FailingSinceTime: string; + public Id: number; + public Owner: string; + public Priority: string; + public StackTrace: string; + public TestCaseTitle: string; + public TestOutcome: string; + public Url: string; + + constructor(testResultModel: TestResultModel, config: PipelineConfiguration) { + const result = testResultModel.testResult; + this.Id = result.id; + this.TestCaseTitle = result.testCaseTitle; + this.ErrorMessage = ""; + this.TestOutcome = result.outcome; + this.StackTrace = ""; + + if (result.priority != 255) { + this.Priority = DisplayNameHelper.getPriorityDisplayName(result.priority == null ? "" : result.priority.toString()); + } + + this.InitializeAssociatedBugs(config, testResultModel.associatedBugs); + + this.Url = LinkHelper.getTestResultLink(config, result.testRun.id, this.Id); + this.Owner = result.owner == null ? null : result.owner.displayName; + + if (result.failingSince != null) { + const failingSincePipeline: any = config.$pipelineType == PipelineType.Build ? result.failingSince.release : result.failingSince.build; + const failingSinceNotCurrent = failingSincePipeline == null ? false : failingSincePipeline.id != config.$pipelineId; + + if (failingSinceNotCurrent) { + this.FailingSinceTime = result.failingSince.date.toDateString(); + + if (result.failingSince.release != null && result.failingSince.release.id > 0) { + this.FailingSinceRelease = new ReleaseReferenceViewModel(config, result.failingSince.release); + } + if (result.failingSince.build != null && result.failingSince.build.id > 0) { + this.FailingSinceBuild = new BuildReferenceViewModel(config, null, result.failingSince.build); + } + } + } + + if(isNullOrUndefined(result.durationInMs)) { + if(!isNullOrUndefined(result.startedDate) && !isNullOrUndefined(result.completedDate)) { + result.durationInMs = result.completedDate.getTime() - result.startedDate.getTime(); + } + + if(isNullOrUndefined(result.durationInMs) || result.durationInMs < 0) { + // unknown duration - assume test didn't run instead of displaying "Undefined/NaN" in email + result.durationInMs = 0; + } + } + this.Duration = TimeFormatter.FormatDuration(result.durationInMs); + this.CreateBugLink = LinkHelper.getCreateBugLinkForTest(config, testResultModel.testResult); + } + + private InitializeAssociatedBugs(config: PipelineConfiguration, associatedBugs: WorkItem[]): void { + this.AssociatedBugs = new WorkItemViewModelWrapper(); + this.AssociatedBugs.WorkItemViewModel = []; + if (associatedBugs == null) { + return; + } + + associatedBugs.forEach(workItem => { + if (workItem.id != null) { + this.AssociatedBugs.WorkItemViewModel.push(new WorkItemViewModel(config, workItem)); + } + }); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts new file mode 100644 index 00000000..363c1743 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts @@ -0,0 +1,56 @@ +import { TestResultViewModel, TestResultViewModelWrapper } from "./TestResultViewModel"; +import { ReportConfiguration } from "../../config/ReportConfiguration"; +import { TestResultsGroupModel } from "../testresults/TestResultGroupModel"; +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +import { DisplayNameHelper } from "../../utils/DisplayNameHelper"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestResultModel } from "../testresults/TestResultModel"; +import { TcmHelper } from "../../providers/tcmproviders/TcmHelper"; + +export class TestResultsGroupViewModelWrapper { + public TestResultsGroupViewModel: TestResultsGroupViewModel[]; +} + +export class TestResultsGroupViewModel { + public FailedTests: TestResultViewModelWrapper = new TestResultViewModelWrapper(); + public GroupName: string; + public OtherTests: TestResultViewModelWrapper = new TestResultViewModelWrapper(); + public PassedTests: TestResultViewModelWrapper = new TestResultViewModelWrapper(); + + constructor(resultsGroupModel: TestResultsGroupModel, reportConfig: ReportConfiguration) { + this.setGroupName(resultsGroupModel, reportConfig); + this.FailedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestOutcome.Failed]); + this.PassedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestOutcome.Passed]); + this.OtherTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, + TcmHelper.exceptOutcomes([TestOutcome.Failed, TestOutcome.Passed])); + } + + private setGroupName(resultsGroupModel: TestResultsGroupModel, reportConfig: ReportConfiguration): void { + var groupTestResultsBy = reportConfig.$reportDataConfiguration.$testResultsConfig.$groupTestResultsBy; + this.GroupName = groupTestResultsBy == GroupTestResultsBy.Priority ? + DisplayNameHelper.getPriorityDisplayName(resultsGroupModel.groupName) : + resultsGroupModel.groupName; + } + + private getTestResultViewModels( + resultsGroupModel: TestResultsGroupModel, + config: PipelineConfiguration, + testOutcomes: TestOutcome[]): TestResultViewModel[] { + return this.getTestResultsByOutcomes(resultsGroupModel, testOutcomes) + .map(result => new TestResultViewModel(result, config)); + } + + public getTestResultsByOutcomes( + source: TestResultsGroupModel, + outcomes: TestOutcome[]): TestResultModel[] { + const testResults: TestResultModel[] = []; + + outcomes.forEach(outcome => { + if (source.testResults.has(outcome)) { + testResults.push(...source.testResults.get(outcome)); + } + }); + return testResults; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts new file mode 100644 index 00000000..1e4c9b7a --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts @@ -0,0 +1,55 @@ +import { TestSummaryGroupModel } from "../testresults/TestSummaryGroupModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestSummaryItemViewModel, TestSummaryItemViewModelWrapper } from "./TestSummaryItemViewModel"; +import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; + +export class TestSummaryGroupViewModelWrapper { + public TestSummaryGroupViewModel: TestSummaryGroupViewModel[]; +} + +export class TestSummaryGroupViewModel { + public GroupName: string; + public SummaryItems: TestSummaryItemViewModelWrapper; + private SupportedPriorityColumns: Set; + + constructor(testSummaryGroup: TestSummaryGroupModel, + config: PipelineConfiguration, + includeOthersInTotal: boolean) { + this.GroupName = this.getDescription(testSummaryGroup.groupedBy); + this.InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal); + + this.InitializeSupportedPriorityColumns(); + } + + private InitializeSummaryItems( + testSummaryGroup: TestSummaryGroupModel, + config: PipelineConfiguration, + includeOthersInTotal: boolean): void { + this.SummaryItems = new TestSummaryItemViewModelWrapper(); + this.SummaryItems.TestSummaryItemViewModel = []; + testSummaryGroup.runs.forEach(testSummaryItem => { + this.SummaryItems.TestSummaryItemViewModel.push(new TestSummaryItemViewModel(testSummaryGroup.groupedBy, testSummaryItem, config, includeOthersInTotal)); + }); + } + + private InitializeSupportedPriorityColumns(): void { + this.SupportedPriorityColumns = new Set(); + + this.SummaryItems.TestSummaryItemViewModel.forEach(item => + item.TestsByPriority.TestInfoByPriorityViewModel.forEach(testsByPriorityVm => { + if (testsByPriorityVm.Priority <= TestResultSummaryViewModel.MaxSupportedPriority) { + this.SupportedPriorityColumns.add(testsByPriorityVm.Priority); + } + }) + ); + } + + private getDescription(groupedBy: GroupTestResultsBy): string { + switch (groupedBy) { + case GroupTestResultsBy.Priority: return "Priority"; + case GroupTestResultsBy.Run: return "Test Run"; + default: return "Team"; + } + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts new file mode 100644 index 00000000..0d09f4cb --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts @@ -0,0 +1,49 @@ +import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; +import { TestInfoByPriorityViewModel, TestInfoByPriorityViewModelWrapper } from "./TestInfoByPriorityViewModel"; +import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; + +export class TestSummaryItemViewModelWrapper { + public TestSummaryItemViewModel: TestSummaryItemViewModel[]; +} + +export class TestSummaryItemViewModel extends TestResultSummaryViewModel { + public Name: string; + public TestsByPriority: TestInfoByPriorityViewModelWrapper = new TestInfoByPriorityViewModelWrapper(); + + constructor( + groupedBy: GroupTestResultsBy, + summaryItem: TestSummaryItemModel, + config: PipelineConfiguration, + includeOthersInTotal: boolean) { + super(summaryItem, null, config, includeOthersInTotal); + this.Name = (groupedBy == GroupTestResultsBy.Priority) ? + this.getDisplayName(summaryItem.$name) : + summaryItem.$name; + + this.setupPriorityData(summaryItem, includeOthersInTotal); + } + + private setupPriorityData(summaryItem: TestSummaryItemModel, includeOthersInTotal: boolean): void { + this.TestsByPriority.TestInfoByPriorityViewModel = []; + + const testCountForOutcomeByPriority: Map> = + summaryItem.$testCountForOutcomeByPriority; + + testCountForOutcomeByPriority.forEach((value: Map, priority: number) => { + if (priority <= TestResultSummaryViewModel.MaxSupportedPriority) { + this.TestsByPriority.TestInfoByPriorityViewModel.push(new TestInfoByPriorityViewModel(priority, value, includeOthersInTotal)); + } + }); + } + + public getDisplayName(priority: string): string { + const priorityInt = Number.parseInt(priority); + if (!isNaN(priorityInt) && priorityInt == 255) { + return "Priority unspecified"; + } + return `Priority: ${priority}`; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts new file mode 100644 index 00000000..b5f59f45 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts @@ -0,0 +1,37 @@ +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { LinkHelper } from "../helpers/LinkHelper"; +import { StringUtils } from "../../utils/StringUtils"; +import { isNullOrUndefined } from "util"; + +export class WorkItemViewModelWrapper { + public WorkItemViewModel: WorkItemViewModel[]; +} + +export class WorkItemViewModel { + public AssignedTo: string; + public ChangedDate: string; + public Id: number; + public State: string; + public Title: string; + public Url: string; + + constructor(config: PipelineConfiguration, workItem: WorkItem) { + if (workItem.id != null) { + this.Id = workItem.id; + this.Url = LinkHelper.getWorkItemLink(config, workItem.id); + } + + this.Title = workItem.fields["System.Title"]; + + // This is for display in email report only + var assignToRef = workItem.fields["System.AssignedTo"]; + // Prefer Display name to Unique Name in report + this.AssignedTo = isNullOrUndefined(assignToRef) ? "" : (StringUtils.isNullOrWhiteSpace(assignToRef.displayName) ? assignToRef.uniqueName : assignToRef.displayName); + // Unassigned workitem + this.AssignedTo = isNullOrUndefined(this.AssignedTo) ? "" : this.AssignedTo; + + this.State = workItem.fields["System.State"]; + this.ChangedDate = workItem.fields["System.ChangedDate"]; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/package.json b/Tasks/emailReportTask/emailReportTaskV2/package.json new file mode 100644 index 00000000..6b1b0d46 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/package.json @@ -0,0 +1,18 @@ +{ + "name": "azure-devops-emailreporttask", + "version": "1.0.0-preview.2", + "description": "For Private Use ONLY by Author. Not Supported in any way.", + "author": "", + "license": "ISC", + "main": "../../dist/emailReportExtension/emailReportTask/index.js", + "types": "../../dist/emailReportExtension/emailReportTask/index.d.ts", + "dependencies": { + "azure-devops-node-api": "^10.0.0", + "azure-pipelines-task-lib": "^2.8.0", + "nodemailer": "^6.3.0", + "object-to-xml": "^2.0.0", + "performance-now": "^2.1.0", + "reflect-metadata": "^0.1.13", + "xslt-processor": "^0.11.5" + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.ts new file mode 100644 index 00000000..dd3c7737 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.ts @@ -0,0 +1,67 @@ +import { IDataProviderFactory } from "./IDataProviderFactory"; +import { IDataProvider } from "./IDataProvider"; +import { IPostProcessor } from "./IPostProcessor"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { PipelineType } from "../config/pipeline/PipelineType"; +import { ReleaseDataProvider } from "./pipeline/ReleaseDataProvider"; +import { ReleaseRestClient } from "./restclients/ReleaseClient"; +import { TestOwnersDataProvider } from "./tcmproviders/TestOwnersDataProvider"; +import { TestSummaryDataProvider } from "./tcmproviders/TestSummaryDataProvider"; +import { TestResultsDataProvider } from "./tcmproviders/TestResultsDataProvider"; +import { WorkItemClient } from "./restclients/WorkItemClient"; +import { SendMailConditionProcessor } from "./SendMailConditionProcessor"; +import { BuildRestClient } from "./restclients/BuildClient"; +import { BuildDataProvider } from "./pipeline/BuildDataProvider"; +import { ITestResultsClient } from "./restclients/ITestResultsClient"; +import { BuildTestResultsClient } from "./restclients/BuildTestResultsClient"; +import { ReleaseTestResultsClient } from "./restclients/ReleaseTestResultsClient"; + +export class DataProviderFactory implements IDataProviderFactory { + + private pipelineConfig: PipelineConfiguration; + private dataProviders: IDataProvider[] = []; + private postProcessors: IPostProcessor[] = []; + + private testResultsClient: ITestResultsClient; + + constructor($pipelineConfig: PipelineConfiguration) { + this.pipelineConfig = $pipelineConfig; + } + + public getDataProviders(): IDataProvider[] { + if (this.dataProviders.length < 1) { + if (this.pipelineConfig.$pipelineType == PipelineType.Release) { + const pipelineRestClient = new ReleaseRestClient(this.pipelineConfig); + this.dataProviders.push(new ReleaseDataProvider(pipelineRestClient)); + } else { + const pipelineRestClient = new BuildRestClient(this.pipelineConfig); + this.dataProviders.push(new BuildDataProvider(pipelineRestClient)); + } + const testResultsClient = this.getTestResultsClient(); + const workItemClient = new WorkItemClient(this.pipelineConfig); + + this.dataProviders.push(new TestOwnersDataProvider(testResultsClient)); + this.dataProviders.push(new TestSummaryDataProvider(testResultsClient)); + this.dataProviders.push(new TestResultsDataProvider(testResultsClient, workItemClient)); + } + + return this.dataProviders; + } + + public getPostProcessors(): IPostProcessor[] { + if (this.postProcessors.length < 1) { + this.postProcessors.push(new SendMailConditionProcessor(this.getTestResultsClient())); + } + + return this.postProcessors; + } + + private getTestResultsClient(): ITestResultsClient { + if(this.testResultsClient == null) { + this.testResultsClient = this.pipelineConfig.$pipelineType == PipelineType.Build ? + new BuildTestResultsClient(this.pipelineConfig) : + new ReleaseTestResultsClient(this.pipelineConfig); + } + return this.testResultsClient; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.ts new file mode 100644 index 00000000..23f369bb --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.ts @@ -0,0 +1,7 @@ +import { Report } from "../model/Report"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ReportDataConfiguration } from "../config/report/ReportDataConfiguration"; + +export interface IDataProvider { + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.ts new file mode 100644 index 00000000..c5b47353 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.ts @@ -0,0 +1,7 @@ +import { IDataProvider } from "./IDataProvider"; +import { IPostProcessor } from "./IPostProcessor"; + +export interface IDataProviderFactory { + getDataProviders(): IDataProvider[]; + getPostProcessors(): IPostProcessor[]; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.ts new file mode 100644 index 00000000..60a2212d --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.ts @@ -0,0 +1,6 @@ +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { Report } from "../model/Report"; + +export interface IPostProcessor { + processReportAsync(reportConfig: ReportConfiguration, finalReport: Report): Promise; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.ts new file mode 100644 index 00000000..4f6acafa --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.ts @@ -0,0 +1,6 @@ +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; + +export interface IReportProvider { + createReportAsync(reportConfig: ReportConfiguration): Promise; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.ts new file mode 100644 index 00000000..3bb2fbbb --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.ts @@ -0,0 +1,79 @@ +import { IReportProvider } from "./IReportProvider"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { Report } from "../model/Report"; +import { IDataProviderFactory } from "./IDataProviderFactory"; +import { IDataProvider } from "./IDataProvider"; +import { IPostProcessor } from "./IPostProcessor"; +import { ReportFactory } from "../model/ReportFactory"; +import { ReportError } from "../exceptions/ReportError"; +import { DataProviderError } from "../exceptions/DataProviderError"; +import { PostProcessorError } from "../exceptions/PostProcessorError"; +import { TelemetryLogger } from "../telemetry/TelemetryLogger"; + +export class ReportProvider implements IReportProvider { + + private dataProviders: IDataProvider[] = []; + private postProcessors: IPostProcessor[] = []; + + constructor(dataProviderFactory: IDataProviderFactory) { + this.dataProviders.push(...dataProviderFactory.getDataProviders()); + this.postProcessors.push(...dataProviderFactory.getPostProcessors()); + } + + async createReportAsync(reportConfig: ReportConfiguration): Promise { + let finalReport: Report; + try { + const reportTaskArray = this.dataProviders.map(dataProvider => TelemetryLogger.InvokeWithPerfLogger(async () => this.callDataProvider(dataProvider, reportConfig), dataProvider.constructor.name)); + + const reports = await Promise.all(reportTaskArray); + finalReport = ReportFactory.mergeReports(reports); + + // Post Process data collected + const processorTasks = this.postProcessors.map(processor => TelemetryLogger.InvokeWithPerfLogger(async () => this.callPostProcessor(processor, reportConfig, finalReport), processor.constructor.name)); + // Wait for all processors + await Promise.all(processorTasks); + } + catch (err) { + ReportError.HandleError(err); + if (finalReport == null) finalReport = ReportFactory.createNewReport(reportConfig.$pipelineConfiguration); + finalReport.$dataMissing = true; + } + return finalReport; + } + + private async callDataProvider(dataProvider: IDataProvider, reportConfig: ReportConfiguration): Promise { + let report: Report = null; + try { + report = await dataProvider.getReportDataAsync(reportConfig.$pipelineConfiguration, reportConfig.$reportDataConfiguration); + } + catch (err) { + // Do not error out until all data providers are done + console.log(err); + if (!(err instanceof ReportError)) { + const reportError = new DataProviderError(`Error fetching data using ${dataProvider.constructor.name}: ${err.message}`); + reportError.innerError = err; + throw reportError; + } + throw err; + } + return report; + } + + private async callPostProcessor(postProcessor: IPostProcessor, reportConfig: ReportConfiguration, report: Report): Promise { + let retVal = false; + try { + retVal = await postProcessor.processReportAsync(reportConfig, report); + } + catch (err) { + // Do not error out until all post processors are done + console.log(err); + if (!(err instanceof ReportError)) { + const reportError = new PostProcessorError(`Error fetching data using ${postProcessor.constructor.name}: ${err.message}`); + reportError.innerError = err; + throw reportError; + } + throw err; + } + return retVal; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.ts new file mode 100644 index 00000000..57fba60b --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.ts @@ -0,0 +1,147 @@ +import { IPostProcessor } from "./IPostProcessor"; +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { SendMailCondition } from "../config/report/SendMailCondition"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ITestResultsClient } from "./restclients/ITestResultsClient"; +import { TestResultSummary, TestOutcome, TestCaseResult, TestResultsQuery } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { isNullOrUndefined } from "util"; +import { TcmHelper } from "./tcmproviders/TcmHelper"; +import { TestResultsQueryImpl } from "./restclients/AbstractTestResultsClient"; +import { EnumUtils } from "../utils/EnumUtils"; + +export class SendMailConditionProcessor implements IPostProcessor { + private testResultsClient: ITestResultsClient; + private readonly TestResultFieldsToQuery: string[] = ["TestCaseReferenceId", "OutcomeConfidence"]; + + constructor(testResultsClient: ITestResultsClient) { + this.testResultsClient = testResultsClient; + } + + public async processReportAsync(reportConfig: ReportConfiguration, report: Report): Promise { + var shouldSendMail = false; + if (!report.$dataMissing) { + const sendMailCondition = reportConfig.$sendMailCondition; + + shouldSendMail = sendMailCondition == SendMailCondition.Always; + if (!shouldSendMail) { + var hasTestFailures = report.hasFailedTests(reportConfig.$reportDataConfiguration.$includeOthersInTotal); + var hasFailedTasks = report.hasFailedTasks(); + var hasCanceledPhases = report.hasCanceledPhases(); + var hasFailure = hasTestFailures || hasFailedTasks || hasCanceledPhases; + + if ((sendMailCondition == SendMailCondition.OnFailure && hasFailure) + || (sendMailCondition == SendMailCondition.OnSuccess && !hasFailure)) { + shouldSendMail = true; + } + else if (sendMailCondition == SendMailCondition.OnNewFailuresOnly && hasFailure) { + // Always treat phase cancellation issues as new failure as we cannot distinguish/compare phase level issues + // Still compare failed tests and failed tasks where possible to reduce noise + if (hasCanceledPhases && !hasTestFailures && !hasFailedTasks) { + shouldSendMail = true; + console.log(`Has Phase cancellation(s) issues. Treating as new failure.`); + } + else { + console.log(`Looking for new failures, as the user send mail condition is '${EnumUtils.GetMailConditionString(sendMailCondition)}'.`); + shouldSendMail = !(await this.hasPreviousReleaseGotSameFailuresAsync(report, reportConfig.$pipelineConfiguration, hasTestFailures, hasFailedTasks)); + } + } + } + } + + report.$sendMailConditionSatisfied = shouldSendMail; + return shouldSendMail; + } + + public async hasPreviousReleaseGotSameFailuresAsync( + report: Report, + config: PipelineConfiguration, + hasTestFailures: boolean, + hasFailedTasks: boolean): Promise { + + var hasPrevGotSameFailures = report.hasPrevGotSameFailures(); + if (!isNullOrUndefined(hasPrevGotSameFailures) && hasPrevGotSameFailures) { + return hasPrevGotSameFailures; + } + + const hasPrevFailedTasks = report.hasPrevFailedTasks(); + if (report.testResultSummary == null) { + return false; + } + + if (hasTestFailures) { + var prevConfig = report.getPrevConfig(config); + if(isNullOrUndefined(prevConfig)) { + // we don't know anything about prev pipeline failures if we have no info - assume they are not same + return false; + } + var lastCompletedTestResultSummary = await this.testResultsClient.queryTestResultsReportAsync(prevConfig); + + var failedInCurrent = this.getFailureCountFromSummary(report.testResultSummary); + var failedinPrev = this.getFailureCountFromSummary(lastCompletedTestResultSummary); + + // Threshold is 10 to decide whether they are same failures + console.log(`Current Failures Found: '${failedInCurrent}'.`); + console.log(`Previous Failures Found: '${failedinPrev}'.`); + + var hasSameFailures = failedInCurrent == failedinPrev; + // No point in moving ahead if number of failures is different + if (hasSameFailures) { + var currFailedTestCaseRefIds = await this.fetchFailedTestCaseIdsAsync(config); + var prevFailedTestCaseRefIds = await this.fetchFailedTestCaseIdsAsync(prevConfig); + + const leftJoin = currFailedTestCaseRefIds.filter(c => !prevFailedTestCaseRefIds.includes(c)); + if (leftJoin.length > 0) { + console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); + hasSameFailures = false; + } else { + const rightJoin = prevFailedTestCaseRefIds.filter(p => !currFailedTestCaseRefIds.includes(p)); + if (rightJoin.length > 0) { + console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); + hasSameFailures = false; + } else { + console.log(`Failed Test Reference Ids match. No new failures found.`); + hasSameFailures = true; + } + } + } + return hasSameFailures; + } + else if (hasFailedTasks && hasPrevFailedTasks) { + return report.arePrevFailedTasksSame(); + } + return false; + } + + private getFailureCountFromSummary(testResultSummary: TestResultSummary): number { + const failedOutcome = testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestOutcome.Failed]; + return !isNullOrUndefined(failedOutcome) ? failedOutcome.count : 0; + } + + private async fetchFailedTestCaseIdsAsync(pipelineConfig: PipelineConfiguration): Promise { + var testSummary = await this.testResultsClient.getTestResultsDetailsAsync(null, [TestOutcome.Failed], pipelineConfig); + var resultsToQuery: TestCaseResult[] = []; + testSummary.resultsForGroup.forEach(r => resultsToQuery.push(...r.results)); + var testCaseIds: number[] = []; + + if (resultsToQuery.length > 0) { + // API supports only 100 results at a time + const tasks: Promise[] = []; + for (let i = 0, j = resultsToQuery.length; i < j; i += 100) { + const tempArray = resultsToQuery.slice(i, i + 100); + let query: TestResultsQuery = new TestResultsQueryImpl(); + query.fields = this.TestResultFieldsToQuery; + query.results = tempArray; + tasks.push(this.testResultsClient.getTestResultsByQueryAsync(query)); + } + + const resultQueries = await Promise.all(tasks); + resultQueries.forEach(rq => { + let tempIds = rq.results.filter(r => TcmHelper.isTestFlaky(r)).map(r1 => r1.testCaseReferenceId); + testCaseIds.push(...tempIds); + }); + } + + return testCaseIds; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts new file mode 100644 index 00000000..3b8e47cf --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts @@ -0,0 +1,47 @@ +import { TestResultsDetails, TestResultsDetailsForGroup, AggregatedResultsByOutcome, TestOutcome, TestCaseResult } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +import { isNullOrUndefined } from "util"; +import { TimeFormatter } from "../../model/helpers/TimeFormatter"; + +export abstract class AbstractTestResultsDetailsParser { + + protected testResultDetails: TestResultsDetails; + + constructor(testResultDetails: TestResultsDetails) { + this.testResultDetails = testResultDetails; + } + + public abstract getSummaryItems(): Array; + + public abstract getGroupByValue(group: TestResultsDetailsForGroup): string; + + /// + /// Get Duration, TotalTests & test count by outcome + /// Calculating total duration, as the tcm data has duration by test outcome only. + /// + protected parseBaseData(resultsForGroup: TestResultsDetailsForGroup, summaryItem: TestSummaryItemModel): void { + let duration: number = 0; + for (let item in TestOutcome) { + if (!isNaN(Number(item))) { + const resultsByOutCome = resultsForGroup.resultsCountByOutcome[Number(item)]; + if (!isNullOrUndefined(resultsByOutCome)) { + summaryItem.$testCountByOutcome.set(resultsByOutCome.outcome, resultsByOutCome.count); + duration += TimeFormatter.ConvertTimeStringToMilliSeconds(resultsByOutCome.duration); + } + } + } + + // // HACK - SHould get data directly from resultsGroup.resultsCountByOutcome - but that data is coming wrong + // resultsForGroup.results.forEach(r => { + // duration += isNaN(r.durationInMs) ? 0 : r.durationInMs; + // }); + + summaryItem.$duration = duration; + summaryItem.$totalTestCount = resultsForGroup.results.length; + } + + // // HACK + // private isMatch(result: TestCaseResult, outcome: TestOutcome, outcomeString: string): boolean { + // return (!isNullOrUndefined(result.outcome) && result.outcome == outcome.toString() && outcomeString == result.outcome.toLowerCase()); + // } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts new file mode 100644 index 00000000..136c92af --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts @@ -0,0 +1,20 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestResultDetailsParserForRun } from "./TestResultDetailsParserForRun"; +import { TestResultDetailsParserForPriority } from "./TestResultDetailsParserForPriority"; +import { DataProviderError } from "../../exceptions/DataProviderError"; + +export class TestResultDetailsParserFactory { + public static getParser(resultDetails: TestResultsDetails): AbstractTestResultsDetailsParser { + var groupByField = resultDetails.groupByField; + if (groupByField.toLowerCase() == "TestRun".toLowerCase()) { + return new TestResultDetailsParserForRun(resultDetails); + } + + if (groupByField.toLowerCase() == "Priority".toLowerCase()) { + return new TestResultDetailsParserForPriority(resultDetails); + } + + throw new DataProviderError(`TestResultsDetails by group ${groupByField} not supported`); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts new file mode 100644 index 00000000..10266b97 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts @@ -0,0 +1,76 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { InvalidTestResultDataError } from "../../exceptions/InvalidTestResultDataError"; + +export class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser { + + constructor(testResultDetails: TestResultsDetails) { + super(testResultDetails); + if (testResultDetails.groupByField.toUpperCase() != "Priority".toUpperCase()) { + throw new InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); + } + } + + public getSummaryItems(): TestSummaryItemModel[] { + const resultsForGroup = this.testResultDetails.resultsForGroup; + if (resultsForGroup != null && resultsForGroup.length > 0) { + return resultsForGroup.map(group => { + var priority = this.getPriority(group.groupByValue); + var summaryItem = new TestSummaryItemModel(priority.toString(), priority.toString()); + + this.parseBaseData(group, summaryItem); + return summaryItem; + }); + } + return []; + } + + public getGroupByValue(group: TestResultsDetailsForGroup): string { + return this.getPriority(group.groupByValue).toString(); + } + + public getTestResultsForRun(runId: number): Map { + const testResultsByPriority: Map> = this.getTestCountByPriorityInTestRun(); + return testResultsByPriority.has(runId) ? testResultsByPriority.get(runId) : new Map(); + } + + private getPriority(groupByValue: any): number { + let priority: number = Number.parseInt(groupByValue as string); + if (priority == null || priority == NaN) { + throw new InvalidTestResultDataError(`Expected priority value to be integer in ${groupByValue}`); + } + return priority; + } + + private getTestCountByPriorityInTestRun(): Map> { + var testResultsByPriority = new Map>(); + + this.testResultDetails.resultsForGroup.forEach(testResultsByGroup => { + var priority = this.getPriority(testResultsByGroup.groupByValue); + + testResultsByGroup.results.forEach(result => { + if (result.testRun == null) { + throw new InvalidTestResultDataError(`Test run field is null in Test result object with test id - ${result.id}`); + } + + const testRunId = Number.parseInt(result.testRun.id); + if (testRunId == null || testRunId == NaN) { + throw new InvalidTestResultDataError(`Unable to parse test run id to integer in ${result.testRun.id}`); + } + + if (!testResultsByPriority.has(testRunId)) { + testResultsByPriority.set(testRunId, new Map()); + } + + const resultsByPriorityForRun = testResultsByPriority.get(testRunId); + var testCountByPriority = resultsByPriorityForRun.has(priority) ? resultsByPriorityForRun.get(priority) : 0; + + resultsByPriorityForRun.set(priority, testCountByPriority + 1); + }); + }); + + return testResultsByPriority; + } + +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts new file mode 100644 index 00000000..84c8db87 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts @@ -0,0 +1,47 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +import { TestResultsDetailsForGroup, TestResultsDetails, TestResultGroupBy } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { InvalidTestResultDataError } from "../../exceptions/InvalidTestResultDataError"; + +export class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser { + + constructor(testResultDetails: TestResultsDetails) { + super(testResultDetails); + if (testResultDetails.groupByField.toUpperCase() != "TestRun".toUpperCase()) { + throw new InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); + } + } + + public getSummaryItems(): TestSummaryItemModel[] { + return this.testResultDetails.resultsForGroup.map(r => this.getTestRunSummaryInfo(r)); + } + + public getGroupByValue(group: TestResultsDetailsForGroup): string { + const runinfo = this.readGroupByValue(group); + return runinfo.name; + } + + private getTestRunSummaryInfo(resultsForGroup: TestResultsDetailsForGroup): TestSummaryItemModel { + console.log(`Getting Test summary data for test run - ${resultsForGroup.groupByValue.name}`); + const runinfo = this.readGroupByValue(resultsForGroup); + + var summaryItem = new TestSummaryItemModel(runinfo.name == null ? runinfo.id.toString() : runinfo.name, runinfo.id.toString()); + + this.parseBaseData(resultsForGroup, summaryItem); + + return summaryItem; + } + + private readGroupByValue(resultsForGroup: TestResultsDetailsForGroup): TestRunInfo { + const runinfo = new TestRunInfo(); + runinfo.id = resultsForGroup.groupByValue.id; + runinfo.name = resultsForGroup.groupByValue.name; + return runinfo; + } +} + +export class TestRunInfo { + public id: number; + + public name: string; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts new file mode 100644 index 00000000..3063382e --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts @@ -0,0 +1,113 @@ +import { IDataProvider } from "../IDataProvider"; +import { Report } from "../../model/Report"; +import { PipelineNotFoundError } from "../../exceptions/PipelineNotFoundError"; +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { PhaseModel } from "../../model/PhaseModel"; +import { JobModel } from "../../model/JobModel"; +import { TaskModel } from "../../model/TaskModel"; +import { IssueModel } from "../../model/IssueModel"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { ReportFactory } from "../../model/ReportFactory"; +import { BuildReport } from "../../model/BuildReport"; +import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; +import { Build, TaskResult, TimelineRecord, IssueType } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { Timeline } from "azure-devops-node-api/interfaces/TaskAgentInterfaces"; +import { isNullOrUndefined } from "util"; +import { RetryablePromise } from "../restclients/RetryablePromise"; +import { DataProviderError } from "../../exceptions/DataProviderError"; + +export class BuildDataProvider implements IDataProvider { + + private pipelineRestClient: IPipelineRestClient; + + constructor(pipelineRestClient: IPipelineRestClient) { + this.pipelineRestClient = pipelineRestClient; + } + + public async getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise { + const report = ReportFactory.createNewReport(pipelineConfig) as BuildReport; + const build = await this.getBuildAsync(pipelineConfig); + if (build == null) { + throw new PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); + } + + const timeline = await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getPipelineTimelineAsync(build.id), "GetBuildTimeline"); + const changes = await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getPipelineChangesAsync(build.id), "GetPipelineChanges"); + const phases = this.getPhases(timeline); + const lastCompletedBuild = await this.pipelineRestClient.getLastPipelineAsync(build.definition.id, null, build.sourceBranch) as Build; + const lastCompletedTimeline = lastCompletedBuild != null ? await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getPipelineTimelineAsync(lastCompletedBuild.id), "GetLastCompletedTimeline") : null; + + console.log("Fetched release data"); + report.setBuildData(build, timeline, lastCompletedBuild, lastCompletedTimeline, phases, changes); + + return report; + } + + private async getBuildAsync(pipelineConfig: PipelineConfiguration): Promise { + var build = await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getPipelineAsync(), "GetPipeline"); + if(isNullOrUndefined(build)) { + throw new DataProviderError(`Unable to find build with id: ${pipelineConfig.$pipelineId}`); + } + return build as Build; + } + + private getPhases(timeline: Timeline): PhaseModel[] { + const records = timeline.records.sort( (a: TimelineRecord, b: TimelineRecord) => this.getOrder(a) - this.getOrder(b)); + const phases = records.filter(r => r.type == "Phase"); + if(phases.length > 0) { + const jobs = records.filter(r => r.type == "Job"); + if(jobs.length > 0) { + const tasks = records.filter(r => r.type == "Task"); + const phaseModels = phases.map(phase => { + const jobModels = jobs + .filter(j => j.parentId == phase.id) + .map(j => { + const tasksForThisJob = tasks.filter(t => t.parentId == j.id); + const taskModels = tasksForThisJob.map(task => { + const issues: IssueModel[] = isNullOrUndefined(task.issues) || task.issues.length < 1 ? [] : + task.issues.map(i => new IssueModel(i.type == IssueType.Error ? "Error" : "Warning", i.message)); + return new TaskModel(task.name, this.getTaskState(task.result), issues, task.workerName, task.finishTime, task.startTime); + }); + return new JobModel(j.name, this.getTaskState(j.result), [], taskModels); + }); + return new PhaseModel( + phase.name, + jobModels, + isNullOrUndefined(phase.result) ? "Unknown" : phase.result.toString(), + this.getOrder(phase)); + }); + return phaseModels; + } + } + return []; + } + + private getTaskState(result: TaskResult): TaskStatus + { + switch (result) + { + case TaskResult.Succeeded: + return TaskStatus.Succeeded; + + case TaskResult.SucceededWithIssues: + return TaskStatus.PartiallySucceeded; + + case TaskResult.Failed: + return TaskStatus.Failed; + + case TaskResult.Canceled: + return TaskStatus.Canceled; + + case TaskResult.Skipped: + return TaskStatus.Skipped; + + default: + return TaskStatus.Unknown; + } + } + + private getOrder(timelineRecord: TimelineRecord) { + return isNullOrUndefined(timelineRecord.order) ? 0 : timelineRecord.order; + } + } \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts new file mode 100644 index 00000000..b6fd2d06 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts @@ -0,0 +1,121 @@ +import { IDataProvider } from "../IDataProvider"; +import { Report } from "../../model/Report"; +import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; +import { PipelineNotFoundError } from "../../exceptions/PipelineNotFoundError"; +import { Release, ReleaseEnvironment, DeployPhaseStatus, DeploymentJob, Artifact } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { DataProviderError } from "../../exceptions/DataProviderError"; +import { PhaseModel } from "../../model/PhaseModel"; +import { EnvironmentExtensions } from "../../utils/EnvironmentExtensions"; +import { JobModel } from "../../model/JobModel"; +import { TaskModel } from "../../model/TaskModel"; +import { IssueModel } from "../../model/IssueModel"; +import { ChangeModel } from "../../model/ChangeModel"; +import { ReleaseReport } from "../../model/ReleaseReport"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { ReportFactory } from "../../model/ReportFactory"; +import { RetryablePromise } from "../restclients/RetryablePromise"; +import { isNullOrUndefined } from "util"; + +export class ReleaseDataProvider implements IDataProvider { + + private pipelineRestClient: IPipelineRestClient; + + constructor(pipelineRestClient: IPipelineRestClient) { + this.pipelineRestClient = pipelineRestClient; + } + + async getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise { + const report = ReportFactory.createNewReport(pipelineConfig) as ReleaseReport; + const release = await this.getReleaseAsync(pipelineConfig); + if (release == null) { + throw new PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); + } + + const environment = this.getEnvironment(release, pipelineConfig); + const phases = this.getPhases(environment); + const lastCompletedRelease = await this.getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment); + + let changes: ChangeModel[] = []; + // check if last completed one isn't latter one, then changes don't make sense + if (lastCompletedRelease != null && lastCompletedRelease.id < release.id) { + console.log(`Getting changes between releases ${release.id} & ${lastCompletedRelease.id}`); + try { + changes = await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getPipelineChangesAsync(lastCompletedRelease.id), "GetPipelineChanges"); + } catch(err) { + // Changes happened in current release w.r.t previous one isn't strictly required to send mail - ignoring any errors + console.warn(`Error while comparing current release - '${release.id}' with previous one - '${lastCompletedRelease.id}': ${err}`); + } + } + else { + console.log("Unable to find any last completed release"); + } + + console.log("Fetched release data"); + report.setReleaseData(release, environment, lastCompletedRelease, phases, changes); + + return report; + } + + private async getReleaseAsync(pipelineConfig: PipelineConfiguration): Promise { + var release = await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getPipelineAsync(), "GetPipeline"); + if(isNullOrUndefined(release)) { + throw new DataProviderError(`Unable to find release with release id: ${pipelineConfig.$pipelineId}`); + } + return release as Release; + } + + private getEnvironment(release: Release, pipelineConfig: PipelineConfiguration): ReleaseEnvironment { + let environment: ReleaseEnvironment; + const environments = release.environments; + for (var i: number = 0; i < environments.length; i++) { + if (environments[i].id == pipelineConfig.$environmentId) { + environment = environments[i]; + break; + } + } + + if (pipelineConfig.$usePreviousEnvironment && environments.indexOf(environment) > 0) { + environment = environments[environments.indexOf(environment) - 1]; + } + + if (environment != null) { + return environment; + } + + throw new DataProviderError(`Unable to find environment with environment id - ${pipelineConfig.$environmentId} in release - ${release.id}`); + } + + private getPhases(environment: ReleaseEnvironment): PhaseModel[] { + var releaseDeployPhases = EnvironmentExtensions.getPhases(environment); + return releaseDeployPhases.map(r => new PhaseModel(r.name, this.getJobModelsFromPhase(r.deploymentJobs), DeployPhaseStatus[r.status], r.rank)); + } + + private getJobModelsFromPhase(deploymentJobs: DeploymentJob[]): JobModel[] { + const jobModels = deploymentJobs.map(job => { + const issues = job.job.issues.map(i => new IssueModel(i.issueType, i.message)); + const tasks = job.tasks.map(t => { + const issues = t.issues.map(i => new IssueModel(i.issueType, i.message)); + return new TaskModel(t.name, t.status, issues, t.agentName, t.finishTime, t.startTime); + }); + return new JobModel(job.job.name, job.job.status, issues, tasks); + }); + return jobModels; + } + + private async getReleaseByLastCompletedEnvironmentAsync(pipelineConfig: PipelineConfiguration, release: Release, environment: ReleaseEnvironment): Promise { + let branchId: string = null; + + if (release.artifacts != null && release.artifacts.length > 0) { + const primaryArtifact = release.artifacts.filter(a => a.isPrimary)[0]; + const defRef = primaryArtifact.definitionReference["branch"]; + branchId = defRef != null ? defRef.id : null; + } + + console.log(`Fetching last release by completed environment id - ${pipelineConfig.$environmentId} and branch id ${branchId}`); + const lastRelease = await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getLastPipelineAsync(release.releaseDefinition.id, + environment.definitionEnvironmentId, branchId, null), "GetLastCompletedPipeline"); //Bug in API - release.createdOn); + + return lastRelease as Release; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts new file mode 100644 index 00000000..90e7b9ce --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts @@ -0,0 +1,27 @@ +import tl = require("azure-pipelines-task-lib/task"); +import { + WebApi, + getPersonalAccessTokenHandler +} from "azure-devops-node-api/WebApi"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; + +export abstract class AbstractClient { + + protected connection: WebApi; + protected pipelineConfig: PipelineConfiguration; + + constructor(pipelineConfig: PipelineConfiguration) { + this.connection = this.createConnection(pipelineConfig.$teamUri, pipelineConfig.$accessKey); + this.pipelineConfig = pipelineConfig; + } + + /** + * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api + * @param uri Default URL + * @param accessToken token to get credentials with access to Api calls + */ + private createConnection(uri: string, accessToken: string): WebApi { + const creds = getPersonalAccessTokenHandler(accessToken); + return new WebApi(uri, creds); + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts new file mode 100644 index 00000000..dc57fb77 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts @@ -0,0 +1,107 @@ +import { AbstractClient } from "./AbstractClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ITestApi } from "azure-devops-node-api/TestApi"; +import { TestResultsDetails, TestResultSummary, TestOutcome, TestResultsQuery, TestCaseResult, ResultsFilter, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +import { RetryablePromise } from "./RetryablePromise"; + +export abstract class AbstractTestResultsClient extends AbstractClient implements ITestResultsClient { + + private readonly MaxItemsSupported: number = 100; + protected testApiPromise: Promise; + + constructor(pipelineConfig: PipelineConfiguration) { + super(pipelineConfig); + this.testApiPromise = this.connection.getTestApi(); + } + + public async queryTestResultBugs(automatedTestName: string, resultId: number): Promise { + const testApi = await this.testApiPromise; + return await RetryablePromise.RetryAsync(async () => testApi.queryTestResultWorkItems( + this.pipelineConfig.$projectName, + "Microsoft.BugCategory", + automatedTestName, + resultId + ), "QueryTestResultBugs"); + } + + public async getTestResultById(testRunId: number, resultId: number): Promise { + const testApi = await this.testApiPromise; + return await RetryablePromise.RetryAsync(async () => testApi.getTestResultById(this.pipelineConfig.$projectName, testRunId, resultId), "GetTestResultById"); + } + + public async queryTestResultsReportAsync(parameterConfig: PipelineConfiguration = null): Promise { + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return await RetryablePromise.RetryAsync(async () => this.queryTestResultsReportForPipelineAsync(config), "QueryTestResultsReport"); + } + + public async getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise { + var query = new TestResultsQueryImpl(); + query.fields = ["Owner"]; + + const results: TestCaseResult[] = []; + const testApi = await this.testApiPromise; + for (let i = 0, j = resultsToFetch.length; i < j; i += this.MaxItemsSupported) { + const tempArray = resultsToFetch.slice(i, i + this.MaxItemsSupported); + query.results = tempArray; + let queryResult: TestResultsQuery = await RetryablePromise.RetryAsync(async () => testApi.getTestResultsByQuery(query, this.pipelineConfig.$projectName), "GetTestResultOwners"); + results.push(...queryResult.results); + } + + const ownerMap = new Map(); + results.forEach(r => { + if (this.isValid(r.owner)) { + const key = this.getUniqueName(r.owner); + if (!ownerMap.has(key)) { + ownerMap.set(key, r.owner); + } + } + }); + + const identities: IdentityRef[] = []; + ownerMap.forEach( (value: IdentityRef, key: string) => identities.push(value)); + return identities; + } + + public async getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], parameterConfig: PipelineConfiguration = null): Promise { + const filter = this.getOutcomeFilter(outcomeFilters); + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return await RetryablePromise.RetryAsync(async () => this.getTestResultsDetailsForPipelineAsync(config, groupBy, filter), "GetTestResultsDetails"); + } + + public async getTestResultSummaryAsync(includeFailures: boolean, parameterConfig: PipelineConfiguration = null): Promise { + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return await RetryablePromise.RetryAsync(async () => this.queryTestResultsReportForPipelineAsync(config, includeFailures), "GetTestResultSummary"); + } + + public async getTestResultsByQueryAsync(query: TestResultsQuery): Promise { + return await (await this.testApiPromise).getTestResultsByQuery(query, this.pipelineConfig.$projectId); + } + + protected abstract getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; + protected abstract queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; + + protected getOutcomeFilter(outcomes: TestOutcome[]): string { + let filter: string = null; + if (outcomes != null && outcomes.length > 0) { + const outComeString = Array.from(new Set(outcomes.map(o => Number(o)))).join(","); + filter = `Outcome eq ${outComeString}`; + } + return filter; + } + + private getUniqueName(identity: IdentityRef): string { + return identity.uniqueName == null ? identity.displayName : identity.uniqueName; + } + + private isValid(identity: IdentityRef): boolean { + return identity != null && (identity.displayName != null || identity.uniqueName != null); + } +} + +export class TestResultsQueryImpl implements TestResultsQuery { + public fields: string[]; + public results: TestCaseResult[]; + public resultsFilter: ResultsFilter; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.ts new file mode 100644 index 00000000..d09238f4 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.ts @@ -0,0 +1,60 @@ +import { IPipelineRestClient } from "./IPipelineRestClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Build, BuildResult, BuildQueryOrder, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { ChangeModel } from "../../model/ChangeModel"; +import { AbstractClient } from "./AbstractClient"; +import { IBuildApi } from "azure-devops-node-api/BuildApi"; + +export class BuildRestClient extends AbstractClient implements IPipelineRestClient { + + private buildApi: Promise; + + constructor(pipelineConfig: PipelineConfiguration) { + super(pipelineConfig); + this.buildApi = this.connection.getBuildApi(); + } + + public async getPipelineAsync(): Promise { + return await (await this.buildApi).getBuild(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); + } + + public async getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise { + const builds = await (await this.buildApi).getBuilds( + this.pipelineConfig.$projectId, + [pipelineDefId], + null, + null, + null, + maxCreatedDate, + null, + null, + null, + BuildResult.Succeeded | BuildResult.PartiallySucceeded | BuildResult.Failed | BuildResult.Canceled, + null, + null, + 1, + null, + null, + null, + BuildQueryOrder.FinishTimeDescending, + sourceBranchFilter); + if (builds != null && builds.length > 0) { + return builds[0]; + } + console.log(`Unable to find any build for definition id - ${pipelineDefId}`); + return null; + } + + public async getPipelineChangesAsync(prevPipelineId: number): Promise { + const changes = await (await this.buildApi).getBuildChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); + if (changes == null || changes.length < 1) { + console.log(`No changes found for pipelineId - ${this.pipelineConfig.$pipelineId}`); + return []; + } + return changes.map(item => new ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); + } + + public async getPipelineTimelineAsync(pipelineId: number): Promise { + return await (await this.buildApi).getBuildTimeline(this.pipelineConfig.$projectId, pipelineId); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts new file mode 100644 index 00000000..fd356d3c --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts @@ -0,0 +1,28 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; + +export class BuildTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { + + constructor(pipelineConfig: PipelineConfiguration) { + super(pipelineConfig); + } + + public async queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise { + return await (await this.testApiPromise).queryTestResultsReportForBuild( + config.$projectName, + config.$pipelineId, + null, + includeFailures); + } + + public async getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise { + return await (await this.testApiPromise).getTestResultDetailsForBuild( + config.$projectName, + config.$pipelineId, + null, + groupBy, + filter); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts new file mode 100644 index 00000000..22febc8a --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts @@ -0,0 +1,9 @@ +import { Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { ChangeModel } from "../../model/ChangeModel"; + +export interface IPipelineRestClient { + getPipelineAsync(): Promise; + getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; + getPipelineChangesAsync(prevPipelineId: number): Promise; + getPipelineTimelineAsync(pipelineId: number): Promise; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.ts new file mode 100644 index 00000000..b430519b --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.ts @@ -0,0 +1,13 @@ +import { TestResultsDetails, TestResultSummary, TestOutcome, TestCaseResult, WorkItemReference, TestResultsQuery } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; + +export interface ITestResultsClient { + queryTestResultBugs(automatedTestName: string, resultId: number): Promise; + getTestResultById(testRunId: number, resultId: number): Promise; + queryTestResultsReportAsync(config?: PipelineConfiguration): Promise; + getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; + getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], config?: PipelineConfiguration): Promise; + getTestResultSummaryAsync(includeFailures: boolean, config?: PipelineConfiguration): Promise; + getTestResultsByQueryAsync(query: TestResultsQuery): Promise; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.ts new file mode 100644 index 00000000..e3df57c2 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.ts @@ -0,0 +1,5 @@ +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; + +export interface IWorkItemClient { + getWorkItemsAsync(workItemIds: number[]): Promise; +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.ts new file mode 100644 index 00000000..14a96df7 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.ts @@ -0,0 +1,93 @@ +import { Release, EnvironmentStatus, ReleaseStatus, ReleaseExpands, ReleaseQueryOrder } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { AbstractClient } from "./AbstractClient"; +import { IPipelineRestClient } from "./IPipelineRestClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ChangeModel } from "../../model/ChangeModel"; +import { isNullOrUndefined } from "util"; + +export class ReleaseRestClient extends AbstractClient implements IPipelineRestClient { + + constructor(pipelineConfig: PipelineConfiguration) { + super(pipelineConfig); + } + + public async getPipelineAsync(): Promise { + return (await this.connection.getReleaseApi()).getRelease( + this.pipelineConfig.$projectId, + this.pipelineConfig.$pipelineId + ); + } + + public async getLastPipelineAsync( + pipelineDefId: number, + envDefId: number, + sourceBranchFilter: string, + maxCreatedDate?: Date + ): Promise { + const releaseApi = await this.connection.getReleaseApi(); + let lastRelease: Release = null; + const releaseStatusFilter = ReleaseStatus.Active; + const envStatusFilter = EnvironmentStatus.Succeeded | EnvironmentStatus.PartiallySucceeded | EnvironmentStatus.Rejected | EnvironmentStatus.Canceled; + const releases = await releaseApi.getReleases( + this.pipelineConfig.$projectId, + pipelineDefId, + envDefId, + null, + null, + releaseStatusFilter, + envStatusFilter, + null, + maxCreatedDate, + ReleaseQueryOrder.Descending, + null, + null, + ReleaseExpands.Environments, + null, + null, + null, + sourceBranchFilter + ); + + if (!isNullOrUndefined(releases) && releases.length > 0) { + // Ideally, first one should be last completed one. Unless someone's running the report after the release has completed for some reason. + console.log(`Considering one of [${releases.map(r => r.id).join(",")}] as previous completed release for ${this.pipelineConfig.$pipelineId}`); + for(let i = 0; i < releases.length; i++) { + if(releases[i].id < this.pipelineConfig.$pipelineId) { + lastRelease = releases[i]; + break; + } + } + } + + if (isNullOrUndefined(lastRelease)) { + console.log(`Unable to fetch last completed release for release definition:${pipelineDefId} and environmentid: ${envDefId}`); + } else if(lastRelease.id < this.pipelineConfig.$pipelineId) { + return await releaseApi.getRelease( + this.pipelineConfig.$projectId, + lastRelease.id + ); + } + + return lastRelease; + } + + public async getPipelineChangesAsync(prevPipelineId: number): Promise { + + console.log(`Fetching changes between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); + const changes = await (await this.connection.getReleaseApi()).getReleaseChanges( + this.pipelineConfig.$projectId, + this.pipelineConfig.$pipelineId, + prevPipelineId); + + if (changes == null || changes.length < 1) { + console.log(`No changes found between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); + return []; + } + + return changes.map(item => new ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); + } + + getPipelineTimelineAsync(pipelineId: number): Promise { + throw new Error("Method not supported."); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts new file mode 100644 index 00000000..583aebac --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts @@ -0,0 +1,30 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; + +export class ReleaseTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { + + constructor(pipelineConfig: PipelineConfiguration) { + super(pipelineConfig); + } + + public async queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise { + return await (await this.testApiPromise).queryTestResultsReportForRelease( + config.$projectName, + config.$pipelineId, + config.$environmentId, + null, + includeFailures); + } + + public async getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string,): Promise { + return await (await this.testApiPromise).getTestResultDetailsForRelease( + config.$projectName, + config.$pipelineId, + config.$environmentId, + null, + groupBy, + filter); + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.ts new file mode 100644 index 00000000..914664f2 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.ts @@ -0,0 +1,38 @@ +import { TelemetryLogger } from "../../telemetry/TelemetryLogger"; +const now = require('performance-now'); + +export class RetryablePromise { + + private static defaultRetryCount: number = 3; + + public static async RetryAsync(executor: () => Promise, executorName: string, times: number = this.defaultRetryCount): Promise { + const perfStart = now(); + let attemptNumber = 1; + let lastError: Error; + try { + do { + try { + let returnVal = await executor(); + if (attemptNumber > 1) { + console.log(`Completed on Retry attempt: ${attemptNumber}`); + } + return returnVal; + } + catch (err) { + lastError = err; + console.log(`Retry <${executorName}>: ${attemptNumber} : ${err}`); + } + attemptNumber++; + } while (attemptNumber <= times); + + console.log(`All Retries exhausted. Throwing error: ${lastError}`); + throw lastError; + } + finally { + if (attemptNumber > 1) { + // Log time taken after all retries + TelemetryLogger.LogModulePerf(executorName, now() - perfStart); + } + } + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.ts new file mode 100644 index 00000000..c07638b4 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.ts @@ -0,0 +1,33 @@ +import { AbstractClient } from "./AbstractClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { IWorkItemClient } from "./IWorkItemClient"; +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +import { IWorkItemTrackingApi } from "azure-devops-node-api/WorkItemTrackingApi"; + +export class WorkItemClient extends AbstractClient implements IWorkItemClient { + + private workApiPromise: Promise; + + constructor(pipelineConfig: PipelineConfiguration) { + super(pipelineConfig); + this.workApiPromise = this.connection.getWorkItemTrackingApi(); + } + + public async getWorkItemsAsync(workItemIds: number[]): Promise { + + const chunks: number[][] = []; + var i, j, temparray, chunk = 100; + for (i = 0, j = workItemIds.length; i < j; i += chunk) { + temparray = workItemIds.slice(i, i + chunk); + chunks.push(temparray); + } + + const workApi = await this.workApiPromise; + const chunkResults = chunks.map(chunk => workApi.getWorkItems(chunk)); + + const workItems = await Promise.all(chunkResults); + const flatItemList: WorkItem[] = []; + workItems.forEach(wlist => flatItemList.push(...wlist)); + return flatItemList; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts new file mode 100644 index 00000000..4ff09cf4 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts @@ -0,0 +1,65 @@ +import { TestOutcome, TestCaseResult, CustomTestField } from "azure-devops-node-api/interfaces/TestInterfaces"; + +export class TcmHelper { + + public static readonly OutcomeConfidenceValue: Number = 0.0; + + public static exceptOutcomes(outcomesToExclude: TestOutcome[]): TestOutcome[] { + const otherOutComes: TestOutcome[] = []; + for (let outcome in TestOutcome) { + var outcomeNum = Number(outcome); + if (!isNaN(outcomeNum) && !outcomesToExclude.includes(outcomeNum)) { + otherOutComes.push(outcomeNum); + } + } + + return otherOutComes; + } + + public static parseOutcome(outcomeString: string): TestOutcome { + let result: TestOutcome; + switch (outcomeString) { + case "Passed": result = TestOutcome.Passed; break; + case "Failed": result = TestOutcome.Failed; break; + case "Inconclusive": result = TestOutcome.Inconclusive; break; + case "NotExecuted": result = TestOutcome.NotExecuted; break; + default: result = TestOutcome.None; break; + } + return result; + } + + public static isTestFlaky(result: TestCaseResult): boolean { + var outcomeConfidenceField = TcmHelper.getCustomField(result, "OutcomeConfidence"); + if (outcomeConfidenceField != null + && outcomeConfidenceField.value != null) { + const outcomeFieldValue = Number.parseFloat(outcomeConfidenceField.value); + if (!isNaN(outcomeFieldValue)) { + return outcomeFieldValue == TcmHelper.OutcomeConfidenceValue; + } + } + + return false; + } + + public static getCustomField(result: TestCaseResult, fieldName: string): CustomTestField { + if (result.customFields == null) { + return null; + } + + var cf = result.customFields.filter(c => c.fieldName.toLowerCase() == fieldName.toLowerCase()); + return cf.length > 0 ? cf[0] : null; + } + + public static Merge(source: Array>): T[] { + const mergedResults: T[] = []; + + source.forEach(item => { + if (item != null) { + mergedResults.push(...item); + } + }); + + return mergedResults; + } + +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts new file mode 100644 index 00000000..3e3fa199 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts @@ -0,0 +1,32 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +import { TestOutcome, TestCaseResult } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ReportFactory } from "../../model/ReportFactory"; + +export class TestOwnersDataProvider implements IDataProvider { + + private testResultsClient: ITestResultsClient; + + constructor(testResultsClient: ITestResultsClient) { + this.testResultsClient = testResultsClient; + } + + public async getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise { + const report = ReportFactory.createNewReport(pipelineConfig); + const failedTestResultDetails = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Failed]); + + const resultsToFetch: TestCaseResult[] = []; + failedTestResultDetails.resultsForGroup.forEach(r => { + resultsToFetch.push(...r.results); + }); + + const failedOwners = await this.testResultsClient.getTestResultOwnersAsync(resultsToFetch); + report.$failedTestOwners.push(...failedOwners); + + console.log("Fetched test owners data"); + return report; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts new file mode 100644 index 00000000..092ea145 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts @@ -0,0 +1,194 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { TestResultsConfiguration } from "../../config/report/TestResultsConfiguration"; +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +import { TestOutcome, TestResultsDetails, TestCaseResult, TestResultsDetailsForGroup, WorkItemReference, ResultDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TcmHelper } from "./TcmHelper"; +import { TestResultsGroupModel } from "../../model/testresults/TestResultGroupModel"; +import { TestResultModel } from "../../model/testresults/TestResultModel"; +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +import { IWorkItemClient } from "../restclients/IWorkItemClient"; +import { TestResultDetailsParserFactory } from "../helpers/TestResultDetailsParserFactory"; +import { ReportFactory } from "../../model/ReportFactory"; +import { AbstractTestResultsDetailsParser } from "../helpers/AbstractTestResultsDetailsParser"; +import { isNullOrUndefined } from "util"; + +export class TestResultsDataProvider implements IDataProvider { + + private testResultsClient: ITestResultsClient; + private workItemClient: IWorkItemClient; + + constructor(testResultsClient: ITestResultsClient, workItemClient: IWorkItemClient) { + this.testResultsClient = testResultsClient; + this.workItemClient = workItemClient; + } + + public async getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise { + const report = ReportFactory.createNewReport(pipelineConfig); + // This is to make sure the failing since information is computed before we fetch test results + await this.testResultsClient.queryTestResultsReportAsync(); + await this.setFilteredTestResults(pipelineConfig, reportDataConfig.$testResultsConfig, report); + return report; + } + + private async setFilteredTestResults(config: PipelineConfiguration, testResultsConfiguration: TestResultsConfiguration, report: Report): Promise { + if (testResultsConfiguration.$includeFailedTests || testResultsConfiguration.$includeOtherTests || testResultsConfiguration.$includePassedTests) { + const groupBy = testResultsConfiguration.$groupTestResultsBy == GroupTestResultsBy.Run ? "TestRun" : "Priority"; + const includedOutcomes = this.getIncludedOutcomes(testResultsConfiguration); + + const resultIdsToFetch = await this.testResultsClient.getTestResultsDetailsAsync(groupBy, includedOutcomes); + + report.hasFilteredTests = this.filterTestResults(resultIdsToFetch, testResultsConfiguration.$maxItemsToShow); + + const filteredTestResultGroups = await this.getTestResultsWithWorkItems(resultIdsToFetch); + + report.filteredResults = filteredTestResultGroups; + } + } + + private async getTestResultsWithWorkItems(resultIdsToFetch: TestResultsDetails): Promise { + const testResultDetailsParser = TestResultDetailsParserFactory.getParser(resultIdsToFetch); + + const filteredTestResultGroups = resultIdsToFetch.resultsForGroup + .map(resultsForGroup => this.getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, testResultDetailsParser)); + const results = await Promise.all(filteredTestResultGroups); + return results; + } + + private async getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup: TestResultsDetailsForGroup, parser: AbstractTestResultsDetailsParser): Promise { + var resultGroup = new TestResultsGroupModel(); + resultGroup.groupName = parser.getGroupByValue(resultsForGroup); + + const bugsRefs: WorkItemReference[] = []; + const results = await this.getTestResultsWithBugRefs(resultsForGroup, bugsRefs); + + try { + const workItemDictionary = await this.getWorkItemsAsync(bugsRefs); + results.forEach(result => { + if (result.associatedBugRefs != null && result.associatedBugRefs.length > 0) { + result.associatedBugRefs.forEach(workItemReference => { + result.associatedBugs.push(workItemDictionary.get(Number.parseInt(workItemReference.id))); + }); + } + }); + } + catch(ex) { + // ignore + console.warn(`Error while fetching workitems for bugrefs: ${bugsRefs.map(b => b.id)}`); + } + + results.forEach(result => { + if (result.testResult.outcome != null) { + const testOutcome = TcmHelper.parseOutcome(result.testResult.outcome); + if (!resultGroup.testResults.has(testOutcome)) { + resultGroup.testResults.set(testOutcome, []); + } + + resultGroup.testResults.get(testOutcome).push(result); + } + else { + console.log(`Found test with outcome as null. Test result id ${result.testResult.id} in Test run ${result.testResult.testRun.id}`); + } + }); + return resultGroup; + } + + private async getWorkItemsAsync(bugsRefs: WorkItemReference[]): Promise> { + const workItemDictionary: Map = new Map(); + + if (bugsRefs != null && bugsRefs.length > 0) { + const workItems: WorkItem[] = await this.workItemClient.getWorkItemsAsync(bugsRefs.map(bugRef => Number.parseInt(bugRef.id))); + workItems.forEach(workItem => { + if (workItem.id != null) { + workItemDictionary.set(workItem.id, workItem); + } + else { + console.log(`Unable to get id for a work item`); + } + }); + } + + return workItemDictionary; + } + + private async getTestResultsWithBugRefs(resultsForGroup: TestResultsDetailsForGroup, bugReferencesInGroup: WorkItemReference[]): Promise { + const resultModels: TestResultModel[] = []; + for (var i = 0; i < resultsForGroup.results.length; i++) { + const resultIdObj = resultsForGroup.results[i]; + const testResult = await this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); + + // Remove flaky tests + if (isNullOrUndefined(testResult) || TcmHelper.isTestFlaky(testResult)) { + continue; + } + + const associatedBugRefs = await this.testResultsClient.queryTestResultBugs(testResult.automatedTestName, testResult.id); + const resultModel = new TestResultModel(); + resultModel.testResult = testResult; + resultModel.associatedBugRefs = associatedBugRefs; + resultModels.push(resultModel); + } + // let results = resultsForGroup.results + // .map(async resultIdObj => + // { + // const resultModel = new TestResultModel(); + + // resultModel.testResult = await this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); + + // // Remove flaky tests + // if (TcmHelper.isTestFlaky(resultModel.testResult)) + // { + // return null; + // } + + // resultModel.associatedBugRefs = await this.testResultsClient.queryTestResultBugs(resultModel.testResult.automatedTestName, resultModel.testResult.id); + // return resultModel; + // }); + + //Remove all null values from array + //results = results.filter(r => r != null); + //results.forEach(async result => resultModels.push((await result))); + resultModels.forEach(result => bugReferencesInGroup.push(...result.associatedBugRefs)); + return resultModels; + } + + private filterTestResults(resultIdsToFetch: TestResultsDetails, maxItems: number): boolean { + var hasFiltered = false; + var remainingItems = maxItems; + for (let i = 0; i < resultIdsToFetch.resultsForGroup.length; i++) { + const group = resultIdsToFetch.resultsForGroup[i]; + var currentItemsSize = group.results.length; + if (currentItemsSize > remainingItems) { + hasFiltered = true; + const results: TestCaseResult[] = []; + results.push(...group.results); + group.results = results.splice(0, remainingItems); + break; + } + remainingItems -= group.results.length; + } + + resultIdsToFetch.resultsForGroup = resultIdsToFetch.resultsForGroup.filter(group => group.results.length > 0); + return hasFiltered; + } + + private getIncludedOutcomes(testResultsConfiguration: TestResultsConfiguration): TestOutcome[] { + const includedOutcomes: TestOutcome[] = []; + if (testResultsConfiguration.$includeFailedTests) { + includedOutcomes.push(TestOutcome.Failed); + } + + if (testResultsConfiguration.$includeOtherTests) { + includedOutcomes.push(...TcmHelper.exceptOutcomes([TestOutcome.Failed, TestOutcome.Passed])); + } + + if (testResultsConfiguration.$includePassedTests) { + includedOutcomes.push(TestOutcome.Passed); + } + + return includedOutcomes; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts new file mode 100644 index 00000000..bf5254f1 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts @@ -0,0 +1,158 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +import { TestSummaryGroupModel } from "../../model/testresults/TestSummaryGroupModel"; +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +import { TestResultDetailsParserForRun } from "../helpers/TestResultDetailsParserForRun"; +import { TestOutcomeForPriority } from "../../model/testresults/TestOutcomeForPriority"; +import { TestResultDetailsParserForPriority } from "../helpers/TestResultDetailsParserForPriority"; +import { PipelineType } from "../../config/pipeline/PipelineType"; +import { TestResultsDetails, TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { TcmHelper } from "./TcmHelper"; +import { ReportFactory } from "../../model/ReportFactory"; + +export class TestSummaryDataProvider implements IDataProvider { + + private testResultsClient: ITestResultsClient; + + constructor(testResultsClient: ITestResultsClient) { + this.testResultsClient = testResultsClient; + } + + public async getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise { + const report = ReportFactory.createNewReport(pipelineConfig); + const testSummaryGroups: TestSummaryGroupModel[] = []; + + const testSummaryGroupModelForRun = await this.getTestRunSummaryWithPriorityAsync(pipelineConfig); + testSummaryGroups.push(testSummaryGroupModelForRun); + + report.testResultSummary = await this.testResultsClient.getTestResultSummaryAsync(true); + + // Hack - above testresultsummary is incomplete - bug filed + //const passedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Passed]); + //const failedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Failed]); + //this.setOutComeData(report, testSummaryGroups, TestOutcome.Passed, passedResults); + //this.setOutComeData(report, testSummaryGroups, TestOutcome.Failed, failedResults); + + if (reportDataConfiguration.$groupTestSummaryBy.includes(GroupTestResultsBy.Priority)) { + testSummaryGroups.push(await this.getTestSummaryByPriorityAsync()); + } + report.$testSummaryGroups.push(...testSummaryGroups); + return report; + } + + private async getTestSummaryByPriorityAsync(): Promise { + const testSummaryItemsByRuns = await this.testResultsClient.getTestResultsDetailsAsync("Priority"); + + var testResultDetailsParserForPriority = new TestResultDetailsParserForPriority(testSummaryItemsByRuns); + const testSummaryByPriority = new TestSummaryGroupModel(); + testSummaryByPriority.groupedBy = GroupTestResultsBy.Priority; + const summaryItems = testResultDetailsParserForPriority.getSummaryItems(); + + testSummaryByPriority.runs.push(...summaryItems); + return testSummaryByPriority; + } + + private async getTestRunSummaryWithPriorityAsync(config: PipelineConfiguration): Promise { + const testSummaryByRun = new TestSummaryGroupModel(); + testSummaryByRun.groupedBy = GroupTestResultsBy.Run; + + if (config.$pipelineType == PipelineType.Release) { + const testResultsDetailsByTestRun = await this.testResultsClient.getTestResultsDetailsAsync("TestRun"); + const summaryDataByPriority = await this.getTestSummaryDataByPriorityAsync(); + + const summaryByRun = new TestResultDetailsParserForRun(testResultsDetailsByTestRun); + const summaryItems = await this.getSummaryByRun(summaryByRun, summaryDataByPriority); + testSummaryByRun.runs.push(...summaryItems); + } + return testSummaryByRun; + } + + private getSummaryByRun(testResultByRun: TestResultDetailsParserForRun, testResultsForPriorityByOutcome: Map): TestSummaryItemModel[] { + const summaryItemByRun = testResultByRun.getSummaryItems(); + + summaryItemByRun.forEach(summaryItem => { + testResultsForPriorityByOutcome.forEach((value: TestResultDetailsParserForPriority, supportedTestOutcome: TestOutcomeForPriority) => { + const resultCountByPriority = value.getTestResultsForRun(Number.parseInt(summaryItem.$id)); + + resultCountByPriority.forEach((resultCount: number, priority: number) => { + if (!summaryItem.$testCountForOutcomeByPriority.has(priority)) { + summaryItem.$testCountForOutcomeByPriority.set(priority, new Map()); + } + + const testCountByOutcome = summaryItem.$testCountForOutcomeByPriority.get(priority); + + if (!testCountByOutcome.has(supportedTestOutcome)) { + testCountByOutcome.set(supportedTestOutcome, 0); + } + + testCountByOutcome.set(supportedTestOutcome, testCountByOutcome.get(supportedTestOutcome) + resultCountByPriority.get(priority)); + }); + }); + }); + + return summaryItemByRun; + } + + private async getTestSummaryDataByPriorityAsync(): Promise> { + var outcomeFilters = new Map(); + outcomeFilters.set(TestOutcomeForPriority.Passed, [TestOutcome.Passed]); + outcomeFilters.set(TestOutcomeForPriority.Inconclusive, [TestOutcome.Inconclusive]); + outcomeFilters.set(TestOutcomeForPriority.NotExecuted, [TestOutcome.NotExecuted]); + outcomeFilters.set(TestOutcomeForPriority.Other, TcmHelper.exceptOutcomes([TestOutcome.Failed, TestOutcome.Passed, TestOutcome.Inconclusive, TestOutcome.NotExecuted])); + var testResultDetailsForOutcomes = new Map(); + + const outcomeMap = new Map(); + const keys = Array.from(outcomeFilters.keys()); + for (var i = 0; i < keys.length; i++) { + const outcome = keys[i]; + const resultsForOutCome = await this.testResultsClient.getTestResultsDetailsAsync("Priority", outcomeFilters.get(outcome)); + outcomeMap.set(outcome, resultsForOutCome); + } + + outcomeMap.forEach((value: TestResultsDetails, key: TestOutcomeForPriority) => { + testResultDetailsForOutcomes.set(key, new TestResultDetailsParserForPriority(value)); + }); + + return testResultDetailsForOutcomes; + } + +// // HACK +// private setOutComeData(report: Report, summaryGroups: TestSummaryGroupModel[], outcome: TestOutcome, results: TestResultsDetails): void { +// const outcomeObj = new AggregatedResultsByOutcomeImpl(); +// outcomeObj.count = 0; +// outcomeObj.outcome = outcome; +// outcomeObj.duration = 0; +// results.resultsForGroup.forEach(resultsForGroup => { + +// if (resultsForGroup.results.length > 0) { +// summaryGroups.forEach(sg => { +// sg.runs.forEach(sgr => { +// if (sgr.$id == resultsForGroup.results[0].testRun.id) { +// sgr.$testCountByOutcome.set(outcome, resultsForGroup.results.filter(r => !TcmHelper.isTestFlaky(r)).length); +// } +// }); +// }); +// } + +// outcomeObj.count += resultsForGroup.results.length; +// resultsForGroup.results.forEach(r => { +// outcomeObj.duration += isNaN(r.durationInMs) ? 0 : r.durationInMs; +// }); +// }); +// report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[outcome] = outcomeObj; +// } + +} + +// export class AggregatedResultsByOutcomeImpl implements AggregatedResultsByOutcome { +// count?: number; +// duration?: any; +// groupByField?: string; +// groupByValue?: any; +// outcome?: TestOutcome; +// rerunResultCount?: number; +// } \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/task.dev.json b/Tasks/emailReportTask/emailReportTaskV2/task.dev.json new file mode 100644 index 00000000..cae92312 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/task.dev.json @@ -0,0 +1,238 @@ +{ + "id": "59a02370-5b4b-4236-95bd-673180e2cbf2", + "name": "EmailReportPPE", + "friendlyName": "Email Report PPE (Testing Purposes)", + "description": "Send rich email report for test results and for tasks in this stage", + "helpMarkDown": "Sets 'EmailReportTask.EmailSent' variable to true if it sent email successfully. https://marketplace.visualstudio.com/items?itemName=epsteam.EmailReportExtension", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 2, + "Patch": 208 + }, + "groups": [ + { + "name": "emailConfiguration", + "displayName": "Email Configuration", + "isExpanded": true + }, + { + "name": "emailContent", + "displayName": "Email Content", + "isExpanded": true + }, + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "sendMailConditionConfig", + "type": "pickList", + "label": "Send Email", + "defaultValue": "Always", + "required": true, + "helpMarkDown": "Sends email if the selected criteria is met.", + "options": { + "Always": "Always", + "On Failure": "On Failure", + "On Success": "On Success", + "On New Failures Only": "On New Failures Only" + }, + "groupName": "emailConfiguration" + }, + { + "name": "subject", + "type": "string", + "label": "Email Subject", + "defaultValue": "[{environmentStatus}] {passPercentage} tests passed in $(Release.EnvironmentName) stage for $(Build.BuildNumber) ", + "required": true, + "helpMarkDown": "Email Subject.", + "groupName": "emailConfiguration" + }, + { + "name": "includeInToSectionStr", + "type": "pickList", + "label": "Include in To Section", + "defaultValue": "1", + "required": false, + "helpMarkDown": "Adds the selected users in To section.", + "options": { + "1": "Include Commit Owners", + "2": "Include Failed Test Owners", + "3": "Include Active Bug Owners", + "4": "Include Created By" + }, + "properties": { + "MultiSelectFlatList": "True", + "DisableManageLink": "True" + }, + "groupName": "emailConfiguration" + }, + { + "name": "toAddress", + "type": "string", + "label": "To", + "defaultValue": "", + "required": false, + "helpMarkDown": "Recipients email addresses separated by semicolon(;).", + "groupName": "emailConfiguration" + }, + { + "name": "includeInCcSectionStr", + "type": "pickList", + "label": "Include in Cc Section", + "required": false, + "helpMarkDown": "Adds the selected users in Cc section.", + "options": { + "1": "Include Commit owners", + "2": "Include Failure Test Owners", + "3": "Include Active Bug Owners", + "4": "Include Created By" + }, + "properties": { + "MultiSelectFlatList": "True", + "DisableManageLink": "True" + }, + "groupName": "emailConfiguration" + }, + { + "name": "ccAddress", + "type": "string", + "label": "Cc", + "defaultValue": "", + "required": false, + "helpMarkDown": "Recipients email addresses separated by semicolon(;).", + "groupName": "emailConfiguration" + }, + { + "name": "defaultDomain", + "type": "string", + "label": "Default Domain for Addresses", + "defaultValue": "microsoft.com", + "required": true, + "helpMarkDown": "Address Domains like microsoft.com. Will be used to resolve mail addresses. testOwner@domain for example.", + "groupName": "emailConfiguration" + }, + { + "name": "groupTestSummaryByStr", + "type": "pickList", + "label": "Group Test Summary", + "defaultValue": "1", + "required": false, + "helpMarkDown": "Adds test summary groups for the selected configurations.", + "options": { + "0": "Priority", + "1": "Run" + }, + "properties": { + "MultiSelectFlatList": "True", + "DisableManageLink": "True" + }, + "groupName": "emailContent" + }, + { + "name": "includeResultsStr", + "type": "pickList", + "label": "Include Test Results", + "required": false, + "defaultValue": "1", + "helpMarkDown": "Include test result details for the selected types.", + "options": { + "1": "Failed Tests", + "2": "Other Tests" + }, + "properties": { + "MultiSelectFlatList": "True", + "DisableManageLink": "True" + }, + "groupName": "emailContent" + }, + { + "name": "groupTestResultsBy", + "type": "radio", + "label": "Group Test Results", + "required": true, + "defaultValue": "run", + "helpMarkDown": "Group test results by the selected criteria.", + "options": { + "run": "Run", + "Priority": "Priority" + }, + "groupName": "emailContent" + }, + { + "name": "includeCommits", + "type": "boolean", + "label": "Include Commits", + "required": true, + "defaultValue": "true", + "helpMarkDown": "Includes new commits since last completed release.", + "groupName": "emailContent" + }, + { + "name": "maxTestFailuresToShow", + "type": "string", + "label": "Maximum Test Results to show", + "required": true, + "defaultValue": "15", + "helpMarkDown": "Maximum test failures to show in the report. Additional tests will be truncated.", + "groupName": "advanced" + }, + { + "name": "includeOthersInTotal", + "type": "boolean", + "label": "Include Others in Total count", + "required": true, + "defaultValue": "false", + "helpMarkDown": "If set, Total count will include others and pass percentage will be calculated accordingly.", + "groupName": "advanced" + }, + { + "name": "usePreviousEnvironment", + "type": "boolean", + "label": "Use Previous Stage", + "required": true, + "defaultValue": "false", + "helpMarkDown": "If set, email content will be generated for the previous stage in the current release.", + "groupName": "advanced" + }, + { + "name": "enableSSLOnSmtpConnection", + "aliases": [ + "enableTLS" + ], + "type": "boolean", + "label": "Enable TLS", + "required": false, + "defaultValue": "false", + "helpMarkDown": "Enables TLS on SMTP Connection for sending email.", + "groupName": "advanced" + }, + { + "name": "smtpConnectionEndpoint", + "type": "connectedService:Generic", + "label": "SMTP credentials", + "required": true, + "helpMarkDown": "SMTP credentials to be used to send email report", + "groupName": "advanced" + } + ], + "instanceNameFormat": "Send Email Report $(sendMailConditionConfig)", + "execution": { + "Node": { + "target": "Index.js" + }, + "Node16": { + "target": "Index.js", + "argumentFormat": "" + } + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/task.prod.json b/Tasks/emailReportTask/emailReportTaskV2/task.prod.json new file mode 100644 index 00000000..f15f999c --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/task.prod.json @@ -0,0 +1,238 @@ +{ + "id": "36fd41b1-8024-4ce9-a5a0-53c3e54ed105", + "name": "EmailReport", + "friendlyName": "Email Report", + "description": "Send rich email report for test results and for tasks in this stage", + "helpMarkDown": "Sets 'EmailReportTask.EmailSent' variable to true if it sent email successfully. [Learn More](https://marketplace.visualstudio.com/items?itemName=epsteam.EmailReportExtension)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 1, + "Patch": 8 + }, + "groups": [ + { + "name": "emailConfiguration", + "displayName": "Email Configuration", + "isExpanded": true + }, + { + "name": "emailContent", + "displayName": "Email Content", + "isExpanded": true + }, + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "sendMailConditionConfig", + "type": "pickList", + "label": "Send Email", + "defaultValue": "Always", + "required": true, + "helpMarkDown": "Sends email if the selected criteria is met.", + "options": { + "Always": "Always", + "On Failure": "On Failure", + "On Success": "On Success", + "On New Failures Only": "On New Failures Only" + }, + "groupName": "emailConfiguration" + }, + { + "name": "subject", + "type": "string", + "label": "Email Subject", + "defaultValue": "[{environmentStatus}] {passPercentage} tests passed in $(Release.EnvironmentName) stage for $(Build.BuildNumber) ", + "required": true, + "helpMarkDown": "Email Subject.", + "groupName": "emailConfiguration" + }, + { + "name": "includeInToSectionStr", + "type": "pickList", + "label": "Include in To Section", + "defaultValue": "1", + "required": false, + "helpMarkDown": "Adds the selected users in To section.", + "options": { + "1": "Include Commit Owners", + "2": "Include Failed Test Owners", + "3": "Include Active Bug Owners", + "4": "Include Created By" + }, + "properties": { + "MultiSelectFlatList": "True", + "DisableManageLink": "True" + }, + "groupName": "emailConfiguration" + }, + { + "name": "toAddress", + "type": "string", + "label": "To", + "defaultValue": "", + "required": false, + "helpMarkDown": "Recipients email addresses separated by semicolon(;).", + "groupName": "emailConfiguration" + }, + { + "name": "includeInCcSectionStr", + "type": "pickList", + "label": "Include in Cc Section", + "required": false, + "helpMarkDown": "Adds the selected users in Cc section.", + "options": { + "1": "Include Commit owners", + "2": "Include Failure Test Owners", + "3": "Include Active Bug Owners", + "4": "Include Created By" + }, + "properties": { + "MultiSelectFlatList": "True", + "DisableManageLink": "True" + }, + "groupName": "emailConfiguration" + }, + { + "name": "ccAddress", + "type": "string", + "label": "Cc", + "defaultValue": "", + "required": false, + "helpMarkDown": "Recipients email addresses separated by semicolon(;).", + "groupName": "emailConfiguration" + }, + { + "name": "defaultDomain", + "type": "string", + "label": "Default Domain for Addresses", + "defaultValue": "microsoft.com", + "required": true, + "helpMarkDown": "Address Domains like microsoft.com. Will be used to resolve mail addresses. testOwner@domain for example.", + "groupName": "emailConfiguration" + }, + { + "name": "groupTestSummaryByStr", + "type": "pickList", + "label": "Group Test Summary", + "defaultValue": "1", + "required": false, + "helpMarkDown": "Adds test summary groups for the selected configurations.", + "options": { + "0": "Priority", + "1": "Run" + }, + "properties": { + "MultiSelectFlatList": "True", + "DisableManageLink": "True" + }, + "groupName": "emailContent" + }, + { + "name": "includeResultsStr", + "type": "pickList", + "label": "Include Test Results", + "required": false, + "defaultValue": "1", + "helpMarkDown": "Include test result details for the selected types.", + "options": { + "1": "Failed Tests", + "2": "Other Tests" + }, + "properties": { + "MultiSelectFlatList": "True", + "DisableManageLink": "True" + }, + "groupName": "emailContent" + }, + { + "name": "groupTestResultsBy", + "type": "radio", + "label": "Group Test Results", + "required": true, + "defaultValue": "run", + "helpMarkDown": "Group test results by the selected criteria.", + "options": { + "run": "Run", + "Priority": "Priority" + }, + "groupName": "emailContent" + }, + { + "name": "includeCommits", + "type": "boolean", + "label": "Include Commits", + "required": true, + "defaultValue": "true", + "helpMarkDown": "Includes new commits since last completed release.", + "groupName": "emailContent" + }, + { + "name": "maxTestFailuresToShow", + "type": "string", + "label": "Maximum Test Results to show", + "required": true, + "defaultValue": "15", + "helpMarkDown": "Maximum test failures to show in the report. Additional tests will be truncated.", + "groupName": "advanced" + }, + { + "name": "includeOthersInTotal", + "type": "boolean", + "label": "Include Others in Total count", + "required": true, + "defaultValue": "false", + "helpMarkDown": "If set, Total count will include others and pass percentage will be calculated accordingly.", + "groupName": "advanced" + }, + { + "name": "usePreviousEnvironment", + "type": "boolean", + "label": "Use Previous Stage", + "required": true, + "defaultValue": "false", + "helpMarkDown": "If set, email content will be generated for the previous stage in the current release.", + "groupName": "advanced" + }, + { + "name": "enableSSLOnSmtpConnection", + "aliases": [ + "enableTLS" + ], + "type": "boolean", + "label": "Enable TLS", + "required": false, + "defaultValue": "false", + "helpMarkDown": "Enables TLS on SMTP Connection for sending email.", + "groupName": "advanced" + }, + { + "name": "smtpConnectionEndpoint", + "type": "connectedService:Generic", + "label": "SMTP credentials", + "required": true, + "helpMarkDown": "SMTP credentials to be used to send email report", + "groupName": "advanced" + } + ], + "instanceNameFormat": "Send Email Report $(sendMailConditionConfig)", + "execution": { + "Node": { + "target": "Index.js" + }, + "Node16": { + "target": "Index.js", + "argumentFormat": "" + } + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.ts b/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.ts new file mode 100644 index 00000000..f7058ea1 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.ts @@ -0,0 +1,101 @@ +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { PipelineType } from "../config/pipeline/PipelineType"; +import { EnumUtils } from "../utils/EnumUtils"; +const now = require("performance-now") + +export class TelemetryLogger { + public static readonly TELEMETRY_LINE = + "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; + + private static instance: TelemetryLogger; + private static reportConfig: ReportConfiguration; + + /** + * Formats and sends all telemetry collected to be published + */ + public static LogTaskConfig(reportConfiguration: ReportConfiguration): void { + this.reportConfig = reportConfiguration; + + const pipelineConfig = this.reportConfig.$pipelineConfiguration; + const mailConfig = this.reportConfig.$mailConfiguration; + const reportDataConfig = this.reportConfig.$reportDataConfiguration; + + let pipelineTypeString: string = "Release"; + let environmentId: number = 0; + if (pipelineConfig.$pipelineType == PipelineType.Build) { + pipelineTypeString = "Build"; + } else { + environmentId = pipelineConfig.$environmentId; + } + + const groupTestSummary: string[] = reportDataConfig.$groupTestSummaryBy.map(g => EnumUtils.GetGroupTestResultsByString(g)); + let groupTestSummaryString = groupTestSummary[0]; + if (groupTestSummary.length > 0) { + groupTestSummaryString = groupTestSummary.join(","); + } + + this.logTelemetry({ + pipelineId: pipelineConfig.$pipelineId, + pipelineType: pipelineTypeString, + projectId: pipelineConfig.$projectId, + projectName: pipelineConfig.$projectName, + environmentId: environmentId, + taskConfiguration: { + sendMailCondition: EnumUtils.GetMailConditionString(this.reportConfig.$sendMailCondition), + smtpHost: mailConfig.$smtpConfig.$smtpHost, + smtpUserName: mailConfig.$smtpConfig.$userName, + enableTLs: mailConfig.$smtpConfig.$enableTLS, + includeCommits: reportDataConfig.$includeCommits, + includeOthersInTotal: reportDataConfig.$includeOthersInTotal, + groupTestSummaryBy: groupTestSummaryString, + testResultsConfiguration: { + includeFailedTests: reportDataConfig.$testResultsConfig.$includeFailedTests, + includeInconclusiveTests: reportDataConfig.$testResultsConfig.$includeInconclusiveTests, + includeNotExecutedTests: reportDataConfig.$testResultsConfig.$includeNotExecutedTests, + includeOtherTests: reportDataConfig.$testResultsConfig.$includeOtherTests, + includePassedTests: reportDataConfig.$testResultsConfig.$includePassedTests, + maxItemsToShow: reportDataConfig.$testResultsConfig.$maxItemsToShow + } + } + }); + } + + public static LogModulePerf(moduleName: string, timeTaken: number, numRetries: Number = 0) { + const timeTakenString = timeTaken.toFixed(2); + if (numRetries < 1) { + this.logTelemetry({ + "ModuleName": `${moduleName}`, + "PERF": `${timeTakenString}` + }); + } else { + this.logTelemetry({ + "ModuleName": `${moduleName}`, + "PERF": `${timeTakenString}`, + "Retries": `${numRetries}` + }); + } + } + + /** + * Publishes an object as a string as telemetry + * @param telemetryToLog Object to be logged as a string + */ + private static logTelemetry(telemetryToLog: {}) { + console.log( + TelemetryLogger.TELEMETRY_LINE + JSON.stringify(telemetryToLog) + ); + } + + public static async InvokeWithPerfLogger(executor: () => Promise, executorName: string): Promise { + const perfStart = now(); + let returnVal: T; + try { + returnVal = await executor(); + } + finally { + // Log time taken by the dataprovider + TelemetryLogger.LogModulePerf(executorName, now() - perfStart); + } + return returnVal; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts b/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts new file mode 100644 index 00000000..6a84199e --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts @@ -0,0 +1,83 @@ +import { IConfigurationProvider } from "../../config/IConfigurationProvider"; +import { SendMailCondition } from "../../config/report/SendMailCondition"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { MailConfiguration } from "../../config/mail/MailConfiguration"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { ReportConfiguration } from "../../config/ReportConfiguration"; +import { ReportManager } from "../../ReportManager"; +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +import { TestResultsConfiguration } from "../../config/report/TestResultsConfiguration"; +import { RecipientsConfiguration } from "../../config/mail/RecipientsConfiguration"; +import { SmtpConfiguration } from "../../config/mail/SmtpConfiguration"; +import { PipelineType } from "../../config/pipeline/PipelineType"; +import { ReportProvider } from "../../providers/ReportProvider"; +import { DataProviderFactory } from "../../providers/DataProviderFactory"; +import { HTMLReportCreator } from "../../htmlreport/HTMLReportCreator"; +import { isNullOrUndefined } from "util"; +import { EmailSender } from "../../EmailSender"; +import { TelemetryLogger } from "../../telemetry/TelemetryLogger"; + +const fs = require("fs"); +const accessKey = process.env.AccessKey; +const smtpUser = process.env.SMTPUSER; +const smtpPassword = process.env.SMTPPASSWORD; + + +export class FileWriter { + + static writeToFile(content: string, fileName: string): void { + const currDir = __dirname; + console.log(`CurrentDir: ${currDir}`); + var msgPath = `${currDir}\\${fileName}`; + fs.writeFile(msgPath, content, (err: string) => { + if (err) { + return console.log(err); + } + console.log("File saved successfully!") + } + ); + } +} + +export class MockConfigProvider implements IConfigurationProvider { + + getPipelineConfiguration(): PipelineConfiguration { + return new PipelineConfiguration(PipelineType.Release, 13942411, "ProjectId", "ProjectName", 160977787, 9462, false, "https://dev.azure.com/{account}/", accessKey); + } + + getMailConfiguration(): MailConfiguration { + return new MailConfiguration("[{environmentStatus}] {passPercentage} tests passed", + new RecipientsConfiguration("xyz@email.com", false, false, false, false), + new RecipientsConfiguration("", false, false, false, false), + new SmtpConfiguration(smtpUser, smtpPassword, "smtp.live.com", true), "test.com"); + } + + getReportDataConfiguration(): ReportDataConfiguration { + const testResultsConfig = new TestResultsConfiguration(true, false, false, false, false, GroupTestResultsBy.Run, 10); + return new ReportDataConfiguration(true, false, true, [GroupTestResultsBy.Priority, GroupTestResultsBy.Run], testResultsConfig); + } + + getSendMailCondition(): SendMailCondition { + return SendMailCondition.Always; + } +} + +async function run(): Promise { + + console.log('Node Version: ' + process.version); + const configProvider = new MockConfigProvider(); + const reportConfiguration = new ReportConfiguration(configProvider); + TelemetryLogger.LogTaskConfig(reportConfiguration); + const reportManager = new ReportManager( + new ReportProvider(new DataProviderFactory(configProvider.getPipelineConfiguration())), + new HTMLReportCreator(), + new EmailSender()); + + reportManager.sendReportAsync(reportConfiguration); +} + +if (isNullOrUndefined(accessKey)) { + console.error("Set Environment Vars for AccessKey."); +} else { + run(); +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts b/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts new file mode 100644 index 00000000..b96c9c9a --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts @@ -0,0 +1,22 @@ +import sinon from "sinon"; +import { ReportFactory } from "../../model/ReportFactory"; +import { IReportProvider } from "../../providers/IReportProvider"; +import { ReportProvider } from "../../providers/ReportProvider"; +import { ReportManager } from "../../ReportManager"; +import { MissingDataError } from "../../exceptions/MissingDataError"; + +describe("ReportManager Tests", () => { + + let reportProvider: IReportProvider = sinon.createStubInstance(ReportProvider); + + beforeEach(() => { + const report = ReportFactory.createNewReport(null); + sinon.stub(reportProvider, "createReportAsync").returns(Promise.resolve(report)); + sinon.stub(report, "$dataMissing").returns(true); + }); + + test("ReportManager throws error when datamissing from report", async () => { + let reportManager = new ReportManager(reportProvider, null, null); + expect(reportManager.sendReportAsync(null)).rejects.toThrow(MissingDataError); + }); +}); diff --git a/Tasks/emailReportTask/emailReportTaskV2/tsconfig.json b/Tasks/emailReportTask/emailReportTaskV2/tsconfig.json new file mode 100644 index 00000000..ea293a6e --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "ES6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "strictPropertyInitialization": false, + "noImplicitReturns": true, + "declaration": true, + "sourceMap": true, + /* Strict Type-Checking Options */ + "strict": false, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "outDir": "../../dist/emailReportExtension/emailReportTask" + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.ts b/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.ts new file mode 100644 index 00000000..1237323a --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.ts @@ -0,0 +1,10 @@ +export class DisplayNameHelper { + + public static getPriorityDisplayName(priority: string): string { + const priorityInt = Number.parseInt(priority); + if (!isNaN(priorityInt) && priorityInt == 255) { + return "Priority unspecified"; + } + return `Priority: ${priority}`; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.ts b/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.ts new file mode 100644 index 00000000..1feb602d --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.ts @@ -0,0 +1,45 @@ +import { SendMailCondition } from "../config/report/SendMailCondition"; +import { GroupTestResultsBy } from "../config/report/GroupTestResultsBy"; + +export class EnumUtils { + + public static GetMailConditionString(condition: SendMailCondition): string { + let index = 0; + for(let val in SendMailCondition) { + if(!isNaN(Number(val)) && condition == Number(val)) { + break; + } + index++; + } + + let index2 = 0; + for(let val in SendMailCondition) { + if(isNaN(Number(val))) { + if(index2 == index) return val; + index2++; + } + } + + return null; + } + + public static GetGroupTestResultsByString(condition: GroupTestResultsBy): string { + let index = 0; + for(let val in GroupTestResultsBy) { + if(!isNaN(Number(val)) && condition == Number(val)) { + break; + } + index++; + } + + let index2 = 0; + for(let val in GroupTestResultsBy) { + if(isNaN(Number(val))) { + if(index2 == index) return val; + index2++; + } + } + + return null; + } +} \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.ts b/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.ts new file mode 100644 index 00000000..2e111619 --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.ts @@ -0,0 +1,19 @@ +import { ReleaseDeployPhase, ReleaseEnvironment, DeploymentAttempt } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; + +export class EnvironmentExtensions { + static getPhases(environment: ReleaseEnvironment): Array { + const phases = new Array(); + if (environment.deploySteps != null && environment.deploySteps.length > 0) { + let attempt = 0; + let latestDeploySteps: DeploymentAttempt = environment.deploySteps[0]; + for (var i: number = 0; i < environment.deploySteps.length; i++) { + if (environment.deploySteps[i].attempt > attempt) { + latestDeploySteps = environment.deploySteps[i]; + } + } + + phases.push(...latestDeploySteps.releaseDeployPhases); + } + return phases; + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.ts b/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.ts new file mode 100644 index 00000000..5e7d1d0f --- /dev/null +++ b/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.ts @@ -0,0 +1,40 @@ +export class StringUtils { + public static isNullOrWhiteSpace(input: string): boolean { + + if (typeof input === 'undefined' || input == null) return true; + + return input.replace("/\s/g", '').length < 1; + } + + public static CompressNewLines(content: string): string { + if (content != null) { + const lines = this.getNonEmptyLines(content); + content = lines.join("\n"); + } + return content; + } + + private static getNonEmptyLines(s: string): string[] { + s = s.replace("\r", ""); + return s.split('\n') + .filter(str => !this.isNullOrWhiteSpace(str)) + .map(str => str.trim()); + } + + public static ReplaceNewlineWithBrTag(content: string): string { + if (content == null) { + return null; + } + + const lines = this.getNonEmptyLines(content); + return lines.join("
"); + } + + public static getFirstNLines(content: string, lineCount: number): string { + if (content != null) { + var lines = this.getNonEmptyLines(content); + return lines.slice(0, lineCount).join("\n"); + } + return null; + } +} \ No newline at end of file From ca2f72573a636a08c31b7f835d91d162fa648421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Tue, 22 Aug 2023 15:08:25 +0300 Subject: [PATCH 02/11] update required pacakges --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b8ebd691..6d4aa564 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@types/stats-lite": "^2.2.0", "@types/string-template": "^1.0.2", "azure-devops-node-api": "^10.0.0", - "azure-pipelines-task-lib": "^2.8.0", + "azure-pipelines-task-lib": "^4.1.0", "nodemailer": "^6.3.0", "object-to-xml": "^2.0.0", "performance-now": "^2.1.0", @@ -42,7 +42,7 @@ }, "devDependencies": { "@types/jest": "^24.0.15", - "@types/node": "^12.0.4", + "@types/node": "^16.11.39", "@types/q": "^1.5.2", "jest": "^24.8.0", "rimraf": "^2.6.3", From c2575eeb19aec0afbc66da7efcb558803c20fefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Tue, 22 Aug 2023 15:23:32 +0300 Subject: [PATCH 03/11] rename V2 extension --- Tasks/emailReportTask/emailReportTaskV2/package.json | 3 ++- Tasks/emailReportTask/emailReportTaskV2/task.dev.json | 2 +- Tasks/emailReportTask/emailReportTaskV2/task.prod.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Tasks/emailReportTask/emailReportTaskV2/package.json b/Tasks/emailReportTask/emailReportTaskV2/package.json index 6b1b0d46..f6473fd4 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/package.json +++ b/Tasks/emailReportTask/emailReportTaskV2/package.json @@ -6,9 +6,10 @@ "license": "ISC", "main": "../../dist/emailReportExtension/emailReportTask/index.js", "types": "../../dist/emailReportExtension/emailReportTask/index.d.ts", + "minimumAgentVersion": "2.144.0", "dependencies": { "azure-devops-node-api": "^10.0.0", - "azure-pipelines-task-lib": "^2.8.0", + "azure-pipelines-task-lib": "^^4.1.0", "nodemailer": "^6.3.0", "object-to-xml": "^2.0.0", "performance-now": "^2.1.0", diff --git a/Tasks/emailReportTask/emailReportTaskV2/task.dev.json b/Tasks/emailReportTask/emailReportTaskV2/task.dev.json index cae92312..53b172ac 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/task.dev.json +++ b/Tasks/emailReportTask/emailReportTaskV2/task.dev.json @@ -1,6 +1,6 @@ { "id": "59a02370-5b4b-4236-95bd-673180e2cbf2", - "name": "EmailReportPPE", + "name": "EmailReportPPEV2", "friendlyName": "Email Report PPE (Testing Purposes)", "description": "Send rich email report for test results and for tasks in this stage", "helpMarkDown": "Sets 'EmailReportTask.EmailSent' variable to true if it sent email successfully. https://marketplace.visualstudio.com/items?itemName=epsteam.EmailReportExtension", diff --git a/Tasks/emailReportTask/emailReportTaskV2/task.prod.json b/Tasks/emailReportTask/emailReportTaskV2/task.prod.json index f15f999c..6469e0e7 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/task.prod.json +++ b/Tasks/emailReportTask/emailReportTaskV2/task.prod.json @@ -1,6 +1,6 @@ { "id": "36fd41b1-8024-4ce9-a5a0-53c3e54ed105", - "name": "EmailReport", + "name": "EmailReportV2", "friendlyName": "Email Report", "description": "Send rich email report for test results and for tasks in this stage", "helpMarkDown": "Sets 'EmailReportTask.EmailSent' variable to true if it sent email successfully. [Learn More](https://marketplace.visualstudio.com/items?itemName=epsteam.EmailReportExtension)", From 832be702fa614236a4fddcc074c84de06f75c7f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Tue, 22 Aug 2023 16:02:32 +0300 Subject: [PATCH 04/11] rename to V1, add new package commands --- .../EmailSender.ts | 0 .../IReportSender.ts | 0 .../README.md | 0 .../ReportManager.ts | 0 .../config/ConfigurationProvider.ts | 0 .../config/IConfigurationProvider.ts | 0 .../config/ReportConfiguration.ts | 0 .../config/TaskConstants.ts | 0 .../config/mail/MailConfiguration.ts | 0 .../config/mail/RecipientsConfiguration.ts | 0 .../config/mail/SmtpConfiguration.ts | 0 .../config/pipeline/PipelineConfiguration.ts | 0 .../config/pipeline/PipelineType.ts | 0 .../config/report/GroupTestResultsBy.ts | 0 .../config/report/ReportDataConfiguration.ts | 0 .../config/report/SendMailCondition.ts | 0 .../config/report/TestResultsConfiguration.ts | 0 .../exceptions/DataProviderError.ts | 0 .../exceptions/InputError.ts | 0 .../exceptions/InvalidTestResultDataError.ts | 0 .../exceptions/MailError.ts | 0 .../exceptions/MissingDataError.ts | 0 .../exceptions/PipelineNotFoundError.ts | 0 .../exceptions/PostProcessorError.ts | 0 .../exceptions/ReportError.ts | 0 .../htmlreport/EmailTemplate.xslt | 0 .../htmlreport/HTMLReportCreator.ts | 0 .../htmlreport/IHTMLReportCreator.ts | 0 .../images/GenericEndPoint.png | Bin .../images/TaskConfig.png | Bin .../images/TaskConfig2.png | Bin .../images/icon.png | Bin .../index.ts | 0 .../model/BuildReport.ts | 0 .../model/ChangeModel.ts | 0 .../model/IssueModel.ts | 0 .../model/JobModel.ts | 0 .../model/PhaseModel.ts | 0 .../model/ReleaseReport.ts | 0 .../model/Report.ts | 0 .../model/ReportFactory.ts | 0 .../model/TaskModel.ts | 0 .../model/helpers/LinkHelper.ts | 0 .../model/helpers/TestResultsHelper.ts | 0 .../model/helpers/TimeFormatter.ts | 0 .../testresults/TestOutcomeForPriority.ts | 0 .../model/testresults/TestResultGroupModel.ts | 0 .../model/testresults/TestResultModel.ts | 0 .../testresults/TestSummaryGroupModel.ts | 0 .../model/testresults/TestSummaryItemModel.ts | 0 .../model/viewmodel/ArtifactViewModel.ts | 0 .../viewmodel/BuildReferenceViewModel.ts | 0 .../model/viewmodel/ChangeViewModel.ts | 0 .../model/viewmodel/DeploymentJobViewModel.ts | 0 .../model/viewmodel/EmailReportViewModel.ts | 0 .../model/viewmodel/MailAddressViewModel.ts | 0 .../model/viewmodel/PhaseIssuesViewModel.ts | 0 .../model/viewmodel/PhaseViewModel.ts | 0 .../viewmodel/ReleaseEnvironmentViewModel.ts | 0 .../viewmodel/ReleaseReferenceViewModel.ts | 0 .../model/viewmodel/ReleaseViewModel.ts | 0 .../viewmodel/TaskIssueSummaryViewModel.ts | 0 .../model/viewmodel/TaskIssueViewModel.ts | 0 .../model/viewmodel/TaskResultViewModel.ts | 0 .../viewmodel/TestInfoByPriorityViewModel.ts | 0 .../viewmodel/TestResultSummaryViewModel.ts | 0 .../model/viewmodel/TestResultViewModel.ts | 0 .../viewmodel/TestResultsGroupViewModel.ts | 0 .../viewmodel/TestSummaryGroupViewModel.ts | 0 .../viewmodel/TestSummaryItemViewModel.ts | 0 .../model/viewmodel/WorkItemViewModel.ts | 0 .../package.json | 0 .../providers/DataProviderFactory.ts | 0 .../providers/IDataProvider.ts | 0 .../providers/IDataProviderFactory.ts | 0 .../providers/IPostProcessor.ts | 0 .../providers/IReportProvider.ts | 0 .../providers/ReportProvider.ts | 0 .../providers/SendMailConditionProcessor.ts | 0 .../AbstractTestResultsDetailsParser.ts | 0 .../helpers/TestResultDetailsParserFactory.ts | 0 .../TestResultDetailsParserForPriority.ts | 0 .../helpers/TestResultDetailsParserForRun.ts | 0 .../providers/pipeline/BuildDataProvider.ts | 0 .../providers/pipeline/ReleaseDataProvider.ts | 0 .../providers/restclients/AbstractClient.ts | 0 .../restclients/AbstractTestResultsClient.ts | 0 .../providers/restclients/BuildClient.ts | 0 .../restclients/BuildTestResultsClient.ts | 0 .../restclients/IPipelineRestClient.ts | 0 .../restclients/ITestResultsClient.ts | 0 .../providers/restclients/IWorkItemClient.ts | 0 .../providers/restclients/ReleaseClient.ts | 0 .../restclients/ReleaseTestResultsClient.ts | 0 .../providers/restclients/RetryablePromise.ts | 0 .../providers/restclients/WorkItemClient.ts | 0 .../providers/tcmproviders/TcmHelper.ts | 0 .../tcmproviders/TestOwnersDataProvider.ts | 0 .../tcmproviders/TestResultsDataProvider.ts | 0 .../tcmproviders/TestSummaryDataProvider.ts | 0 .../task.dev.json | 0 .../task.prod.json | 0 .../telemetry/TelemetryLogger.ts | 0 .../tests/__e_to_e_tests__/InvokeTest.ts | 0 .../tests/__tests__/ReportManagerTests.ts | 0 .../tsconfig.json | 0 .../utils/DisplayNameHelper.ts | 0 .../utils/EnumUtils.ts | 0 .../utils/EnvironmentExtensions.ts | 0 .../utils/StringUtils.ts | 0 .../vss-extension.json | 0 package.json | 19 ++++++++++++++++-- 112 files changed, 17 insertions(+), 2 deletions(-) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/EmailSender.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/IReportSender.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/README.md (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/ReportManager.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/ConfigurationProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/IConfigurationProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/ReportConfiguration.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/TaskConstants.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/mail/MailConfiguration.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/mail/RecipientsConfiguration.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/mail/SmtpConfiguration.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/pipeline/PipelineConfiguration.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/pipeline/PipelineType.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/report/GroupTestResultsBy.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/report/ReportDataConfiguration.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/report/SendMailCondition.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/config/report/TestResultsConfiguration.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/exceptions/DataProviderError.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/exceptions/InputError.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/exceptions/InvalidTestResultDataError.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/exceptions/MailError.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/exceptions/MissingDataError.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/exceptions/PipelineNotFoundError.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/exceptions/PostProcessorError.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/exceptions/ReportError.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/htmlreport/EmailTemplate.xslt (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/htmlreport/HTMLReportCreator.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/htmlreport/IHTMLReportCreator.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/images/GenericEndPoint.png (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/images/TaskConfig.png (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/images/TaskConfig2.png (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/images/icon.png (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/index.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/BuildReport.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/ChangeModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/IssueModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/JobModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/PhaseModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/ReleaseReport.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/Report.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/ReportFactory.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/TaskModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/helpers/LinkHelper.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/helpers/TestResultsHelper.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/helpers/TimeFormatter.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/testresults/TestOutcomeForPriority.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/testresults/TestResultGroupModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/testresults/TestResultModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/testresults/TestSummaryGroupModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/testresults/TestSummaryItemModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/ArtifactViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/BuildReferenceViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/ChangeViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/DeploymentJobViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/EmailReportViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/MailAddressViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/PhaseIssuesViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/PhaseViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/ReleaseEnvironmentViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/ReleaseReferenceViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/ReleaseViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TaskIssueSummaryViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TaskIssueViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TaskResultViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TestInfoByPriorityViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TestResultSummaryViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TestResultViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TestResultsGroupViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TestSummaryGroupViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/TestSummaryItemViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/model/viewmodel/WorkItemViewModel.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/package.json (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/DataProviderFactory.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/IDataProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/IDataProviderFactory.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/IPostProcessor.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/IReportProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/ReportProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/SendMailConditionProcessor.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/helpers/AbstractTestResultsDetailsParser.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/helpers/TestResultDetailsParserFactory.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/helpers/TestResultDetailsParserForPriority.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/helpers/TestResultDetailsParserForRun.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/pipeline/BuildDataProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/pipeline/ReleaseDataProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/AbstractClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/AbstractTestResultsClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/BuildClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/BuildTestResultsClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/IPipelineRestClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/ITestResultsClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/IWorkItemClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/ReleaseClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/ReleaseTestResultsClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/RetryablePromise.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/restclients/WorkItemClient.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/tcmproviders/TcmHelper.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/tcmproviders/TestOwnersDataProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/tcmproviders/TestResultsDataProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/providers/tcmproviders/TestSummaryDataProvider.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/task.dev.json (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/task.prod.json (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/telemetry/TelemetryLogger.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/tests/__e_to_e_tests__/InvokeTest.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/tests/__tests__/ReportManagerTests.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/tsconfig.json (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/utils/DisplayNameHelper.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/utils/EnumUtils.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/utils/EnvironmentExtensions.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/utils/StringUtils.ts (100%) rename Tasks/emailReportTask/{emailReportTask => emailReportTaskV1}/vss-extension.json (100%) diff --git a/Tasks/emailReportTask/emailReportTask/EmailSender.ts b/Tasks/emailReportTask/emailReportTaskV1/EmailSender.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/EmailSender.ts rename to Tasks/emailReportTask/emailReportTaskV1/EmailSender.ts diff --git a/Tasks/emailReportTask/emailReportTask/IReportSender.ts b/Tasks/emailReportTask/emailReportTaskV1/IReportSender.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/IReportSender.ts rename to Tasks/emailReportTask/emailReportTaskV1/IReportSender.ts diff --git a/Tasks/emailReportTask/emailReportTask/README.md b/Tasks/emailReportTask/emailReportTaskV1/README.md similarity index 100% rename from Tasks/emailReportTask/emailReportTask/README.md rename to Tasks/emailReportTask/emailReportTaskV1/README.md diff --git a/Tasks/emailReportTask/emailReportTask/ReportManager.ts b/Tasks/emailReportTask/emailReportTaskV1/ReportManager.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/ReportManager.ts rename to Tasks/emailReportTask/emailReportTaskV1/ReportManager.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/ConfigurationProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/ConfigurationProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/IConfigurationProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/IConfigurationProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/ReportConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/ReportConfiguration.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/TaskConstants.ts b/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/TaskConstants.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/mail/MailConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/mail/MailConfiguration.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/mail/RecipientsConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/mail/RecipientsConfiguration.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/mail/SmtpConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/mail/SmtpConfiguration.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/pipeline/PipelineConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/pipeline/PipelineConfiguration.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/pipeline/PipelineType.ts b/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/pipeline/PipelineType.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/report/GroupTestResultsBy.ts b/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/report/GroupTestResultsBy.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/report/ReportDataConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/report/ReportDataConfiguration.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/report/SendMailCondition.ts b/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/report/SendMailCondition.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.ts diff --git a/Tasks/emailReportTask/emailReportTask/config/report/TestResultsConfiguration.ts b/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/config/report/TestResultsConfiguration.ts rename to Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTask/exceptions/DataProviderError.ts b/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/exceptions/DataProviderError.ts rename to Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.ts diff --git a/Tasks/emailReportTask/emailReportTask/exceptions/InputError.ts b/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/exceptions/InputError.ts rename to Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.ts diff --git a/Tasks/emailReportTask/emailReportTask/exceptions/InvalidTestResultDataError.ts b/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/exceptions/InvalidTestResultDataError.ts rename to Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts diff --git a/Tasks/emailReportTask/emailReportTask/exceptions/MailError.ts b/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/exceptions/MailError.ts rename to Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.ts diff --git a/Tasks/emailReportTask/emailReportTask/exceptions/MissingDataError.ts b/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/exceptions/MissingDataError.ts rename to Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.ts diff --git a/Tasks/emailReportTask/emailReportTask/exceptions/PipelineNotFoundError.ts b/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/exceptions/PipelineNotFoundError.ts rename to Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.ts diff --git a/Tasks/emailReportTask/emailReportTask/exceptions/PostProcessorError.ts b/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/exceptions/PostProcessorError.ts rename to Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.ts diff --git a/Tasks/emailReportTask/emailReportTask/exceptions/ReportError.ts b/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/exceptions/ReportError.ts rename to Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.ts diff --git a/Tasks/emailReportTask/emailReportTask/htmlreport/EmailTemplate.xslt b/Tasks/emailReportTask/emailReportTaskV1/htmlreport/EmailTemplate.xslt similarity index 100% rename from Tasks/emailReportTask/emailReportTask/htmlreport/EmailTemplate.xslt rename to Tasks/emailReportTask/emailReportTaskV1/htmlreport/EmailTemplate.xslt diff --git a/Tasks/emailReportTask/emailReportTask/htmlreport/HTMLReportCreator.ts b/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/htmlreport/HTMLReportCreator.ts rename to Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.ts diff --git a/Tasks/emailReportTask/emailReportTask/htmlreport/IHTMLReportCreator.ts b/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/htmlreport/IHTMLReportCreator.ts rename to Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts diff --git a/Tasks/emailReportTask/emailReportTask/images/GenericEndPoint.png b/Tasks/emailReportTask/emailReportTaskV1/images/GenericEndPoint.png similarity index 100% rename from Tasks/emailReportTask/emailReportTask/images/GenericEndPoint.png rename to Tasks/emailReportTask/emailReportTaskV1/images/GenericEndPoint.png diff --git a/Tasks/emailReportTask/emailReportTask/images/TaskConfig.png b/Tasks/emailReportTask/emailReportTaskV1/images/TaskConfig.png similarity index 100% rename from Tasks/emailReportTask/emailReportTask/images/TaskConfig.png rename to Tasks/emailReportTask/emailReportTaskV1/images/TaskConfig.png diff --git a/Tasks/emailReportTask/emailReportTask/images/TaskConfig2.png b/Tasks/emailReportTask/emailReportTaskV1/images/TaskConfig2.png similarity index 100% rename from Tasks/emailReportTask/emailReportTask/images/TaskConfig2.png rename to Tasks/emailReportTask/emailReportTaskV1/images/TaskConfig2.png diff --git a/Tasks/emailReportTask/emailReportTask/images/icon.png b/Tasks/emailReportTask/emailReportTaskV1/images/icon.png similarity index 100% rename from Tasks/emailReportTask/emailReportTask/images/icon.png rename to Tasks/emailReportTask/emailReportTaskV1/images/icon.png diff --git a/Tasks/emailReportTask/emailReportTask/index.ts b/Tasks/emailReportTask/emailReportTaskV1/index.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/index.ts rename to Tasks/emailReportTask/emailReportTaskV1/index.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/BuildReport.ts b/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/BuildReport.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/ChangeModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/ChangeModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/IssueModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/IssueModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/JobModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/JobModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/JobModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/PhaseModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/PhaseModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/ReleaseReport.ts b/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/ReleaseReport.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/Report.ts b/Tasks/emailReportTask/emailReportTaskV1/model/Report.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/Report.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/Report.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/ReportFactory.ts b/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/ReportFactory.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/TaskModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/TaskModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/helpers/LinkHelper.ts b/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/helpers/LinkHelper.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/helpers/TestResultsHelper.ts b/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/helpers/TestResultsHelper.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/helpers/TimeFormatter.ts b/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/helpers/TimeFormatter.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/testresults/TestOutcomeForPriority.ts b/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/testresults/TestOutcomeForPriority.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/testresults/TestResultGroupModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/testresults/TestResultGroupModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/testresults/TestResultModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/testresults/TestResultModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/testresults/TestSummaryGroupModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/testresults/TestSummaryGroupModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/testresults/TestSummaryItemModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/testresults/TestSummaryItemModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/ArtifactViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/ArtifactViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/BuildReferenceViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/BuildReferenceViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/ChangeViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/ChangeViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/DeploymentJobViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/DeploymentJobViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/EmailReportViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/EmailReportViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/MailAddressViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/MailAddressViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/PhaseIssuesViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/PhaseIssuesViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/PhaseViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/PhaseViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseEnvironmentViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseEnvironmentViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseReferenceViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseReferenceViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/ReleaseViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskIssueSummaryViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskIssueSummaryViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskIssueViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskIssueViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskResultViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TaskResultViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestInfoByPriorityViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TestInfoByPriorityViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultSummaryViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultSummaryViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultsGroupViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TestResultsGroupViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestSummaryGroupViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TestSummaryGroupViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/TestSummaryItemViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/TestSummaryItemViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/model/viewmodel/WorkItemViewModel.ts b/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/model/viewmodel/WorkItemViewModel.ts rename to Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTask/package.json b/Tasks/emailReportTask/emailReportTaskV1/package.json similarity index 100% rename from Tasks/emailReportTask/emailReportTask/package.json rename to Tasks/emailReportTask/emailReportTaskV1/package.json diff --git a/Tasks/emailReportTask/emailReportTask/providers/DataProviderFactory.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/DataProviderFactory.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/IDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/IDataProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/IDataProviderFactory.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/IDataProviderFactory.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/IPostProcessor.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/IPostProcessor.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/IReportProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/IReportProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/ReportProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/ReportProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/SendMailConditionProcessor.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/SendMailConditionProcessor.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/helpers/AbstractTestResultsDetailsParser.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/helpers/AbstractTestResultsDetailsParser.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserFactory.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserFactory.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserForPriority.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserForPriority.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserForRun.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/helpers/TestResultDetailsParserForRun.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/pipeline/BuildDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/pipeline/BuildDataProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/pipeline/ReleaseDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/pipeline/ReleaseDataProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/AbstractClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/AbstractClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/AbstractTestResultsClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/AbstractTestResultsClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/BuildClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/BuildClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/BuildTestResultsClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/BuildTestResultsClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/IPipelineRestClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/IPipelineRestClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/ITestResultsClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/ITestResultsClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/IWorkItemClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/IWorkItemClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/ReleaseClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/ReleaseClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/ReleaseTestResultsClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/ReleaseTestResultsClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/RetryablePromise.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/RetryablePromise.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/restclients/WorkItemClient.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/restclients/WorkItemClient.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TcmHelper.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TcmHelper.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestOwnersDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestOwnersDataProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestResultsDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestResultsDataProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestSummaryDataProvider.ts b/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/providers/tcmproviders/TestSummaryDataProvider.ts rename to Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTask/task.dev.json b/Tasks/emailReportTask/emailReportTaskV1/task.dev.json similarity index 100% rename from Tasks/emailReportTask/emailReportTask/task.dev.json rename to Tasks/emailReportTask/emailReportTaskV1/task.dev.json diff --git a/Tasks/emailReportTask/emailReportTask/task.prod.json b/Tasks/emailReportTask/emailReportTaskV1/task.prod.json similarity index 100% rename from Tasks/emailReportTask/emailReportTask/task.prod.json rename to Tasks/emailReportTask/emailReportTaskV1/task.prod.json diff --git a/Tasks/emailReportTask/emailReportTask/telemetry/TelemetryLogger.ts b/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/telemetry/TelemetryLogger.ts rename to Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.ts diff --git a/Tasks/emailReportTask/emailReportTask/tests/__e_to_e_tests__/InvokeTest.ts b/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/tests/__e_to_e_tests__/InvokeTest.ts rename to Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts diff --git a/Tasks/emailReportTask/emailReportTask/tests/__tests__/ReportManagerTests.ts b/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/tests/__tests__/ReportManagerTests.ts rename to Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts diff --git a/Tasks/emailReportTask/emailReportTask/tsconfig.json b/Tasks/emailReportTask/emailReportTaskV1/tsconfig.json similarity index 100% rename from Tasks/emailReportTask/emailReportTask/tsconfig.json rename to Tasks/emailReportTask/emailReportTaskV1/tsconfig.json diff --git a/Tasks/emailReportTask/emailReportTask/utils/DisplayNameHelper.ts b/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/utils/DisplayNameHelper.ts rename to Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.ts diff --git a/Tasks/emailReportTask/emailReportTask/utils/EnumUtils.ts b/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/utils/EnumUtils.ts rename to Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.ts diff --git a/Tasks/emailReportTask/emailReportTask/utils/EnvironmentExtensions.ts b/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/utils/EnvironmentExtensions.ts rename to Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.ts diff --git a/Tasks/emailReportTask/emailReportTask/utils/StringUtils.ts b/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTask/utils/StringUtils.ts rename to Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.ts diff --git a/Tasks/emailReportTask/emailReportTask/vss-extension.json b/Tasks/emailReportTask/emailReportTaskV1/vss-extension.json similarity index 100% rename from Tasks/emailReportTask/emailReportTask/vss-extension.json rename to Tasks/emailReportTask/emailReportTaskV1/vss-extension.json diff --git a/package.json b/package.json index 6d4aa564..9b79b7f5 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,23 @@ "e2e:t1": "npm run e2e:emailreport", "e2e:t2": "npm run e2e:prinsights", "build:prinsights": "tsc -p Tasks/pullRequestInsightsTask/tsconfig.json", + + "build:test": "nom run prebuild && np run deps:npm:tasks && npm run deps:prune:tasks", "build:emailreport": "tsc -p Tasks/emailReportTask/tsconfig.json && node ./commands/postbuild.js emailReport", "pack:emailreport": "node ./commands/package.js emailreport", + "deps:npm:tasks": "glob-exec --parallel --foreach \"Tasks/emailReportTask/*/tsconfig.json\" -- \"cd {{file.dir}} && npm install --no-update-notifier --no-progress\"", + "deps:prune:tasks": "glob-exec --parallel --foreach \"Tasks/TerraformTask/*/tsconfig.json\" -- \"cd {{file.dir}} && npm prune --production --no-update-notifier --no-progress\"", + "pack:prinsights": "node ./commands/package.js pullRequestInsights", + "e2e:emailreport": "node js/emailReportExtension/emailReportTask/tests/__e_to_e_tests__/InvokeTest.js", + "e2e:prinsights": "node js/pullRequestInsightsExtension/pullRequestInsightsTask/tests/__e_to_e_tests__/InvokeTest.js", "clean": "rimraf dist" + + + + }, "repository": { "type": "git", @@ -48,10 +59,14 @@ "rimraf": "^2.6.3", "sinon": "^7.3.2", "source-map-loader": "^0.2.3", - "tfx-cli": "^0.7.8", + "tfx-cli": "^0.12.0", "ts-jest": "^24.0.2", "ts-loader": "^6.0.4", - "typescript": "^3.5.3" + "typescript": "^3.5.3", + "webpack": "^4.46.0", + "webpack-cli": "^4.9.2", + "glob-parent": ">=6.0.2", + "glob-exec": "^0.1.1" }, "optionalDependencies": { "fsevents": "*" From c5950465f58fc6b2a904d40ec76147533ad7a150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Mon, 28 Aug 2023 17:49:49 +0300 Subject: [PATCH 05/11] restructure extension, add webpack to package application --- .../Tasks}/emailReportTaskV1/EmailSender.ts | 0 .../Tasks}/emailReportTaskV1/IReportSender.ts | 0 .../Tasks}/emailReportTaskV1/README.md | 0 .../Tasks}/emailReportTaskV1/ReportManager.ts | 0 .../config/ConfigurationProvider.ts | 0 .../config/IConfigurationProvider.ts | 0 .../config/ReportConfiguration.ts | 0 .../emailReportTaskV1/config/TaskConstants.ts | 0 .../config/mail/MailConfiguration.ts | 0 .../config/mail/RecipientsConfiguration.ts | 0 .../config/mail/SmtpConfiguration.ts | 0 .../config/pipeline/PipelineConfiguration.ts | 0 .../config/pipeline/PipelineType.ts | 0 .../config/report/GroupTestResultsBy.ts | 0 .../config/report/ReportDataConfiguration.ts | 0 .../config/report/SendMailCondition.ts | 0 .../config/report/TestResultsConfiguration.ts | 0 .../exceptions/DataProviderError.ts | 0 .../exceptions/InputError.ts | 0 .../exceptions/InvalidTestResultDataError.ts | 0 .../emailReportTaskV1/exceptions/MailError.ts | 0 .../exceptions/MissingDataError.ts | 0 .../exceptions/PipelineNotFoundError.ts | 0 .../exceptions/PostProcessorError.ts | 0 .../exceptions/ReportError.ts | 0 .../htmlreport/EmailTemplate.xslt | 0 .../htmlreport/HTMLReportCreator.ts | 0 .../htmlreport/IHTMLReportCreator.ts | 0 .../Tasks}/emailReportTaskV1/index.ts | 2 +- .../emailReportTaskV1/model/BuildReport.ts | 0 .../emailReportTaskV1/model/ChangeModel.ts | 0 .../emailReportTaskV1/model/IssueModel.ts | 0 .../emailReportTaskV1/model/JobModel.ts | 0 .../emailReportTaskV1/model/PhaseModel.ts | 0 .../emailReportTaskV1/model/ReleaseReport.ts | 0 .../Tasks}/emailReportTaskV1/model/Report.ts | 0 .../emailReportTaskV1/model/ReportFactory.ts | 0 .../emailReportTaskV1/model/TaskModel.ts | 0 .../model/helpers/LinkHelper.ts | 0 .../model/helpers/TestResultsHelper.ts | 0 .../model/helpers/TimeFormatter.ts | 0 .../testresults/TestOutcomeForPriority.ts | 0 .../model/testresults/TestResultGroupModel.ts | 0 .../model/testresults/TestResultModel.ts | 0 .../testresults/TestSummaryGroupModel.ts | 0 .../model/testresults/TestSummaryItemModel.ts | 0 .../model/viewmodel/ArtifactViewModel.ts | 0 .../viewmodel/BuildReferenceViewModel.ts | 0 .../model/viewmodel/ChangeViewModel.ts | 0 .../model/viewmodel/DeploymentJobViewModel.ts | 0 .../model/viewmodel/EmailReportViewModel.ts | 0 .../model/viewmodel/MailAddressViewModel.ts | 0 .../model/viewmodel/PhaseIssuesViewModel.ts | 0 .../model/viewmodel/PhaseViewModel.ts | 0 .../viewmodel/ReleaseEnvironmentViewModel.ts | 0 .../viewmodel/ReleaseReferenceViewModel.ts | 0 .../model/viewmodel/ReleaseViewModel.ts | 0 .../viewmodel/TaskIssueSummaryViewModel.ts | 0 .../model/viewmodel/TaskIssueViewModel.ts | 0 .../model/viewmodel/TaskResultViewModel.ts | 0 .../viewmodel/TestInfoByPriorityViewModel.ts | 0 .../viewmodel/TestResultSummaryViewModel.ts | 0 .../model/viewmodel/TestResultViewModel.ts | 0 .../viewmodel/TestResultsGroupViewModel.ts | 0 .../viewmodel/TestSummaryGroupViewModel.ts | 0 .../viewmodel/TestSummaryItemViewModel.ts | 0 .../model/viewmodel/WorkItemViewModel.ts | 0 .../Tasks/emailReportTaskV1/package-lock.json | 430 + .../Tasks}/emailReportTaskV1/package.json | 4 +- .../providers/DataProviderFactory.ts | 0 .../providers/IDataProvider.ts | 0 .../providers/IDataProviderFactory.ts | 0 .../providers/IPostProcessor.ts | 0 .../providers/IReportProvider.ts | 0 .../providers/ReportProvider.ts | 0 .../providers/SendMailConditionProcessor.ts | 0 .../AbstractTestResultsDetailsParser.ts | 0 .../helpers/TestResultDetailsParserFactory.ts | 0 .../TestResultDetailsParserForPriority.ts | 4 +- .../helpers/TestResultDetailsParserForRun.ts | 0 .../providers/pipeline/BuildDataProvider.ts | 0 .../providers/pipeline/ReleaseDataProvider.ts | 0 .../providers/restclients/AbstractClient.ts | 4 +- .../restclients/AbstractTestResultsClient.ts | 0 .../providers/restclients/BuildClient.ts | 0 .../restclients/BuildTestResultsClient.ts | 0 .../restclients/IPipelineRestClient.ts | 0 .../restclients/ITestResultsClient.ts | 0 .../providers/restclients/IWorkItemClient.ts | 0 .../providers/restclients/ReleaseClient.ts | 0 .../restclients/ReleaseTestResultsClient.ts | 0 .../providers/restclients/RetryablePromise.ts | 0 .../providers/restclients/WorkItemClient.ts | 0 .../providers/tcmproviders/TcmHelper.ts | 0 .../tcmproviders/TestOwnersDataProvider.ts | 0 .../tcmproviders/TestResultsDataProvider.ts | 0 .../tcmproviders/TestSummaryDataProvider.ts | 0 .../Tasks}/emailReportTaskV1/task.dev.json | 0 .../Tasks/emailReportTaskV1/task.json | 0 .../telemetry/TelemetryLogger.ts | 0 .../tests/__e_to_e_tests__/InvokeTest.ts | 0 .../tests/__tests__/ReportManagerTests.ts | 0 .../Tasks}/emailReportTaskV1/tsconfig.json | 2 +- .../utils/DisplayNameHelper.ts | 0 .../emailReportTaskV1/utils/EnumUtils.ts | 0 .../utils/EnvironmentExtensions.ts | 0 .../emailReportTaskV1/utils/StringUtils.ts | 0 .../emailReportTaskV1/vss-extension.json | 0 .../Tasks}/emailReportTaskV2/EmailSender.ts | 0 .../Tasks}/emailReportTaskV2/IReportSender.ts | 0 .../Tasks}/emailReportTaskV2/README.md | 0 .../Tasks}/emailReportTaskV2/ReportManager.ts | 0 .../config/ConfigurationProvider.ts | 0 .../config/IConfigurationProvider.ts | 0 .../config/ReportConfiguration.ts | 0 .../emailReportTaskV2/config/TaskConstants.ts | 0 .../config/mail/MailConfiguration.ts | 0 .../config/mail/RecipientsConfiguration.ts | 0 .../config/mail/SmtpConfiguration.ts | 0 .../config/pipeline/PipelineConfiguration.ts | 0 .../config/pipeline/PipelineType.ts | 0 .../config/report/GroupTestResultsBy.ts | 0 .../config/report/ReportDataConfiguration.ts | 0 .../config/report/SendMailCondition.ts | 0 .../config/report/TestResultsConfiguration.ts | 0 .../exceptions/DataProviderError.ts | 0 .../exceptions/InputError.ts | 0 .../exceptions/InvalidTestResultDataError.ts | 0 .../emailReportTaskV2/exceptions/MailError.ts | 0 .../exceptions/MissingDataError.ts | 0 .../exceptions/PipelineNotFoundError.ts | 0 .../exceptions/PostProcessorError.ts | 0 .../exceptions/ReportError.ts | 0 .../htmlreport/EmailTemplate.xslt | 0 .../htmlreport/HTMLReportCreator.ts | 0 .../htmlreport/IHTMLReportCreator.ts | 0 .../Tasks}/emailReportTaskV2/index.ts | 2 +- .../emailReportTaskV2/model/BuildReport.ts | 0 .../emailReportTaskV2/model/ChangeModel.ts | 0 .../emailReportTaskV2/model/IssueModel.ts | 0 .../emailReportTaskV2/model/JobModel.ts | 0 .../emailReportTaskV2/model/PhaseModel.ts | 0 .../emailReportTaskV2/model/ReleaseReport.ts | 0 .../Tasks}/emailReportTaskV2/model/Report.ts | 0 .../emailReportTaskV2/model/ReportFactory.ts | 0 .../emailReportTaskV2/model/TaskModel.ts | 0 .../model/helpers/LinkHelper.ts | 0 .../model/helpers/TestResultsHelper.ts | 0 .../model/helpers/TimeFormatter.ts | 0 .../testresults/TestOutcomeForPriority.ts | 0 .../model/testresults/TestResultGroupModel.ts | 0 .../model/testresults/TestResultModel.ts | 0 .../testresults/TestSummaryGroupModel.ts | 0 .../model/testresults/TestSummaryItemModel.ts | 0 .../model/viewmodel/ArtifactViewModel.ts | 0 .../viewmodel/BuildReferenceViewModel.ts | 0 .../model/viewmodel/ChangeViewModel.ts | 0 .../model/viewmodel/DeploymentJobViewModel.ts | 0 .../model/viewmodel/EmailReportViewModel.ts | 0 .../model/viewmodel/MailAddressViewModel.ts | 0 .../model/viewmodel/PhaseIssuesViewModel.ts | 0 .../model/viewmodel/PhaseViewModel.ts | 0 .../viewmodel/ReleaseEnvironmentViewModel.ts | 0 .../viewmodel/ReleaseReferenceViewModel.ts | 0 .../model/viewmodel/ReleaseViewModel.ts | 0 .../viewmodel/TaskIssueSummaryViewModel.ts | 0 .../model/viewmodel/TaskIssueViewModel.ts | 0 .../model/viewmodel/TaskResultViewModel.ts | 0 .../viewmodel/TestInfoByPriorityViewModel.ts | 0 .../viewmodel/TestResultSummaryViewModel.ts | 0 .../model/viewmodel/TestResultViewModel.ts | 0 .../viewmodel/TestResultsGroupViewModel.ts | 0 .../viewmodel/TestSummaryGroupViewModel.ts | 0 .../viewmodel/TestSummaryItemViewModel.ts | 0 .../model/viewmodel/WorkItemViewModel.ts | 0 .../Tasks/emailReportTaskV2/package-lock.json | 688 + .../Tasks}/emailReportTaskV2/package.json | 6 +- .../providers/DataProviderFactory.ts | 0 .../providers/IDataProvider.ts | 0 .../providers/IDataProviderFactory.ts | 0 .../providers/IPostProcessor.ts | 0 .../providers/IReportProvider.ts | 0 .../providers/ReportProvider.ts | 0 .../providers/SendMailConditionProcessor.ts | 0 .../AbstractTestResultsDetailsParser.ts | 0 .../helpers/TestResultDetailsParserFactory.ts | 0 .../TestResultDetailsParserForPriority.ts | 4 +- .../helpers/TestResultDetailsParserForRun.ts | 0 .../providers/pipeline/BuildDataProvider.ts | 0 .../providers/pipeline/ReleaseDataProvider.ts | 0 .../providers/restclients/AbstractClient.ts | 4 +- .../restclients/AbstractTestResultsClient.ts | 0 .../providers/restclients/BuildClient.ts | 0 .../restclients/BuildTestResultsClient.ts | 0 .../restclients/IPipelineRestClient.ts | 0 .../restclients/ITestResultsClient.ts | 0 .../providers/restclients/IWorkItemClient.ts | 0 .../providers/restclients/ReleaseClient.ts | 0 .../restclients/ReleaseTestResultsClient.ts | 0 .../providers/restclients/RetryablePromise.ts | 0 .../providers/restclients/WorkItemClient.ts | 0 .../providers/tcmproviders/TcmHelper.ts | 0 .../tcmproviders/TestOwnersDataProvider.ts | 0 .../tcmproviders/TestResultsDataProvider.ts | 0 .../tcmproviders/TestSummaryDataProvider.ts | 0 .../Tasks}/emailReportTaskV2/task.dev.json | 0 .../Tasks/emailReportTaskV2/task.json | 8 +- .../telemetry/TelemetryLogger.ts | 0 .../tests/__e_to_e_tests__/InvokeTest.ts | 0 .../tests/__tests__/ReportManagerTests.ts | 0 .../Tasks}/emailReportTaskV2/tsconfig.json | 2 +- .../utils/DisplayNameHelper.ts | 0 .../emailReportTaskV2/utils/EnumUtils.ts | 0 .../utils/EnvironmentExtensions.ts | 0 .../emailReportTaskV2/utils/StringUtils.ts | 0 .../azure-devops-extensions.json | 2 +- .../images/GenericEndPoint.png | Bin .../emailReportTask}/images/TaskConfig.png | Bin .../emailReportTask}/images/TaskConfig2.png | Bin .../emailReportTask}/images/icon.png | Bin .../pullRequestInsightsTask/README.md | 0 .../pullRequestInsightsTask/TaskInsights.ts | 0 .../config/EnvironmentConfigurations.ts | 0 .../config/PipelineData.ts | 0 .../dataModels/AbstractPipeline.ts | 0 .../dataModels/AbstractPipelineTaskRun.ts | 0 .../dataModels/Branch.ts | 0 .../dataModels/BranchStatus.ts | 0 .../dataModels/Build.ts | 0 .../dataModels/BuildTaskRun.ts | 0 .../dataModels/ITaskRunReference.ts | 0 .../dataModels/PipelineTask.ts | 0 .../dataModels/PullRequest.ts | 0 .../dataModels/Release.ts | 0 .../dataModels/ReleaseTaskRun.ts | 0 .../dataProviders/AbstractAzureApi.ts | 0 .../dataProviders/BuildAzureApi.ts | 0 .../dataProviders/ReleaseAzureApi.ts | 0 .../exceptions/HostTypeError.ts | 0 .../factories/AzureApiFactory.ts | 0 .../factories/TableFactory.ts | 0 .../pullRequestInsightsTask/index.ts | 0 .../models/AbstractTable.ts | 0 .../models/FailureTable.ts | 0 .../models/LongRunningValidationsTable.ts | 0 .../models/ServiceComment.ts | 0 .../pullRequestInsightsTask/package-lock.json | 0 .../pullRequestInsightsTask/package.json | 0 .../resources/service_comment_properties.json | 0 .../resources/user_messages.json | 0 .../pullRequestInsightsTask/task.dev.json | 0 .../pullRequestInsightsTask/task.json | 0 .../pullRequestInsightsTask/task.prod.json | 0 .../telemetry/TelemetryInformation.ts | 0 .../tests/__e_to_e_tests__/InvokeTest.ts | 0 .../tests/__tests__/AzureApiFactory.ts | 0 .../tests/__tests__/Branch.ts | 0 .../tests/__tests__/Build.ts | 0 .../tests/__tests__/BuildTaskRun.ts | 0 .../__tests__/EnvironmentConfigurations.ts | 0 .../tests/__tests__/FailureTable.ts | 0 .../__tests__/LongRunningValidationTable.ts | 0 .../tests/__tests__/PipelineTask.ts | 0 .../tests/__tests__/PullRequest.ts | 0 .../tests/__tests__/Release.ts | 0 .../tests/__tests__/ReleaseTaskRun.ts | 0 .../pullRequestInsightsTask/tsconfig.json | 0 .../pullRequestInsightsTask/utils/Global.d.ts | 0 .../utils/StringExtensions.ts | 0 .../vss-extension.json | 0 .../images/GenericEndPoint.png | Bin 43334 -> 0 bytes .../emailReportTaskV2/images/TaskConfig.png | Bin 112368 -> 0 bytes .../emailReportTaskV2/images/TaskConfig2.png | Bin 68726 -> 0 bytes .../emailReportTaskV2/images/icon.png | Bin 4223 -> 0 bytes configs/dev.json | 6 + configs/release.json | 6 + package-lock.json | 13079 +++++++++++----- package.json | 29 +- temp.js | 0 webpack.config.js | 33 + 280 files changed, 10001 insertions(+), 4314 deletions(-) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/EmailSender.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/IReportSender.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/README.md (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/ReportManager.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/ConfigurationProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/IConfigurationProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/ReportConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/TaskConstants.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/mail/MailConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/mail/RecipientsConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/mail/SmtpConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/pipeline/PipelineType.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/report/GroupTestResultsBy.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/report/ReportDataConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/report/SendMailCondition.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/config/report/TestResultsConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/exceptions/DataProviderError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/exceptions/InputError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/exceptions/MailError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/exceptions/MissingDataError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/exceptions/PipelineNotFoundError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/exceptions/PostProcessorError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/exceptions/ReportError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/htmlreport/EmailTemplate.xslt (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/htmlreport/HTMLReportCreator.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/index.ts (97%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/BuildReport.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/ChangeModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/IssueModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/JobModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/PhaseModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/ReleaseReport.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/Report.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/ReportFactory.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/TaskModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/helpers/LinkHelper.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/helpers/TestResultsHelper.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/helpers/TimeFormatter.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/testresults/TestResultGroupModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/testresults/TestResultModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTaskV1/package-lock.json rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/package.json (76%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/DataProviderFactory.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/IDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/IDataProviderFactory.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/IPostProcessor.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/IReportProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/ReportProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/SendMailConditionProcessor.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts (100%) rename {Tasks/emailReportTask/emailReportTaskV2 => Extensions/emailReportTask/Tasks/emailReportTaskV1}/providers/helpers/TestResultDetailsParserForPriority.ts (94%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts (100%) rename {Tasks/emailReportTask/emailReportTaskV2 => Extensions/emailReportTask/Tasks/emailReportTaskV1}/providers/restclients/AbstractClient.ts (87%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/BuildClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/ITestResultsClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/IWorkItemClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/ReleaseClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/RetryablePromise.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/restclients/WorkItemClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/task.dev.json (100%) rename Tasks/emailReportTask/emailReportTaskV1/task.prod.json => Extensions/emailReportTask/Tasks/emailReportTaskV1/task.json (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/telemetry/TelemetryLogger.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/tsconfig.json (93%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/utils/DisplayNameHelper.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/utils/EnumUtils.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/utils/EnvironmentExtensions.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/utils/StringUtils.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV1/vss-extension.json (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/EmailSender.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/IReportSender.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/README.md (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/ReportManager.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/ConfigurationProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/IConfigurationProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/ReportConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/TaskConstants.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/mail/MailConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/mail/RecipientsConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/mail/SmtpConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/pipeline/PipelineType.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/report/GroupTestResultsBy.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/report/ReportDataConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/report/SendMailCondition.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/config/report/TestResultsConfiguration.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/exceptions/DataProviderError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/exceptions/InputError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/exceptions/MailError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/exceptions/MissingDataError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/exceptions/PipelineNotFoundError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/exceptions/PostProcessorError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/exceptions/ReportError.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/htmlreport/EmailTemplate.xslt (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/htmlreport/HTMLReportCreator.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/index.ts (97%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/BuildReport.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/ChangeModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/IssueModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/JobModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/PhaseModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/ReleaseReport.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/Report.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/ReportFactory.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/TaskModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/helpers/LinkHelper.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/helpers/TestResultsHelper.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/helpers/TimeFormatter.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/testresults/TestResultGroupModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/testresults/TestResultModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTaskV2/package-lock.json rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/package.json (70%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/DataProviderFactory.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/IDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/IDataProviderFactory.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/IPostProcessor.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/IReportProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/ReportProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/SendMailConditionProcessor.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts (100%) rename {Tasks/emailReportTask/emailReportTaskV1 => Extensions/emailReportTask/Tasks/emailReportTaskV2}/providers/helpers/TestResultDetailsParserForPriority.ts (94%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts (100%) rename {Tasks/emailReportTask/emailReportTaskV1 => Extensions/emailReportTask/Tasks/emailReportTaskV2}/providers/restclients/AbstractClient.ts (87%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/BuildClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/ITestResultsClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/IWorkItemClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/ReleaseClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/RetryablePromise.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/restclients/WorkItemClient.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/task.dev.json (100%) rename Tasks/emailReportTask/emailReportTaskV2/task.prod.json => Extensions/emailReportTask/Tasks/emailReportTaskV2/task.json (98%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/telemetry/TelemetryLogger.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/tsconfig.json (93%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/utils/DisplayNameHelper.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/utils/EnumUtils.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/utils/EnvironmentExtensions.ts (100%) rename {Tasks/emailReportTask => Extensions/emailReportTask/Tasks}/emailReportTaskV2/utils/StringUtils.ts (100%) rename {Tasks/emailReportTask/emailReportTaskV2 => Extensions/emailReportTask}/azure-devops-extensions.json (96%) rename {Tasks/emailReportTask/emailReportTaskV1 => Extensions/emailReportTask}/images/GenericEndPoint.png (100%) rename {Tasks/emailReportTask/emailReportTaskV1 => Extensions/emailReportTask}/images/TaskConfig.png (100%) rename {Tasks/emailReportTask/emailReportTaskV1 => Extensions/emailReportTask}/images/TaskConfig2.png (100%) rename {Tasks/emailReportTask/emailReportTaskV1 => Extensions/emailReportTask}/images/icon.png (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/README.md (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/TaskInsights.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/config/EnvironmentConfigurations.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/config/PipelineData.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/AbstractPipeline.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/AbstractPipelineTaskRun.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/Branch.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/BranchStatus.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/Build.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/BuildTaskRun.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/ITaskRunReference.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/PipelineTask.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/PullRequest.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/Release.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataModels/ReleaseTaskRun.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataProviders/AbstractAzureApi.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataProviders/BuildAzureApi.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/dataProviders/ReleaseAzureApi.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/exceptions/HostTypeError.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/factories/AzureApiFactory.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/factories/TableFactory.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/index.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/models/AbstractTable.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/models/FailureTable.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/models/LongRunningValidationsTable.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/models/ServiceComment.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/package-lock.json (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/package.json (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/resources/service_comment_properties.json (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/resources/user_messages.json (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/task.dev.json (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/task.json (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/task.prod.json (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/telemetry/TelemetryInformation.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__e_to_e_tests__/InvokeTest.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/AzureApiFactory.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/Branch.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/Build.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/BuildTaskRun.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/EnvironmentConfigurations.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/FailureTable.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/LongRunningValidationTable.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/PipelineTask.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/PullRequest.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/Release.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tests/__tests__/ReleaseTaskRun.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/tsconfig.json (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/utils/Global.d.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/utils/StringExtensions.ts (100%) rename {Tasks => Extensions}/pullRequestInsightsTask/vss-extension.json (100%) delete mode 100644 Tasks/emailReportTask/emailReportTaskV2/images/GenericEndPoint.png delete mode 100644 Tasks/emailReportTask/emailReportTaskV2/images/TaskConfig.png delete mode 100644 Tasks/emailReportTask/emailReportTaskV2/images/TaskConfig2.png delete mode 100644 Tasks/emailReportTask/emailReportTaskV2/images/icon.png create mode 100644 configs/dev.json create mode 100644 configs/release.json create mode 100644 temp.js create mode 100644 webpack.config.js diff --git a/Tasks/emailReportTask/emailReportTaskV1/EmailSender.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/EmailSender.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/EmailSender.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/EmailSender.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/IReportSender.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/IReportSender.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/IReportSender.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/IReportSender.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/README.md b/Extensions/emailReportTask/Tasks/emailReportTaskV1/README.md similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/README.md rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/README.md diff --git a/Tasks/emailReportTask/emailReportTaskV1/ReportManager.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/ReportManager.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/ReportManager.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/ReportManager.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/ConfigurationProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/ConfigurationProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/IConfigurationProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/IConfigurationProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/ReportConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/ReportConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/TaskConstants.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/TaskConstants.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/MailConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/MailConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/RecipientsConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/RecipientsConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/SmtpConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/SmtpConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/pipeline/PipelineType.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/pipeline/PipelineType.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/GroupTestResultsBy.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/GroupTestResultsBy.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/ReportDataConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/ReportDataConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/SendMailCondition.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/SendMailCondition.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/TestResultsConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/TestResultsConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/DataProviderError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/DataProviderError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/InputError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/InputError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/MailError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/MailError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/MissingDataError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/MissingDataError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/PipelineNotFoundError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/PipelineNotFoundError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/PostProcessorError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/PostProcessorError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/ReportError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/ReportError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/htmlreport/EmailTemplate.xslt b/Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/EmailTemplate.xslt similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/htmlreport/EmailTemplate.xslt rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/EmailTemplate.xslt diff --git a/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/HTMLReportCreator.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/HTMLReportCreator.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/index.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/index.ts similarity index 97% rename from Tasks/emailReportTask/emailReportTaskV1/index.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/index.ts index 699d0917..c6e7fd7c 100644 --- a/Tasks/emailReportTask/emailReportTaskV1/index.ts +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV1/index.ts @@ -1,4 +1,4 @@ -import tl = require("azure-pipelines-task-lib/task"); +import tl = require("azure-pipelines-task-lib"); import { ReportConfiguration } from "./config/ReportConfiguration"; import { ConfigurationProvider } from "./config/ConfigurationProvider"; import { ReportManager } from "./ReportManager"; diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/BuildReport.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/BuildReport.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ChangeModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ChangeModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/IssueModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/IssueModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/JobModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/JobModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/JobModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/PhaseModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/PhaseModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ReleaseReport.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ReleaseReport.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/Report.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/Report.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/Report.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/Report.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ReportFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ReportFactory.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/TaskModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/TaskModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/LinkHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/LinkHelper.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/TestResultsHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/TestResultsHelper.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/TimeFormatter.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/TimeFormatter.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestResultGroupModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestResultGroupModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestResultModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestResultModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/package-lock.json b/Extensions/emailReportTask/Tasks/emailReportTaskV1/package-lock.json new file mode 100644 index 00000000..5425a65a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV1/package-lock.json @@ -0,0 +1,430 @@ +{ + "name": "azure-devops-emailreporttask", + "version": "1.0.0-preview.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "azure-devops-emailreporttask", + "version": "1.0.0-preview.2", + "license": "ISC", + "dependencies": { + "azure-devops-node-api": "^10.0.0", + "azure-pipelines-task-lib": "^2.8.0", + "nodemailer": "^6.3.0", + "object-to-xml": "^2.0.0", + "performance-now": "^2.1.0", + "reflect-metadata": "^0.1.13", + "xslt-processor": "^0.11.5" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/azure-pipelines-task-lib": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-2.12.2.tgz", + "integrity": "sha512-ofAdVZcL90Qv6zYcKa1vK3Wnrl2kxoKX/Idvb7RWrqHQzcJlAEjCU4UCB5y6NnSKqRSyVTIhdS6hChphpOaiMQ==", + "dependencies": { + "minimatch": "3.0.4", + "mockery": "^1.7.0", + "q": "^1.1.2", + "semver": "^5.1.0", + "shelljs": "^0.3.0", + "sync-request": "3.0.1", + "uuid": "^3.0.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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==" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha512-ODLXH644w9C2fMPAm7bMDQ3GRvipZWZfKc+8As6hIadRIelE0n0xZuN38NS6kiK3KPEVrpymmQD8bvncAHWQkQ==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/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==" + }, + "node_modules/dank-each": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dank-each/-/dank-each-1.0.0.tgz", + "integrity": "sha512-gMDy24y+3LlnAaHq4WFwRKliMZRkGp41Gy9JVsD1BO5tprb/lEh4afJlkankcTqRoppSaHRwgFQX61QjJ5ClfQ==" + }, + "node_modules/dank-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dank-map/-/dank-map-0.1.0.tgz", + "integrity": "sha512-mQoLySkWc5bQM8XKXz0rIuISX/+12rSSfPojYlTVT6KPj3LsvfLURtrv0w+QEt1gRIKwp9mxnwOcL5nsOTkk2Q==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/http-basic": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-2.5.1.tgz", + "integrity": "sha512-q/qOkgjcnZ90v0wSaMwamhfAhIf6lhOsH0ehHFnQHAt1lA9MedSnmqEEnh8bq0njTBAK3IsmS2gEuXryfWCDkw==", + "dependencies": { + "caseless": "~0.11.0", + "concat-stream": "^1.4.6", + "http-response-object": "^1.0.0" + } + }, + "node_modules/http-response-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-1.1.0.tgz", + "integrity": "sha512-adERueQxEMtIfGk4ee/9CG7AGUjS09OyHeKrubTjmHUsEVXesrGlZLWYnCL8fajPZIX9H4NDnXyyzBPrF078sA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "node_modules/nodemailer": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", + "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-to-xml": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-to-xml/-/object-to-xml-2.0.0.tgz", + "integrity": "sha512-bArXy7WCF1V9R88/zF9adSZSeFQnFmmKhMqNuNLAxqrbkvzcWP8HgnaRCcVJsfvIgvpdHiYd0qzJi7LM7QFfcQ==", + "dependencies": { + "dank-each": "^1.0.0", + "dank-map": "~0.1.0", + "sanitizer": "0.1.3" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/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==" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/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==" + }, + "node_modules/sanitizer": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/sanitizer/-/sanitizer-0.1.3.tgz", + "integrity": "sha512-j05vL56tR90rsYqm9ZD05v6K4HI7t4yMDEvvU0x4f+IADXM9Jx1x9mzatxOs5drJq6dGhugxDW99mcPvXVLl+Q==" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==", + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/sync-request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-3.0.1.tgz", + "integrity": "sha512-bnOSypECs6aB9ScWHcJAkS9z55jOhO3tdLefLfJ+J58vC2HCi5tjxmFMxLv0RxvuAFFQ/G4BupVehqpAlbi+3Q==", + "dependencies": { + "concat-stream": "^1.4.7", + "http-response-object": "^1.0.1", + "then-request": "^2.0.1" + } + }, + "node_modules/then-request": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-2.2.0.tgz", + "integrity": "sha512-YM/Fho1bQ3JFX9dgFQsBswc3aSTePXvtNHl3aXJTZNz/444yC86EVJR92aWMRNA0O9X0UfmojyCTUcT8Lbo5yA==", + "dependencies": { + "caseless": "~0.11.0", + "concat-stream": "^1.4.7", + "http-basic": "^2.5.1", + "http-response-object": "^1.1.0", + "promise": "^7.1.1", + "qs": "^6.1.0" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/xslt-processor": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/xslt-processor/-/xslt-processor-0.11.7.tgz", + "integrity": "sha512-66vcLzwSP4dAvzm4O+Lq20Su03ckrGaYn1kbdCNDp9HaaBZgHJJNZlrVSkvfEuKNvqd4wk9XGU5Rvi+eUJqf+w==", + "dependencies": { + "he": "^1.2.0" + } + } + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV1/package.json b/Extensions/emailReportTask/Tasks/emailReportTaskV1/package.json similarity index 76% rename from Tasks/emailReportTask/emailReportTaskV1/package.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/package.json index 6b1b0d46..57869bd5 100644 --- a/Tasks/emailReportTask/emailReportTaskV1/package.json +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV1/package.json @@ -4,8 +4,8 @@ "description": "For Private Use ONLY by Author. Not Supported in any way.", "author": "", "license": "ISC", - "main": "../../dist/emailReportExtension/emailReportTask/index.js", - "types": "../../dist/emailReportExtension/emailReportTask/index.d.ts", + "main": "./index.js", + "types": "./index.d.ts", "dependencies": { "azure-devops-node-api": "^10.0.0", "azure-pipelines-task-lib": "^2.8.0", diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/DataProviderFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/DataProviderFactory.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IDataProviderFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IDataProviderFactory.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IPostProcessor.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IPostProcessor.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IReportProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IReportProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/ReportProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/ReportProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/SendMailConditionProcessor.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/SendMailConditionProcessor.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts similarity index 94% rename from Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts index 10266b97..08e375c5 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts @@ -37,7 +37,7 @@ export class TestResultDetailsParserForPriority extends AbstractTestResultsDetai private getPriority(groupByValue: any): number { let priority: number = Number.parseInt(groupByValue as string); - if (priority == null || priority == NaN) { + if (priority == null || Number.isNaN(priority)) { throw new InvalidTestResultDataError(`Expected priority value to be integer in ${groupByValue}`); } return priority; @@ -55,7 +55,7 @@ export class TestResultDetailsParserForPriority extends AbstractTestResultsDetai } const testRunId = Number.parseInt(result.testRun.id); - if (testRunId == null || testRunId == NaN) { + if (testRunId == null || Number.isNaN(testRunId)) { throw new InvalidTestResultDataError(`Unable to parse test run id to integer in ${result.testRun.id}`); } diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractClient.ts similarity index 87% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractClient.ts index 90e7b9ce..2da7936e 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractClient.ts @@ -1,8 +1,8 @@ -import tl = require("azure-pipelines-task-lib/task"); +import tl = require("azure-pipelines-task-lib"); import { WebApi, getPersonalAccessTokenHandler -} from "azure-devops-node-api/WebApi"; +} from "azure-devops-node-api"; import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; export abstract class AbstractClient { diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/BuildClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/BuildClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ITestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ITestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/IWorkItemClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/IWorkItemClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ReleaseClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ReleaseClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/RetryablePromise.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/RetryablePromise.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/WorkItemClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/WorkItemClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/task.dev.json b/Extensions/emailReportTask/Tasks/emailReportTaskV1/task.dev.json similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/task.dev.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/task.dev.json diff --git a/Tasks/emailReportTask/emailReportTaskV1/task.prod.json b/Extensions/emailReportTask/Tasks/emailReportTaskV1/task.json similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/task.prod.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/task.json diff --git a/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/telemetry/TelemetryLogger.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/telemetry/TelemetryLogger.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/tsconfig.json b/Extensions/emailReportTask/Tasks/emailReportTaskV1/tsconfig.json similarity index 93% rename from Tasks/emailReportTask/emailReportTaskV1/tsconfig.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/tsconfig.json index ea293a6e..f4659304 100644 --- a/Tasks/emailReportTask/emailReportTaskV1/tsconfig.json +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV1/tsconfig.json @@ -13,6 +13,6 @@ "moduleResolution": "node", "resolveJsonModule": true, "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - "outDir": "../../dist/emailReportExtension/emailReportTask" + "outDir": "../../../dist/Tasks/emailReportTask/emailReportTaskV1" } } \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/DisplayNameHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/DisplayNameHelper.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/EnumUtils.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/EnumUtils.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/EnvironmentExtensions.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/EnvironmentExtensions.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/StringUtils.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/StringUtils.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/vss-extension.json b/Extensions/emailReportTask/Tasks/emailReportTaskV1/vss-extension.json similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/vss-extension.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV1/vss-extension.json diff --git a/Tasks/emailReportTask/emailReportTaskV2/EmailSender.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/EmailSender.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/EmailSender.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/EmailSender.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/IReportSender.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/IReportSender.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/IReportSender.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/IReportSender.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/README.md b/Extensions/emailReportTask/Tasks/emailReportTaskV2/README.md similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/README.md rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/README.md diff --git a/Tasks/emailReportTask/emailReportTaskV2/ReportManager.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/ReportManager.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/ReportManager.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/ReportManager.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/ConfigurationProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/ConfigurationProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/IConfigurationProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/IConfigurationProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/ReportConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/ReportConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/TaskConstants.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/TaskConstants.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/MailConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/MailConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/RecipientsConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/RecipientsConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/SmtpConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/SmtpConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/pipeline/PipelineType.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/pipeline/PipelineType.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/GroupTestResultsBy.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/GroupTestResultsBy.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/ReportDataConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/ReportDataConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/SendMailCondition.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/SendMailCondition.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/TestResultsConfiguration.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/TestResultsConfiguration.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/DataProviderError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/DataProviderError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/InputError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/InputError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/MailError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/MailError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/MissingDataError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/MissingDataError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/PipelineNotFoundError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/PipelineNotFoundError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/PostProcessorError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/PostProcessorError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/ReportError.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/ReportError.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/htmlreport/EmailTemplate.xslt b/Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/EmailTemplate.xslt similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/htmlreport/EmailTemplate.xslt rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/EmailTemplate.xslt diff --git a/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/HTMLReportCreator.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/HTMLReportCreator.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/index.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/index.ts similarity index 97% rename from Tasks/emailReportTask/emailReportTaskV2/index.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/index.ts index 699d0917..c6e7fd7c 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/index.ts +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV2/index.ts @@ -1,4 +1,4 @@ -import tl = require("azure-pipelines-task-lib/task"); +import tl = require("azure-pipelines-task-lib"); import { ReportConfiguration } from "./config/ReportConfiguration"; import { ConfigurationProvider } from "./config/ConfigurationProvider"; import { ReportManager } from "./ReportManager"; diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/BuildReport.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/BuildReport.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ChangeModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ChangeModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/IssueModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/IssueModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/JobModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/JobModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/JobModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/PhaseModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/PhaseModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ReleaseReport.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ReleaseReport.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/Report.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/Report.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/Report.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/Report.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ReportFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ReportFactory.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/TaskModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/TaskModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/LinkHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/LinkHelper.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/TestResultsHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/TestResultsHelper.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/TimeFormatter.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/TimeFormatter.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestResultGroupModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestResultGroupModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestResultModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestResultModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/package-lock.json b/Extensions/emailReportTask/Tasks/emailReportTaskV2/package-lock.json new file mode 100644 index 00000000..ec6eca36 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV2/package-lock.json @@ -0,0 +1,688 @@ +{ + "name": "azure-devops-emailreporttask", + "version": "1.0.0-preview.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "azure-devops-emailreporttask", + "version": "1.0.0-preview.2", + "license": "ISC", + "dependencies": { + "azure-devops-node-api": "^10.0.0", + "azure-pipelines-task-lib": "^4.1.0", + "nodemailer": "^6.3.0", + "object-to-xml": "^2.0.0", + "performance-now": "^2.1.0", + "reflect-metadata": "^0.1.13", + "xslt-processor": "^0.11.5" + } + }, + "node_modules/@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==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@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==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/@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==" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/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==", + "dependencies": { + "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" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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==" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/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==" + }, + "node_modules/dank-each": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dank-each/-/dank-each-1.0.0.tgz", + "integrity": "sha512-gMDy24y+3LlnAaHq4WFwRKliMZRkGp41Gy9JVsD1BO5tprb/lEh4afJlkankcTqRoppSaHRwgFQX61QjJ5ClfQ==" + }, + "node_modules/dank-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dank-map/-/dank-map-0.1.0.tgz", + "integrity": "sha512-mQoLySkWc5bQM8XKXz0rIuISX/+12rSSfPojYlTVT6KPj3LsvfLURtrv0w+QEt1gRIKwp9mxnwOcL5nsOTkk2Q==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/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==", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "node_modules/nodemailer": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", + "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-to-xml": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-to-xml/-/object-to-xml-2.0.0.tgz", + "integrity": "sha512-bArXy7WCF1V9R88/zF9adSZSeFQnFmmKhMqNuNLAxqrbkvzcWP8HgnaRCcVJsfvIgvpdHiYd0qzJi7LM7QFfcQ==", + "dependencies": { + "dank-each": "^1.0.0", + "dank-map": "~0.1.0", + "sanitizer": "0.1.3" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/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==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/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==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==" + }, + "node_modules/sanitizer": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/sanitizer/-/sanitizer-0.1.3.tgz", + "integrity": "sha512-j05vL56tR90rsYqm9ZD05v6K4HI7t4yMDEvvU0x4f+IADXM9Jx1x9mzatxOs5drJq6dGhugxDW99mcPvXVLl+Q==" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/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==", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xslt-processor": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/xslt-processor/-/xslt-processor-0.11.7.tgz", + "integrity": "sha512-66vcLzwSP4dAvzm4O+Lq20Su03ckrGaYn1kbdCNDp9HaaBZgHJJNZlrVSkvfEuKNvqd4wk9XGU5Rvi+eUJqf+w==", + "dependencies": { + "he": "^1.2.0" + } + } + } +} diff --git a/Tasks/emailReportTask/emailReportTaskV2/package.json b/Extensions/emailReportTask/Tasks/emailReportTaskV2/package.json similarity index 70% rename from Tasks/emailReportTask/emailReportTaskV2/package.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/package.json index f6473fd4..303b2087 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/package.json +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV2/package.json @@ -4,12 +4,12 @@ "description": "For Private Use ONLY by Author. Not Supported in any way.", "author": "", "license": "ISC", - "main": "../../dist/emailReportExtension/emailReportTask/index.js", - "types": "../../dist/emailReportExtension/emailReportTask/index.d.ts", + "main": "./index.js", + "types": "./index.d.ts", "minimumAgentVersion": "2.144.0", "dependencies": { "azure-devops-node-api": "^10.0.0", - "azure-pipelines-task-lib": "^^4.1.0", + "azure-pipelines-task-lib": "^4.1.0", "nodemailer": "^6.3.0", "object-to-xml": "^2.0.0", "performance-now": "^2.1.0", diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/DataProviderFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/DataProviderFactory.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IDataProviderFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IDataProviderFactory.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IPostProcessor.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IPostProcessor.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IReportProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IReportProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/ReportProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/ReportProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/SendMailConditionProcessor.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/SendMailConditionProcessor.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts similarity index 94% rename from Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts index 10266b97..08e375c5 100644 --- a/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts @@ -37,7 +37,7 @@ export class TestResultDetailsParserForPriority extends AbstractTestResultsDetai private getPriority(groupByValue: any): number { let priority: number = Number.parseInt(groupByValue as string); - if (priority == null || priority == NaN) { + if (priority == null || Number.isNaN(priority)) { throw new InvalidTestResultDataError(`Expected priority value to be integer in ${groupByValue}`); } return priority; @@ -55,7 +55,7 @@ export class TestResultDetailsParserForPriority extends AbstractTestResultsDetai } const testRunId = Number.parseInt(result.testRun.id); - if (testRunId == null || testRunId == NaN) { + if (testRunId == null || Number.isNaN(testRunId)) { throw new InvalidTestResultDataError(`Unable to parse test run id to integer in ${result.testRun.id}`); } diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractClient.ts similarity index 87% rename from Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractClient.ts index 90e7b9ce..2da7936e 100644 --- a/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.ts +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractClient.ts @@ -1,8 +1,8 @@ -import tl = require("azure-pipelines-task-lib/task"); +import tl = require("azure-pipelines-task-lib"); import { WebApi, getPersonalAccessTokenHandler -} from "azure-devops-node-api/WebApi"; +} from "azure-devops-node-api"; import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; export abstract class AbstractClient { diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/BuildClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/BuildClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ITestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ITestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/IWorkItemClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/IWorkItemClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ReleaseClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ReleaseClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/RetryablePromise.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/RetryablePromise.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/WorkItemClient.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/WorkItemClient.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/task.dev.json b/Extensions/emailReportTask/Tasks/emailReportTaskV2/task.dev.json similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/task.dev.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/task.dev.json diff --git a/Tasks/emailReportTask/emailReportTaskV2/task.prod.json b/Extensions/emailReportTask/Tasks/emailReportTaskV2/task.json similarity index 98% rename from Tasks/emailReportTask/emailReportTaskV2/task.prod.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/task.json index 6469e0e7..99237996 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/task.prod.json +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV2/task.json @@ -1,6 +1,6 @@ { "id": "36fd41b1-8024-4ce9-a5a0-53c3e54ed105", - "name": "EmailReportV2", + "name": "EmailReport", "friendlyName": "Email Report", "description": "Send rich email report for test results and for tasks in this stage", "helpMarkDown": "Sets 'EmailReportTask.EmailSent' variable to true if it sent email successfully. [Learn More](https://marketplace.visualstudio.com/items?itemName=epsteam.EmailReportExtension)", @@ -11,9 +11,9 @@ ], "author": "Microsoft Corporation", "version": { - "Major": 1, - "Minor": 1, - "Patch": 8 + "Major": 2, + "Minor": 0, + "Patch": 0 }, "groups": [ { diff --git a/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/telemetry/TelemetryLogger.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/telemetry/TelemetryLogger.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/tsconfig.json b/Extensions/emailReportTask/Tasks/emailReportTaskV2/tsconfig.json similarity index 93% rename from Tasks/emailReportTask/emailReportTaskV2/tsconfig.json rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/tsconfig.json index ea293a6e..a164d1e0 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/tsconfig.json +++ b/Extensions/emailReportTask/Tasks/emailReportTaskV2/tsconfig.json @@ -13,6 +13,6 @@ "moduleResolution": "node", "resolveJsonModule": true, "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - "outDir": "../../dist/emailReportExtension/emailReportTask" + "outDir": "../../../dist/Tasks/emailReportTask/emailReportTaskV2" } } \ No newline at end of file diff --git a/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/DisplayNameHelper.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/DisplayNameHelper.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/EnumUtils.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/EnumUtils.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/EnvironmentExtensions.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/EnvironmentExtensions.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.ts b/Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/StringUtils.ts similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.ts rename to Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/StringUtils.ts diff --git a/Tasks/emailReportTask/emailReportTaskV2/azure-devops-extensions.json b/Extensions/emailReportTask/azure-devops-extensions.json similarity index 96% rename from Tasks/emailReportTask/emailReportTaskV2/azure-devops-extensions.json rename to Extensions/emailReportTask/azure-devops-extensions.json index 3f83bbdb..4ccce5fc 100644 --- a/Tasks/emailReportTask/emailReportTaskV2/azure-devops-extensions.json +++ b/Extensions/emailReportTask/azure-devops-extensions.json @@ -21,7 +21,7 @@ "scopes": [], "files": [ { - "path": "emailReportTask" + "path": "Tasks/emailReportTask" }, { "path": "images", diff --git a/Tasks/emailReportTask/emailReportTaskV1/images/GenericEndPoint.png b/Extensions/emailReportTask/images/GenericEndPoint.png similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/images/GenericEndPoint.png rename to Extensions/emailReportTask/images/GenericEndPoint.png diff --git a/Tasks/emailReportTask/emailReportTaskV1/images/TaskConfig.png b/Extensions/emailReportTask/images/TaskConfig.png similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/images/TaskConfig.png rename to Extensions/emailReportTask/images/TaskConfig.png diff --git a/Tasks/emailReportTask/emailReportTaskV1/images/TaskConfig2.png b/Extensions/emailReportTask/images/TaskConfig2.png similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/images/TaskConfig2.png rename to Extensions/emailReportTask/images/TaskConfig2.png diff --git a/Tasks/emailReportTask/emailReportTaskV1/images/icon.png b/Extensions/emailReportTask/images/icon.png similarity index 100% rename from Tasks/emailReportTask/emailReportTaskV1/images/icon.png rename to Extensions/emailReportTask/images/icon.png diff --git a/Tasks/pullRequestInsightsTask/README.md b/Extensions/pullRequestInsightsTask/README.md similarity index 100% rename from Tasks/pullRequestInsightsTask/README.md rename to Extensions/pullRequestInsightsTask/README.md diff --git a/Tasks/pullRequestInsightsTask/TaskInsights.ts b/Extensions/pullRequestInsightsTask/TaskInsights.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/TaskInsights.ts rename to Extensions/pullRequestInsightsTask/TaskInsights.ts diff --git a/Tasks/pullRequestInsightsTask/config/EnvironmentConfigurations.ts b/Extensions/pullRequestInsightsTask/config/EnvironmentConfigurations.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/config/EnvironmentConfigurations.ts rename to Extensions/pullRequestInsightsTask/config/EnvironmentConfigurations.ts diff --git a/Tasks/pullRequestInsightsTask/config/PipelineData.ts b/Extensions/pullRequestInsightsTask/config/PipelineData.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/config/PipelineData.ts rename to Extensions/pullRequestInsightsTask/config/PipelineData.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/AbstractPipeline.ts b/Extensions/pullRequestInsightsTask/dataModels/AbstractPipeline.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/AbstractPipeline.ts rename to Extensions/pullRequestInsightsTask/dataModels/AbstractPipeline.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/AbstractPipelineTaskRun.ts b/Extensions/pullRequestInsightsTask/dataModels/AbstractPipelineTaskRun.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/AbstractPipelineTaskRun.ts rename to Extensions/pullRequestInsightsTask/dataModels/AbstractPipelineTaskRun.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/Branch.ts b/Extensions/pullRequestInsightsTask/dataModels/Branch.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/Branch.ts rename to Extensions/pullRequestInsightsTask/dataModels/Branch.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/BranchStatus.ts b/Extensions/pullRequestInsightsTask/dataModels/BranchStatus.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/BranchStatus.ts rename to Extensions/pullRequestInsightsTask/dataModels/BranchStatus.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/Build.ts b/Extensions/pullRequestInsightsTask/dataModels/Build.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/Build.ts rename to Extensions/pullRequestInsightsTask/dataModels/Build.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/BuildTaskRun.ts b/Extensions/pullRequestInsightsTask/dataModels/BuildTaskRun.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/BuildTaskRun.ts rename to Extensions/pullRequestInsightsTask/dataModels/BuildTaskRun.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/ITaskRunReference.ts b/Extensions/pullRequestInsightsTask/dataModels/ITaskRunReference.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/ITaskRunReference.ts rename to Extensions/pullRequestInsightsTask/dataModels/ITaskRunReference.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/PipelineTask.ts b/Extensions/pullRequestInsightsTask/dataModels/PipelineTask.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/PipelineTask.ts rename to Extensions/pullRequestInsightsTask/dataModels/PipelineTask.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/PullRequest.ts b/Extensions/pullRequestInsightsTask/dataModels/PullRequest.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/PullRequest.ts rename to Extensions/pullRequestInsightsTask/dataModels/PullRequest.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/Release.ts b/Extensions/pullRequestInsightsTask/dataModels/Release.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/Release.ts rename to Extensions/pullRequestInsightsTask/dataModels/Release.ts diff --git a/Tasks/pullRequestInsightsTask/dataModels/ReleaseTaskRun.ts b/Extensions/pullRequestInsightsTask/dataModels/ReleaseTaskRun.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataModels/ReleaseTaskRun.ts rename to Extensions/pullRequestInsightsTask/dataModels/ReleaseTaskRun.ts diff --git a/Tasks/pullRequestInsightsTask/dataProviders/AbstractAzureApi.ts b/Extensions/pullRequestInsightsTask/dataProviders/AbstractAzureApi.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataProviders/AbstractAzureApi.ts rename to Extensions/pullRequestInsightsTask/dataProviders/AbstractAzureApi.ts diff --git a/Tasks/pullRequestInsightsTask/dataProviders/BuildAzureApi.ts b/Extensions/pullRequestInsightsTask/dataProviders/BuildAzureApi.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataProviders/BuildAzureApi.ts rename to Extensions/pullRequestInsightsTask/dataProviders/BuildAzureApi.ts diff --git a/Tasks/pullRequestInsightsTask/dataProviders/ReleaseAzureApi.ts b/Extensions/pullRequestInsightsTask/dataProviders/ReleaseAzureApi.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/dataProviders/ReleaseAzureApi.ts rename to Extensions/pullRequestInsightsTask/dataProviders/ReleaseAzureApi.ts diff --git a/Tasks/pullRequestInsightsTask/exceptions/HostTypeError.ts b/Extensions/pullRequestInsightsTask/exceptions/HostTypeError.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/exceptions/HostTypeError.ts rename to Extensions/pullRequestInsightsTask/exceptions/HostTypeError.ts diff --git a/Tasks/pullRequestInsightsTask/factories/AzureApiFactory.ts b/Extensions/pullRequestInsightsTask/factories/AzureApiFactory.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/factories/AzureApiFactory.ts rename to Extensions/pullRequestInsightsTask/factories/AzureApiFactory.ts diff --git a/Tasks/pullRequestInsightsTask/factories/TableFactory.ts b/Extensions/pullRequestInsightsTask/factories/TableFactory.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/factories/TableFactory.ts rename to Extensions/pullRequestInsightsTask/factories/TableFactory.ts diff --git a/Tasks/pullRequestInsightsTask/index.ts b/Extensions/pullRequestInsightsTask/index.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/index.ts rename to Extensions/pullRequestInsightsTask/index.ts diff --git a/Tasks/pullRequestInsightsTask/models/AbstractTable.ts b/Extensions/pullRequestInsightsTask/models/AbstractTable.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/models/AbstractTable.ts rename to Extensions/pullRequestInsightsTask/models/AbstractTable.ts diff --git a/Tasks/pullRequestInsightsTask/models/FailureTable.ts b/Extensions/pullRequestInsightsTask/models/FailureTable.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/models/FailureTable.ts rename to Extensions/pullRequestInsightsTask/models/FailureTable.ts diff --git a/Tasks/pullRequestInsightsTask/models/LongRunningValidationsTable.ts b/Extensions/pullRequestInsightsTask/models/LongRunningValidationsTable.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/models/LongRunningValidationsTable.ts rename to Extensions/pullRequestInsightsTask/models/LongRunningValidationsTable.ts diff --git a/Tasks/pullRequestInsightsTask/models/ServiceComment.ts b/Extensions/pullRequestInsightsTask/models/ServiceComment.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/models/ServiceComment.ts rename to Extensions/pullRequestInsightsTask/models/ServiceComment.ts diff --git a/Tasks/pullRequestInsightsTask/package-lock.json b/Extensions/pullRequestInsightsTask/package-lock.json similarity index 100% rename from Tasks/pullRequestInsightsTask/package-lock.json rename to Extensions/pullRequestInsightsTask/package-lock.json diff --git a/Tasks/pullRequestInsightsTask/package.json b/Extensions/pullRequestInsightsTask/package.json similarity index 100% rename from Tasks/pullRequestInsightsTask/package.json rename to Extensions/pullRequestInsightsTask/package.json diff --git a/Tasks/pullRequestInsightsTask/resources/service_comment_properties.json b/Extensions/pullRequestInsightsTask/resources/service_comment_properties.json similarity index 100% rename from Tasks/pullRequestInsightsTask/resources/service_comment_properties.json rename to Extensions/pullRequestInsightsTask/resources/service_comment_properties.json diff --git a/Tasks/pullRequestInsightsTask/resources/user_messages.json b/Extensions/pullRequestInsightsTask/resources/user_messages.json similarity index 100% rename from Tasks/pullRequestInsightsTask/resources/user_messages.json rename to Extensions/pullRequestInsightsTask/resources/user_messages.json diff --git a/Tasks/pullRequestInsightsTask/task.dev.json b/Extensions/pullRequestInsightsTask/task.dev.json similarity index 100% rename from Tasks/pullRequestInsightsTask/task.dev.json rename to Extensions/pullRequestInsightsTask/task.dev.json diff --git a/Tasks/pullRequestInsightsTask/task.json b/Extensions/pullRequestInsightsTask/task.json similarity index 100% rename from Tasks/pullRequestInsightsTask/task.json rename to Extensions/pullRequestInsightsTask/task.json diff --git a/Tasks/pullRequestInsightsTask/task.prod.json b/Extensions/pullRequestInsightsTask/task.prod.json similarity index 100% rename from Tasks/pullRequestInsightsTask/task.prod.json rename to Extensions/pullRequestInsightsTask/task.prod.json diff --git a/Tasks/pullRequestInsightsTask/telemetry/TelemetryInformation.ts b/Extensions/pullRequestInsightsTask/telemetry/TelemetryInformation.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/telemetry/TelemetryInformation.ts rename to Extensions/pullRequestInsightsTask/telemetry/TelemetryInformation.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__e_to_e_tests__/InvokeTest.ts b/Extensions/pullRequestInsightsTask/tests/__e_to_e_tests__/InvokeTest.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__e_to_e_tests__/InvokeTest.ts rename to Extensions/pullRequestInsightsTask/tests/__e_to_e_tests__/InvokeTest.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/AzureApiFactory.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/AzureApiFactory.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/AzureApiFactory.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/AzureApiFactory.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/Branch.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/Branch.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/Branch.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/Branch.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/Build.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/Build.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/Build.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/Build.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/BuildTaskRun.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/BuildTaskRun.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/BuildTaskRun.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/BuildTaskRun.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/EnvironmentConfigurations.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/EnvironmentConfigurations.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/EnvironmentConfigurations.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/EnvironmentConfigurations.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/FailureTable.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/FailureTable.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/FailureTable.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/FailureTable.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/LongRunningValidationTable.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/LongRunningValidationTable.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/LongRunningValidationTable.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/LongRunningValidationTable.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/PipelineTask.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/PipelineTask.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/PipelineTask.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/PipelineTask.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/PullRequest.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/PullRequest.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/PullRequest.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/PullRequest.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/Release.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/Release.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/Release.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/Release.ts diff --git a/Tasks/pullRequestInsightsTask/tests/__tests__/ReleaseTaskRun.ts b/Extensions/pullRequestInsightsTask/tests/__tests__/ReleaseTaskRun.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/tests/__tests__/ReleaseTaskRun.ts rename to Extensions/pullRequestInsightsTask/tests/__tests__/ReleaseTaskRun.ts diff --git a/Tasks/pullRequestInsightsTask/tsconfig.json b/Extensions/pullRequestInsightsTask/tsconfig.json similarity index 100% rename from Tasks/pullRequestInsightsTask/tsconfig.json rename to Extensions/pullRequestInsightsTask/tsconfig.json diff --git a/Tasks/pullRequestInsightsTask/utils/Global.d.ts b/Extensions/pullRequestInsightsTask/utils/Global.d.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/utils/Global.d.ts rename to Extensions/pullRequestInsightsTask/utils/Global.d.ts diff --git a/Tasks/pullRequestInsightsTask/utils/StringExtensions.ts b/Extensions/pullRequestInsightsTask/utils/StringExtensions.ts similarity index 100% rename from Tasks/pullRequestInsightsTask/utils/StringExtensions.ts rename to Extensions/pullRequestInsightsTask/utils/StringExtensions.ts diff --git a/Tasks/pullRequestInsightsTask/vss-extension.json b/Extensions/pullRequestInsightsTask/vss-extension.json similarity index 100% rename from Tasks/pullRequestInsightsTask/vss-extension.json rename to Extensions/pullRequestInsightsTask/vss-extension.json diff --git a/Tasks/emailReportTask/emailReportTaskV2/images/GenericEndPoint.png b/Tasks/emailReportTask/emailReportTaskV2/images/GenericEndPoint.png deleted file mode 100644 index 4baa05e31687e68e8000f6fae654f237e494e3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43334 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
ECk|`NH~EZ1F#*fb+8sjO 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 Ggx>);mBsh~ diff --git a/Tasks/emailReportTask/emailReportTaskV2/images/TaskConfig.png b/Tasks/emailReportTask/emailReportTaskV2/images/TaskConfig.png deleted file mode 100644 index c26d1bbc742978d43ec3e46a5aafa7e6bece8bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112368 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

dkU!LL#f7eW6%Tne(F46BfVI5|U6r(i> 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 PzYZ)BiJ0bzsy06?LwrG~uLsDGK9>{@my*biJQ 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.0.2", + "jest": "^24.8.0", + "rimraf": "^2.6.3", + "sinon": "^7.3.2", + "source-map-loader": "^0.2.3", + "tfx-cli": "^0.16.0", + "ts-jest": "^24.0.2", + "ts-loader": "^6.0.4", + "typescript": "^3.5.3", + "webpack": "^4.46.0", + "webpack-cli": "^4.9.2" + }, + "optionalDependencies": { + "fsevents": "*" + } + }, + "node_modules/@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.0.0" } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.5.5", "@babel/generator": "^7.5.5", "@babel/helpers": "^7.5.5", @@ -34,140 +74,155 @@ "semver": "^5.4.1", "source-map": "^0.5.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "ms": "^2.1.1" } }, - "@babel/generator": { + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.5.5", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, - "@babel/helper-function-name": { + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-function-name": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-get-function-arity": "^7.0.0", "@babel/template": "^7.1.0", "@babel/types": "^7.0.0" } }, - "@babel/helper-get-function-arity": { + "node_modules/@babel/helper-get-function-arity": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.0.0" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", "dev": true }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.4.4" } }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.4.4", "@babel/traverse": "^7.5.5", "@babel/types": "^7.5.5" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", - "dev": true + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.4.4", "@babel/types": "^7.4.4" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.5.5", "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", @@ -177,63 +232,95 @@ "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ms": "^2.1.1" } }, - "@babel/types": { + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, - "requires": { + "dependencies": { "esutils": "^2.0.2", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, - "@cnakazawa/watch": { + "node_modules/@cnakazawa/watch": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", "dev": true, - "requires": { + "dependencies": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" } }, - "@jest/console": { + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@jest/console": { "version": "24.7.1", "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", "dev": true, - "requires": { + "dependencies": { "@jest/source-map": "^24.3.0", "chalk": "^2.0.1", "slash": "^2.0.0" + }, + "engines": { + "node": ">= 6" } }, - "@jest/core": { + "node_modules/@jest/core": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^24.7.1", "@jest/reporters": "^24.8.0", "@jest/test-result": "^24.8.0", @@ -261,37 +348,46 @@ "realpath-native": "^1.1.0", "rimraf": "^2.5.4", "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">= 6" } }, - "@jest/environment": { + "node_modules/@jest/environment": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", "dev": true, - "requires": { + "dependencies": { "@jest/fake-timers": "^24.8.0", "@jest/transform": "^24.8.0", "@jest/types": "^24.8.0", "jest-mock": "^24.8.0" + }, + "engines": { + "node": ">= 6" } }, - "@jest/fake-timers": { + "node_modules/@jest/fake-timers": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.8.0", "jest-message-util": "^24.8.0", "jest-mock": "^24.8.0" + }, + "engines": { + "node": ">= 6" } }, - "@jest/reporters": { + "node_modules/@jest/reporters": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^24.8.0", "@jest/test-result": "^24.8.0", "@jest/transform": "^24.8.0", @@ -313,48 +409,60 @@ "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" + }, + "engines": { + "node": ">= 6" } }, - "@jest/source-map": { + "node_modules/@jest/source-map": { "version": "24.3.0", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.1.15", "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 6" } }, - "@jest/test-result": { + "node_modules/@jest/test-result": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^24.7.1", "@jest/types": "^24.8.0", "@types/istanbul-lib-coverage": "^2.0.0" + }, + "engines": { + "node": ">= 6" } }, - "@jest/test-sequencer": { + "node_modules/@jest/test-sequencer": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^24.8.0", "jest-haste-map": "^24.8.0", "jest-runner": "^24.8.0", "jest-runtime": "^24.8.0" + }, + "engines": { + "node": ">= 6" } }, - "@jest/transform": { + "node_modules/@jest/transform": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^24.8.0", "babel-plugin-istanbul": "^5.1.0", @@ -370,61 +478,186 @@ "slash": "^2.0.0", "source-map": "^0.6.1", "write-file-atomic": "2.4.1" + }, + "engines": { + "node": ">= 6" } }, - "@jest/types": { + "node_modules/@jest/types": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", "@types/yargs": "^12.0.9" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "@sinonjs/commons": { + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sinonjs/commons": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", "dev": true, - "requires": { + "dependencies": { "type-detect": "4.0.8" } }, - "@sinonjs/formatio": { + "node_modules/@sinonjs/formatio": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1", "@sinonjs/samsam": "^3.1.0" } }, - "@sinonjs/samsam": { + "node_modules/@sinonjs/samsam": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.2.tgz", "integrity": "sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.0.2", "array-from": "^2.1.1", "lodash": "^4.17.11" } }, - "@sinonjs/text-encoding": { + "node_modules/@sinonjs/text-encoding": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "@types/babel__core": { + "node_modules/@types/babel__core": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", "@types/babel__generator": "*", @@ -432,378 +665,810 @@ "@types/babel__traverse": "*" } }, - "@types/babel__generator": { + "node_modules/@types/babel__generator": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.0.0" } }, - "@types/babel__template": { + "node_modules/@types/babel__template": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, - "@types/babel__traverse": { + "node_modules/@types/babel__traverse": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.3.0" } }, - "@types/istanbul-lib-coverage": { + "node_modules/@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==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@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==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", "dev": true }, - "@types/istanbul-lib-report": { + "node_modules/@types/istanbul-lib-report": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "*" } }, - "@types/istanbul-reports": { + "node_modules/@types/istanbul-reports": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, - "@types/jest": { + "node_modules/@types/jest": { "version": "24.0.17", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.17.tgz", "integrity": "sha512-1cy3xkOAfSYn78dsBWy4M3h/QF/HeWPchNFDjysVtp3GHeTdSmtluNnELfCmfNRRHo0OWEcpf+NsEJQvwQfdqQ==", "dev": true, - "requires": { + "dependencies": { "@types/jest-diff": "*" } }, - "@types/jest-diff": { + "node_modules/@types/jest-diff": { "version": "20.0.1", "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", "dev": true }, - "@types/node": { - "version": "12.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.1.tgz", - "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==", + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, - "@types/q": { + "node_modules/@types/node": { + "version": "16.18.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.46.tgz", + "integrity": "sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg==" + }, + "node_modules/@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, - "@types/sinon": { + "node_modules/@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==" + }, + "node_modules/@types/sinon": { "version": "7.0.13", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.13.tgz", "integrity": "sha512-d7c/C/+H/knZ3L8/cxhicHUiTDxdgap0b/aNJfsmLwFu/iOP17mdgbQsbHA3SJmrzsjD0l3UEE5SN4xxuz5ung==" }, - "@types/stack-utils": { + "node_modules/@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, - "@types/stats-lite": { + "node_modules/@types/stats-lite": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@types/stats-lite/-/stats-lite-2.2.0.tgz", "integrity": "sha512-YV6SS4QC+pbzqjMIV8qVSTDOOazgKBLTVaN+7PfuxELjz/eyzc20KwDVGPrbHt2OcYMA7K2ezLB45Cp6DpNOSQ==" }, - "@types/string-template": { + "node_modules/@types/string-template": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/string-template/-/string-template-1.0.2.tgz", "integrity": "sha1-NjsnPJtFZwXjER41cekkj2R066Q=" }, - "@types/yargs": { + "node_modules/@types/yargs": { "version": "12.0.12", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", "dev": true }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", "dev": true }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", "dev": true }, - "acorn-globals": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", - "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } + "@webassemblyjs/wast-printer": "1.9.0" } }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", "dev": true }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "dependencies": { + "@webassemblyjs/ast": "1.9.0" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", "dev": true }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, - "requires": { - "color-convert": "^1.9.0" + "dependencies": { + "@xtuc/ieee754": "^1.2.0" } }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "dependencies": { + "@xtuc/long": "4.2.2" } }, - "app-root-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-1.0.0.tgz", - "integrity": "sha1-LHKZF0vGHLhv46SnmOAeSTt9U30=", + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, - "arch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", - "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", - "dev": true + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } }, - "archiver": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.0.3.tgz", - "integrity": "sha1-tDYLtYSvFDeZGUJxbyHXxSPR270=", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, - "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", - "walkdir": "^0.0.11", - "zip-stream": "^1.2.0" + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, - "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" + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } }, - "array-equal": { + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", + "dev": true, + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/app-root-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-1.0.0.tgz", + "integrity": "sha1-LHKZF0vGHLhv46SnmOAeSTt9U30=", + "dev": true + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "dev": true + }, + "node_modules/archiver": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.0.3.tgz", + "integrity": "sha1-tDYLtYSvFDeZGUJxbyHXxSPR270=", + "dev": true, + "dependencies": { + "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", + "walkdir": "^0.0.11", + "zip-stream": "^1.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "array-find-index": { + "node_modules/array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "array-from": { + "node_modules/array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "array-unique": { + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "arrify": { + "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "asn1": { + "node_modules/asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, - "requires": { + "dependencies": { "safer-buffer": "~2.1.0" } }, - "assert-plus": { + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", "dev": true }, - "assign-symbols": { + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "astral-regex": { + "node_modules/astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, - "requires": { + "dependencies": { "lodash": "^4.17.14" } }, - "async-limiter": { + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true + }, + "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "asynckit": { + "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "atob": { + "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } }, - "aws-sign2": { + "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "aws4": { + "node_modules/aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, - "azure-devops-node-api": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.0.0.tgz", - "integrity": "sha512-pmkMmdwV2mu8MxZzO0huorNM3f3klNdQPABdy1AderPOCjhQLUZhDHMA3qDMkLHjKAURJdG/NtMuarWg8YFDQA==", - "requires": { + "node_modules/azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "dependencies": { "tunnel": "0.0.6", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } - }, - "azure-pipelines-task-lib": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-2.8.0.tgz", - "integrity": "sha512-PR8oap9z2j+o455W3PwAfB4SX1p4GdJc9OHQaQV0V+iQS1IBY6dVgcNSQMkHAXb0V1bbuLOFBLanXPe5eSgGTQ==", - "requires": { - "minimatch": "3.0.4", - "mockery": "^1.7.0", - "q": "^1.1.2", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/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==", + "dependencies": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", "semver": "^5.1.0", - "shelljs": "^0.3.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", "uuid": "^3.0.1" } }, - "babel-jest": { + "node_modules/babel-jest": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", "dev": true, - "requires": { + "dependencies": { "@jest/transform": "^24.8.0", "@jest/types": "^24.8.0", "@types/babel__core": "^7.1.0", @@ -811,50 +1476,68 @@ "babel-preset-jest": "^24.6.0", "chalk": "^2.4.2", "slash": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "babel-plugin-istanbul": { + "node_modules/babel-plugin-istanbul": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-jest-hoist": { + "node_modules/babel-plugin-jest-hoist": { "version": "24.6.0", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", "dev": true, - "requires": { + "dependencies": { "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 6" } }, - "babel-preset-jest": { + "node_modules/babel-preset-jest": { "version": "24.6.0", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", "dev": true, - "requires": { + "dependencies": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", "babel-plugin-jest-hoist": "^24.6.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base": { + "node_modules/base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, - "requires": { + "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", @@ -863,93 +1546,131 @@ "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "engines": { + "node": ">=0.10.0" } }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, - "requires": { + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { "tweetnacl": "^0.14.3" } }, - "big.js": { + "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } }, - "bl": { + "node_modules/bl": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, - "requires": { + "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, - "brace-expansion": { + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, - "requires": { + "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", @@ -961,109 +1682,315 @@ "split-string": "^3.0.2", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "browser-process-hrtime": { + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-process-hrtime": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", "dev": true }, - "browser-resolve": { + "node_modules/browser-resolve": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, - "requires": { + "dependencies": { "resolve": "1.1.7" - }, + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" } }, - "bs-logger": { + "node_modules/bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "requires": { + "dependencies": { "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" } }, - "bser": { + "node_modules/bser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", "dev": true, - "requires": { + "dependencies": { "node-int64": "^0.4.0" } }, - "buffer": { + "node_modules/buffer": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.3.0.tgz", "integrity": "sha512-XykNc84nIOC32vZ9euOKbmGAP69JUkXDtBQfLq88c8/6J/gZi/t14A+l/p/9EM2TcT5xNC1MKPCrvO3LVUpVPw==", "dev": true, - "requires": { + "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" } }, - "buffer-alloc": { + "node_modules/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==", "dev": true, - "requires": { + "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" } }, - "buffer-alloc-unsafe": { + "node_modules/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==", "dev": true }, - "buffer-crc32": { + "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "buffer-fill": { + "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "cache-base": { + "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, - "requires": { + "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", @@ -1073,674 +2000,1372 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "callsites": { + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "camelcase-keys": { + "node_modules/camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, - "requires": { + "dependencies": { "camelcase": "^4.1.0", "map-obj": "^2.0.0", "quick-lru": "^1.0.0" }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true, + "engines": { + "node": ">=4" } }, - "capture-exit": { + "node_modules/capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, - "requires": { + "dependencies": { "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "caseless": { + "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "chalk": { + "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/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==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/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==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" } }, - "ci-info": { + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "class-utils": { + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "requires": { + "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "clipboardy": { + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/clipboardy": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", "dev": true, - "requires": { + "dependencies": { "arch": "^2.1.0", "execa": "^0.8.0" }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } + "engines": { + "node": ">=4" } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "node_modules/clipboardy/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/clipboardy/node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clipboardy/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/clipboardy/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/clipboardy/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "dependencies": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "co": { + "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } }, - "code-point-at": { + "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "collection-visit": { + "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, - "requires": { + "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colors": { + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colors": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.1.90" + } }, - "combined-stream": { + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "commander": { + "node_modules/commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, - "component-emitter": { + "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "compress-commons": { + "node_modules/compress-commons": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", "dev": true, - "requires": { + "dependencies": { "buffer-crc32": "^0.2.1", "crc32-stream": "^2.0.0", "normalize-path": "^2.0.0", "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" } }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "convert-source-map": { + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "~5.1.1" } }, - "copy-descriptor": { + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true + "node_modules/copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "crc": { + "node_modules/crc": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dev": true, - "requires": { + "dependencies": { "buffer": "^5.1.0" } }, - "crc32-stream": { + "node_modules/crc32-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", "dev": true, - "requires": { + "dependencies": { "crc": "^3.4.4", "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, - "requires": { + "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" } }, - "cssom": { + "node_modules/cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "cssstyle": { + "node_modules/cssstyle": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, - "requires": { + "dependencies": { "cssom": "0.3.x" } }, - "currently-unhandled": { + "node_modules/currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, - "requires": { + "dependencies": { "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "cycle": { + "node_modules/cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", "dev": true }, - "dank-each": { + "node_modules/dank-each": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dank-each/-/dank-each-1.0.0.tgz", "integrity": "sha1-qGE0Okso02IgPUBcd4ZNyaZANzA=" }, - "dank-map": { + "node_modules/dank-map": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dank-map/-/dank-map-0.1.0.tgz", "integrity": "sha1-6Z5384LGjy5asrPzqCuAMZV1Kag=" }, - "dashdash": { + "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, - "requires": { + "dependencies": { "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "data-urls": { + "node_modules/data-urls": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, - "requires": { + "dependencies": { "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" - }, + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, "dependencies": { - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "dateformat": { + "node_modules/dateformat": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.11.tgz", "integrity": "sha1-8ny+56ASu/uC6gUVYtOXf2CT27E=", "dev": true, - "requires": { + "dependencies": { "get-stdin": "*", "meow": "*" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" } }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "decamelize": { + "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "decamelize-keys": { + "node_modules/decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, - "requires": { + "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "decode-uri-component": { + "node_modules/decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "deep-is": { + "node_modules/deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "define-properties": { + "node_modules/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==", "dev": true, - "requires": { + "dependencies": { "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" } }, - "define-property": { + "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, - "requires": { + "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } }, - "detect-newline": { + "node_modules/detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "diff": { + "node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.3.1" + } }, - "diff-sequences": { + "node_modules/diff-sequences": { "version": "24.3.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" + "engines": { + "node": ">= 6" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { - "once": "^1.4.0" + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, - "requires": { + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", + "memory-fs": "^0.5.0", "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" } }, - "errno": { + "node_modules/errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, - "requires": { + "dependencies": { "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "error-ex": { + "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "es-abstract": { + "node_modules/es-abstract": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, - "requires": { + "dependencies": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", "is-callable": "^1.1.4", "is-regex": "^1.0.4", "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" } }, - "es-to-primitive": { + "node_modules/es-to-primitive": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, - "requires": { + "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "escodegen": { + "node_modules/escodegen": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "dev": true, - "requires": { + "dependencies": { "esprima": "^3.1.3", "estraverse": "^4.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { "source-map": "~0.6.1" } }, - "esprima": { + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esprima": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "estraverse": { + "node_modules/estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } }, - "exec-sh": { + "node_modules/exec-sh": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", "dev": true }, - "execa": { + "node_modules/execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", @@ -1748,20 +3373,26 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "exit": { + "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "expand-brackets": { + "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, - "requires": { + "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", @@ -1770,74 +3401,88 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "expect": { + "node_modules/expect": { "version": "24.8.0", "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.8.0", "ansi-styles": "^3.2.0", "jest-get-type": "^24.8.0", "jest-matcher-utils": "^24.8.0", "jest-message-util": "^24.8.0", "jest-regex-util": "^24.3.0" + }, + "engines": { + "node": ">= 6" } }, - "extend": { + "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { + "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, - "requires": { + "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "extglob": { + "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, - "requires": { + "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", @@ -1847,4395 +3492,7264 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "extsprintf": { + "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "dev": true, + "engines": [ + "node >=0.6.0" + ] }, - "eyes": { + "node_modules/eyes": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "dev": true, + "engines": { + "node": "> 0.1.90" + } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-json-stable-stringify": { + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/fast-glob/node_modules/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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, - "fast-levenshtein": { + "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fb-watchman": { + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, - "requires": { + "dependencies": { "bser": "^2.0.0" } }, - "fill-range": { + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "engines": { + "node": ">=0.10.0" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "requires": { - "locate-path": "^3.0.0" + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } }, - "form-data": { + "node_modules/form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { + "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, - "fragment-cache": { + "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, - "requires": { + "dependencies": { "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "fs-constants": { + "node_modules/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==", "dev": true }, - "fs.realpath": { + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { + "node_modules/fsevents": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "bundleDependencies": [ + "node-pre-gyp" + ], + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "hasInstallScript": true, "optional": true, - "requires": { + "os": [ + "darwin" + ], + "dependencies": { "nan": "^2.12.1", "node-pre-gyp": "^0.12.0" }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "optional": true, - "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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "optional": true - } + "engines": { + "node": ">=4.0" } }, - "function-bind": { + "node_modules/fsevents/node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "inBundle": true, + "license": "ISC", + "optional": true }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "node_modules/fsevents/node_modules/ansi-regex": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } }, - "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true + "node_modules/fsevents/node_modules/aproba": { + "version": "1.2.0", + "inBundle": true, + "license": "ISC", + "optional": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" + "node_modules/fsevents/node_modules/are-we-there-yet": { + "version": "1.1.5", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "node_modules/fsevents/node_modules/balanced-match": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "optional": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" + "node_modules/fsevents/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "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" + "node_modules/fsevents/node_modules/chownr": { + "version": "1.1.1", + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/code-point-at": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "node_modules/fsevents/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT", + "optional": true }, - "graceful-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", - "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - } + "node_modules/fsevents/node_modules/console-control-strings": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC", + "optional": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "node_modules/fsevents/node_modules/core-util-is": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "optional": true }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "node_modules/fsevents/node_modules/debug": { + "version": "4.1.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.1" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" + "node_modules/fsevents/node_modules/deep-extend": { + "version": "0.6.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { + "node_modules/fsevents/node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true + "inBundle": true, + "license": "MIT", + "optional": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "node_modules/fsevents/node_modules/detect-libc": { + "version": "1.0.3", + "inBundle": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, + "node_modules/fsevents/node_modules/fs-minipass": { + "version": "1.2.5", + "inBundle": true, + "license": "ISC", + "optional": true, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "minipass": "^2.2.1" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hosted-git-info": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.2.tgz", - "integrity": "sha512-CyjlXII6LMsPMyUzxpTt8fzh5QwzGqPmQXgY/Jyf4Zfp27t/FvfhwoE/8laaMUcMy816CkWF20I7NeQhwwY88w==", - "dev": true, - "requires": { - "lru-cache": "^5.1.1" - } + "node_modules/fsevents/node_modules/fs.realpath": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "optional": true }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" + "node_modules/fsevents/node_modules/gauge": { + "version": "2.7.4", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node_modules/fsevents/node_modules/glob": { + "version": "7.1.3", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" } }, - "i": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", - "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=", - "dev": true + "node_modules/fsevents/node_modules/has-unicode": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "optional": true }, - "iconv-lite": { + "node_modules/fsevents/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "node_modules/fsevents/node_modules/ignore-walk": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "minimatch": "^3.0.4" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "inflight": { + "node_modules/fsevents/node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { "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==", - "dev": true + "node_modules/fsevents/node_modules/inherits": { + "version": "2.0.3", + "inBundle": true, + "license": "ISC", + "optional": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" + "node_modules/fsevents/node_modules/ini": { + "version": "1.3.5", + "inBundle": true, + "license": "ISC", + "optional": true, + "engines": { + "node": "*" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, + "node_modules/fsevents/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "optional": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "node_modules/fsevents/node_modules/isarray": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "optional": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "node_modules/fsevents/node_modules/minimatch": { + "version": "3.0.4", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true + "node_modules/fsevents/node_modules/minimist": { + "version": "0.0.8", + "inBundle": true, + "license": "MIT", + "optional": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" + "node_modules/fsevents/node_modules/minipass": { + "version": "2.3.5", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, + "node_modules/fsevents/node_modules/minizlib": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT", + "optional": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "minipass": "^2.2.1" } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, + "node_modules/fsevents/node_modules/mkdirp": { + "version": "0.5.1", + "inBundle": true, + "license": "MIT", + "optional": true, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "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=", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true + "node_modules/fsevents/node_modules/ms": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "optional": true }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, + "node_modules/fsevents/node_modules/needle": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "optional": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" } }, - "is-plain-obj": { + "node_modules/fsevents/node_modules/node-pre-gyp": { + "version": "0.12.0", + "inBundle": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/fsevents/node_modules/nopt": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/fsevents/node_modules/npm-bundled": { + "version": "1.0.6", + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/npm-packlist": { + "version": "1.4.1", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "node_modules/fsevents/node_modules/npmlog": { + "version": "4.1.2", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/fsevents/node_modules/number-is-nan": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/object-assign": { + "version": "4.1.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/os-homedir": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/os-tmpdir": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/osenv": { + "version": "0.1.5", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/fsevents/node_modules/path-is-absolute": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/process-nextick-args": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/rc": { + "version": "1.2.8", + "inBundle": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/fsevents/node_modules/rc/node_modules/minimist": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/readable-stream": { + "version": "2.3.6", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fsevents/node_modules/rimraf": { + "version": "2.6.3", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/fsevents/node_modules/safe-buffer": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/sax": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/semver": { + "version": "5.7.0", + "inBundle": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fsevents/node_modules/set-blocking": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/signal-exit": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/string_decoder": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fsevents/node_modules/string-width": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-ansi": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-json-comments": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/tar": { + "version": "4.4.8", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/fsevents/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/wide-align": { + "version": "1.1.3", + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/fsevents/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/yallist": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-exec": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/glob-exec/-/glob-exec-0.1.1.tgz", + "integrity": "sha512-/ZbFcEUsNRPh6PExnQiM1oq80AzREcbHYJvvcqv10as0qiNlVe/Q+gdmsVcaguEclpt2m8EpQNqVpVVLU1UE1w==", + "dev": true, + "dependencies": { + "glob": "7.1.X", + "subarg": "1.0.X" + }, + "bin": { + "glob-exec": "lib/cli.js" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", + "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==", + "dev": true + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", + "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.2.tgz", + "integrity": "sha512-CyjlXII6LMsPMyUzxpTt8fzh5QwzGqPmQXgY/Jyf4Zfp27t/FvfhwoE/8laaMUcMy816CkWF20I7NeQhwwY88w==", + "dev": true, + "dependencies": { + "lru-cache": "^5.1.1" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/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==", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "dependencies": { + "has": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isnumber": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isnumber/-/isnumber-1.0.0.tgz", + "integrity": "sha1-Dj+XWbWB2Z3YUIbw7Cp0kJz63QE=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "dependencies": { + "handlebars": "^4.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", + "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "dev": true, + "dependencies": { + "import-local": "^2.0.0", + "jest-cli": "^24.8.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-changed-files": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", + "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "dev": true, + "dependencies": { + "@jest/types": "^24.8.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-config": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", + "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.8.0", + "@jest/types": "^24.8.0", + "babel-jest": "^24.8.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.8.0", + "jest-environment-node": "^24.8.0", + "jest-get-type": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.8.0", + "realpath-native": "^1.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-diff": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", + "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-docblock": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "dev": true, + "dependencies": { + "detect-newline": "^2.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-each": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", + "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "dev": true, + "dependencies": { + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", + "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0", + "jsdom": "^11.5.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-node": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", + "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-get-type": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", + "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-haste-map": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", + "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "dev": true, + "dependencies": { + "@jest/types": "^24.8.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.4.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 6" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/jest-jasmine2": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", + "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.8.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0", + "throat": "^4.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-leak-detector": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", + "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "dev": true, + "dependencies": { + "pretty-format": "^24.8.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-matcher-utils": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", + "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-diff": "^24.8.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-message-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", + "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-mock": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", + "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "dev": true, + "dependencies": { + "@jest/types": "^24.8.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-resolve": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", + "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "dev": true, + "dependencies": { + "@jest/types": "^24.8.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", + "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "dev": true, + "dependencies": { + "@jest/types": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.8.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-runner": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", + "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "dev": true, + "dependencies": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-leak-detector": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-runtime": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", + "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "dev": true, + "dependencies": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.2", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^12.0.2" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-serializer": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", + "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-snapshot": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", + "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "expect": "^24.8.0", + "jest-diff": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.8.0", + "semver": "^5.5.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", + "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "dev": true, + "dependencies": { + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-validate": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "dev": true, + "dependencies": { + "@jest/types": "^24.8.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "leven": "^2.1.0", + "pretty-format": "^24.8.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-watcher": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", + "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.9", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.8.0", + "string-length": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-worker": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "dev": true, + "dependencies": { + "merge-stream": "^1.0.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", + "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "dev": true, + "dependencies": { + "@jest/core": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^12.0.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "dependencies": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-in-place": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-in-place/-/json-in-place-1.0.1.tgz", + "integrity": "sha1-ih7NJaac4ZAFUs1xUr2TdU3k4fA=", + "dev": true, + "dependencies": { + "json-lexer": "1.1.1" + } + }, + "node_modules/json-lexer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-lexer/-/json-lexer-1.1.1.tgz", + "integrity": "sha1-vT7V1+Vgudma0iNPKMpwb7N3t9Q=", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/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=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "dependencies": { + "invert-kv": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "deprecated": "use String.prototype.padStart()", + "dev": true + }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "dependencies": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/meow/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dependencies": { + "mime-db": "1.40.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/nise": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.1.tgz", + "integrity": "sha512-edFWm0fsFG2n318rfEnKlTZTkjlbVOFF9XIA+fj+Ed+Qz1laYW2lobwavWoMzGrYDHH1EpiNJgDfvGnkZztR/g==", + "dev": true, + "dependencies": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^4.1.0", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.1.tgz", + "integrity": "sha512-p52B+onAEHKW1OF9MGO/S7k/ahGEHfhP5/tvwYzog/5XLYOd8ZuD6vdNZdUuWMONRnKPneXV43v3s6Snx1wsCQ==", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node_modules/nodemailer": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.3.0.tgz", + "integrity": "sha512-TEHBNBPHv7Ie/0o3HXnb7xrPSSQmH1dXwQKRaMKDBGt/ZN54lvDVujP6hKkO/vjkIYL9rK8kHSG11+G42Nhxuw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-to-xml": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-to-xml/-/object-to-xml-2.0.0.tgz", + "integrity": "sha512-bArXy7WCF1V9R88/zF9adSZSeFQnFmmKhMqNuNLAxqrbkvzcWP8HgnaRCcVJsfvIgvpdHiYd0qzJi7LM7QFfcQ==", + "dependencies": { + "dank-each": "^1.0.0", + "dank-map": "~0.1.0", + "sanitizer": "0.1.3" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onecolor": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-2.5.0.tgz", + "integrity": "sha1-Ila2UdyAfBAfAK7b1JklxXpEMcE=", + "dev": true, + "engines": { + "node": ">=0.4.8" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "node_modules/optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/optionator/node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "dependencies": { + "p-reduce": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/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==" + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true, - "requires": { - "isobject": "^3.0.1" + "engines": { + "node": ">=0.10.0" } }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "dev": true, - "requires": { - "has": "^1.0.1" + "optional": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true, - "requires": { - "has-symbols": "^1.0.0" + "engines": { + "node": ">=4" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "is-wsl": { + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pn": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "dev": true, + "dependencies": { + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/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==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "node_modules/prompt": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.3.0.tgz", + "integrity": "sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "async": "3.2.3", + "read": "1.0.x", + "revalidator": "0.1.x", + "winston": "2.x" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/prompt/node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, - "isnumber": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isnumber/-/isnumber-1.0.0.tgz", - "integrity": "sha1-Dj+XWbWB2Z3YUIbw7Cp0kJz63QE=" + "node_modules/prompts": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" + }, + "engines": { + "node": ">= 6" + } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "node_modules/psl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", "dev": true }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "safe-buffer": "^5.1.0" } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "node_modules/react-is": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", + "dev": true + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, - "requires": { - "handlebars": "^4.1.2" + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" } }, - "jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", - "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.8.0" - }, "dependencies": { - "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", - "dev": true, - "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^12.0.2" - } - } + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "node_modules/read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, - "requires": { - "@jest/types": "^24.8.0", - "execa": "^1.0.0", - "throat": "^4.0.0" + "dependencies": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", - "realpath-native": "^1.1.0" + "node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "node_modules/realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, - "requires": { - "detect-newline": "^2.1.0" + "dependencies": { + "util.promisify": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", - "dev": true, - "requires": { - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "node_modules/redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, - "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", - "jsdom": "^11.5.1" + "dependencies": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, - "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "node_modules/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=", "dev": true }, - "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true, - "requires": { - "@jest/types": "^24.8.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" + "engines": { + "node": ">=0.10.0" } }, - "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.8.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", - "throat": "^4.0.0" + "engines": { + "node": ">=0.10" } }, - "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, - "requires": { - "pretty-format": "^24.8.0" + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 4" } }, - "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "node_modules/request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "dependencies": { + "lodash": "^4.17.11" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "node_modules/request/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" + "dependencies": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" } }, - "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, - "requires": { - "@jest/types": "^24.8.0" + "engines": { + "node": ">=0.10.0" } }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", - "dev": true + "node_modules/resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dependencies": { + "path-parse": "^1.0.6" + } }, - "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, - "requires": { - "@jest/types": "^24.8.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true, - "requires": { - "@jest/types": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "engines": { + "node": ">=4" } }, - "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "engines": { + "node": ">=0.12" } }, - "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", - "dev": true + "node_modules/revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } }, - "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true, - "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "engines": { + "node": "6.* || >= 7.*" } }, - "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.8.0", - "string-length": "^2.0.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", "dev": true, - "requires": { - "merge-stream": "^1.0.1", - "supports-color": "^6.1.0" - }, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "aproba": "^1.1.1" } }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", - "dev": true + "node_modules/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==" }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/sanitizer": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/sanitizer/-/sanitizer-0.1.3.tgz", + "integrity": "sha1-1PCvdHXZp7ryqeWmEXGLqheKOeE=" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "json-in-place": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-in-place/-/json-in-place-1.0.1.tgz", - "integrity": "sha1-ih7NJaac4ZAFUs1xUr2TdU3k4fA=", + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "requires": { - "json-lexer": "1.1.1" + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "json-lexer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-lexer/-/json-lexer-1.1.1.tgz", - "integrity": "sha1-vT7V1+Vgudma0iNPKMpwb7N3t9Q=", - "dev": true + "node_modules/semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "bin": { + "semver": "bin/semver" + } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "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=", + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, - "requires": { - "minimist": "^1.2.0" + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" } }, - "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, - "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", - "pako": "~1.0.2", - "readable-stream": "~2.0.6" - }, "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "lazystream": { + "node_modules/shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true, - "requires": { - "readable-stream": "^2.0.5" + "engines": { + "node": ">=0.10.0" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" } }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/sinon": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.4.1.tgz", + "integrity": "sha512-7s9buHGHN/jqoy/v4bJgmt0m1XEkCEd/tqdHXumpBp0JSujaT4Ng84JU5wDdK4E85ZMq78NuDe0I3NAqXY8TFg==", "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "dependencies": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.2", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.1", + "supports-color": "^5.5.0" } }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } + "node_modules/sisteransi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", + "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "engines": { + "node": ">=6" } }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, - "requires": { - "yallist": "^3.0.2" + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, - "requires": { - "tmpl": "1.0.x" + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "requires": { - "p-defer": "^1.0.0" + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "requires": { - "object-visit": "^1.0.0" + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "engines": { + "node": ">=0.10.0" } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "engines": { + "node": ">=0.10.0" } }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "node_modules/source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" - }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "async": "^2.5.0", + "loader-utils": "^1.1.0" + }, + "engines": { + "node": ">= 6" } }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "node_modules/source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, - "requires": { - "readable-stream": "^2.0.1" + "dependencies": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "node_modules/spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, - "requires": { - "mime-db": "1.40.0" + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, - "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" + "node_modules/spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "node_modules/spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "dev": true, - "requires": { - "minimist": "0.0.8" - }, "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" } }, - "mockery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", - "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "engines": { + "node": "*" } }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "node_modules/stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "nise": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.1.tgz", - "integrity": "sha512-edFWm0fsFG2n318rfEnKlTZTkjlbVOFF9XIA+fj+Ed+Qz1laYW2lobwavWoMzGrYDHH1EpiNJgDfvGnkZztR/g==", + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, - "requires": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^4.1.0", - "path-to-regexp": "^1.7.0" + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true + "node_modules/stats-lite": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stats-lite/-/stats-lite-2.2.0.tgz", + "integrity": "sha512-/Kz55rgUIv2KP2MKphwYT/NCuSfAlbbMRv2ZWw7wyXayu230zdtzhxxuXXcvsc6EmmhS8bSJl3uS1wmMHFumbA==", + "dependencies": { + "isnumber": "~1.0.0" + }, + "engines": { + "node": ">=2.0.0" + } }, - "node-notifier": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.1.tgz", - "integrity": "sha512-p52B+onAEHKW1OF9MGO/S7k/ahGEHfhP5/tvwYzog/5XLYOd8ZuD6vdNZdUuWMONRnKPneXV43v3s6Snx1wsCQ==", + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" + "engines": { + "node": ">=0.10.0" } }, - "nodemailer": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.3.0.tgz", - "integrity": "sha512-TEHBNBPHv7Ie/0o3HXnb7xrPSSQmH1dXwQKRaMKDBGt/ZN54lvDVujP6hKkO/vjkIYL9rK8kHSG11+G42Nhxuw==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, - "requires": { - "path-key": "^2.0.0" + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, - "number-is-nan": { + "node_modules/stream-shift": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, + "node_modules/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==", "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "safe-buffer": "~5.1.0" } }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-to-xml": { + "node_modules/string-length": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object-to-xml/-/object-to-xml-2.0.0.tgz", - "integrity": "sha512-bArXy7WCF1V9R88/zF9adSZSeFQnFmmKhMqNuNLAxqrbkvzcWP8HgnaRCcVJsfvIgvpdHiYd0qzJi7LM7QFfcQ==", - "requires": { - "dank-each": "^1.0.0", - "dank-map": "~0.1.0", - "sanitizer": "0.1.3" + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "dependencies": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "node_modules/string-length/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true, - "requires": { - "isobject": "^3.0.0" + "engines": { + "node": ">=4" } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "node_modules/string-length/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, - "requires": { - "isobject": "^3.0.1" + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true, - "requires": { - "wrappy": "1" + "engines": { + "node": ">=4" } }, - "onecolor": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-2.5.0.tgz", - "integrity": "sha1-Ila2UdyAfBAfAK7b1JklxXpEMcE=", - "dev": true - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "engines": { + "node": ">=0.10.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "p-defer": { + "node_modules/subarg": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "dependencies": { + "minimist": "^1.1.0" + } }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "p-reduce": "^1.0.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true + "node_modules/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==", + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" + "node_modules/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==", + "dependencies": { + "get-port": "^3.1.0" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true, - "requires": { - "p-limit": "^2.0.0" + "engines": { + "node": ">=6" } }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "parse5": { + "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } }, - "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=", - "dev": true + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "node_modules/terser-webpack-plugin/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "node_modules/terser-webpack-plugin/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, - "requires": { - "isarray": "0.0.1" - }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, - "requires": { - "pify": "^3.0.0" + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } }, - "picomatch": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", - "dev": true + "node_modules/terser-webpack-plugin/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "node_modules/test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "dependencies": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "engines": { + "node": ">=6" + } }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "node_modules/tfx-cli": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/tfx-cli/-/tfx-cli-0.16.0.tgz", + "integrity": "sha512-kWRIvZiHWqpaCnHmXmJ/+Bzegiaf+q1+lkG0ht2+REW7qmQDaRMgeMeCiQCk0UDudQN1cPhPJSalzy3BwwxGuA==", "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" + "dependencies": { + "app-root-path": "1.0.0", + "archiver": "2.0.3", + "azure-devops-node-api": "^10.2.2", + "clipboardy": "~1.2.3", + "colors": "~1.3.0", + "glob": "7.1.2", + "jju": "^1.4.0", + "json-in-place": "^1.0.1", + "jszip": "^3.10.1", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "onecolor": "^2.5.0", + "os-homedir": "^1.0.1", + "prompt": "^1.3.0", + "read": "^1.0.6", + "shelljs": "^0.8.5", + "tmp": "0.0.26", + "tracer": "0.7.4", + "util.promisify": "^1.0.0", + "uuid": "^3.0.1", + "validator": "^13.7.0", + "winreg": "0.0.12", + "xml2js": "^0.5.0" + }, + "bin": { + "tfx": "_build/tfx-cli.js" + }, + "engines": { + "node": ">=8.0.0" } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "node_modules/tfx-cli/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, - "requires": { - "find-up": "^3.0.0" + "dependencies": { + "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" + }, + "engines": { + "node": "*" } }, - "pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", - "dev": true + "node_modules/tfx-cli/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true + "node_modules/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==", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.0.0" + } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "node_modules/throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, - "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "requires": { - "@jest/types": "^24.8.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "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==", - "dev": true + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } }, - "prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", + "node_modules/tinytim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/tinytim/-/tinytim-0.1.1.tgz", + "integrity": "sha1-yWih5VWa2VUyJO92J7qzTjyu+Kg=", "dev": true, - "requires": { - "pkginfo": "0.x.x", - "read": "1.0.x", - "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" + "engines": { + "node": ">= 0.2.0" } }, - "prompts": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", - "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", + "node_modules/tmp": { + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.26.tgz", + "integrity": "sha1-nvqCDOKhD4H4l5VVus4/FVJs4fI=", "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.3" + "dependencies": { + "os-tmpdir": "~1.0.0" + }, + "engines": { + "node": ">=0.4.0" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, - "psl": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", - "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", + "node_modules/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==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "engines": { + "node": ">=4" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } }, - "react-is": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", - "dev": true + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, - "requires": { - "mute-stream": "~0.0.4" + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "dependencies": { + "punycode": "^2.1.0" } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "node_modules/tracer": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/tracer/-/tracer-0.7.4.tgz", + "integrity": "sha1-d/oEN8+Ct2vNvNRLhHRHcuWeUlk=", "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "dependencies": { + "colors": "1.0.3", + "dateformat": "1.0.11", + "tinytim": "0.1.1" + }, + "engines": { + "node": ">= 0.10.0" } }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "node_modules/tracer/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true, - "requires": { - "util.promisify": "^1.0.0" + "engines": { + "node": ">=0.1.90" } }, - "redent": { + "node_modules/trim-newlines": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "engines": { + "node": ">=4" } }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "engines": { + "node": ">=0.10.0" } }, - "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=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "node_modules/ts-jest": { + "version": "24.0.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz", + "integrity": "sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw==", "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "jest": ">=24 <25" } }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "node_modules/ts-jest/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true, - "requires": { - "lodash": "^4.17.11" + "engines": { + "node": ">=4" } }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dev": true, - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "dependencies": { + "camelcase": "^4.1.0" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "node_modules/ts-loader": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.0.4.tgz", + "integrity": "sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g==", "dev": true, - "requires": { - "path-parse": "^1.0.6" + "dependencies": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8.6" + }, + "peerDependencies": { + "typescript": "*" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "node_modules/ts-loader/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { - "resolve-from": "^3.0.0" + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "node_modules/ts-loader/node_modules/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==", "dev": true, - "requires": { - "glob": "^7.1.3" + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "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==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "node_modules/ts-loader/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "requires": { - "ret": "~0.1.10" + "engines": { + "node": ">=0.12.0" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "node_modules/ts-loader/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "sanitizer": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/sanitizer/-/sanitizer-0.1.3.tgz", - "integrity": "sha1-1PCvdHXZp7ryqeWmEXGLqheKOeE=" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "node_modules/ts-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "node_modules/ts-loader/node_modules/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==", "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" + "node_modules/ts-mockito": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.4.2.tgz", + "integrity": "sha512-3AqLVXxjfdwlo2eC+xrzFsc5rsPtKBBhJZAnxWmyBmgT/PC+K26RIxiT2QLKcqjcJqZnuGZkwfPMx2gN31lFnw==", + "dependencies": { + "lodash": "^4.17.5" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", "dev": true }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=" + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "sinon": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.4.1.tgz", - "integrity": "sha512-7s9buHGHN/jqoy/v4bJgmt0m1XEkCEd/tqdHXumpBp0JSujaT4Ng84JU5wDdK4E85ZMq78NuDe0I3NAqXY8TFg==", + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, - "requires": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.2", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.1", - "supports-color": "^5.5.0" + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "sisteransi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", - "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", - "dev": true + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, + "node_modules/typed-rest-client/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "engines": { + "node": ">=4.2.0" } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, + "optional": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, - "source-map-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", - "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, - "requires": { - "async": "^2.5.0", - "loader-utils": "^1.1.0" + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "dependencies": { + "unique-slug": "^2.0.0" } }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "dependencies": { + "imurmurhash": "^0.1.4" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, - "requires": { - "extend-shallow": "^3.0.0" + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "engines": { + "node": ">=0.10.0" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "optional": true, + "engines": { + "node": ">=4", + "yarn": "*" } }, - "stats-lite": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stats-lite/-/stats-lite-2.2.0.tgz", - "integrity": "sha512-/Kz55rgUIv2KP2MKphwYT/NCuSfAlbbMRv2ZWw7wyXayu230zdtzhxxuXXcvsc6EmmhS8bSJl3uS1wmMHFumbA==", - "requires": { - "isnumber": "~1.0.0" + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" } }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "node_modules/url": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "punycode": "^1.4.1", + "qs": "^6.11.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/url/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true, - "requires": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=0.10.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, - "requires": { - "ansi-regex": "^4.1.0" + "dependencies": { + "inherits": "2.0.3" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "strip-eof": { + "node_modules/util.promisify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, - "requires": { - "has-flag": "^3.0.0" + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true + "node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "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" + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "engines": { + "node": ">= 0.10" } }, - "tfx-cli": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/tfx-cli/-/tfx-cli-0.7.8.tgz", - "integrity": "sha512-1jwJnu6ixYSstBDXXyPkBDkhNeTOVvLOhbtCDGKwCsmsWhQe/KUTFHaBlmi8y/tqg7/xI8A1cji5pM9C+3qKzg==", + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, - "requires": { - "app-root-path": "1.0.0", - "archiver": "2.0.3", - "async": "^1.4.0", - "azure-devops-node-api": "^8.1.1", - "clipboardy": "~1.2.3", - "colors": "~1.3.0", - "glob": "7.1.2", - "jju": "^1.4.0", - "json-in-place": "^1.0.1", - "jszip": "~3.1.5", - "lodash": "~4.17.11", - "minimist": "^1.1.2", - "mkdirp": "^0.5.1", - "onecolor": "^2.5.0", - "os-homedir": "^1.0.1", - "prompt": "^0.2.14", - "read": "^1.0.6", - "shelljs": "^0.5.1", - "tmp": "0.0.26", - "tracer": "0.7.4", - "util.promisify": "^1.0.0", - "uuid": "^3.0.1", - "validator": "^3.43.0", - "winreg": "0.0.12", - "xml2js": "^0.4.16" - }, + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "azure-devops-node-api": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-8.1.1.tgz", - "integrity": "sha512-TIb69NbHOJ/OTvfI1iazMzw/wG9A+ORCYibZCf5wDQFUyYzjCNVUA9QskAW1BGOulwyulGpqWXClCo4KoBaP0Q==", - "dev": true, - "requires": { - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "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" - } - }, - "shelljs": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", - "integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=", - "dev": true - }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", - "dev": true - } + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "tinytim": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/tinytim/-/tinytim-0.1.1.tgz", - "integrity": "sha1-yWih5VWa2VUyJO92J7qzTjyu+Kg=", + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "tmp": { - "version": "0.0.26", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.26.tgz", - "integrity": "sha1-nvqCDOKhD4H4l5VVus4/FVJs4fI=", + "node_modules/w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, - "requires": { - "os-tmpdir": "~1.0.0" + "dependencies": { + "browser-process-hrtime": "^0.1.2" } }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "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==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "node_modules/walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", + "dev": true, + "engines": { + "node": ">=0.6.0" + } }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "makeerror": "1.0.x" } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", "dev": true, - "requires": { - "punycode": "^2.1.0" + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" } }, - "tracer": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/tracer/-/tracer-0.7.4.tgz", - "integrity": "sha1-d/oEN8+Ct2vNvNRLhHRHcuWeUlk=", + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, - "requires": { - "colors": "1.0.3", - "dateformat": "1.0.11", - "tinytim": "0.1.1" - }, + "optional": true, "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" } }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "trim-right": { + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "ts-jest": { - "version": "24.0.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz", - "integrity": "sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw==", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, + "optional": true, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "ts-loader": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.0.4.tgz", - "integrity": "sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g==", + "node_modules/watchpack-chokidar2/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^4.0.0", - "semver": "^6.0.0" + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "@webpack-cli/migrate": { + "optional": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "webpack-bundle-analyzer": { + "optional": true }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } + "webpack-dev-server": { + "optional": true } } }, - "ts-mockito": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.4.2.tgz", - "integrity": "sha512-3AqLVXxjfdwlo2eC+xrzFsc5rsPtKBBhJZAnxWmyBmgT/PC+K26RIxiT2QLKcqjcJqZnuGZkwfPMx2gN31lFnw==", - "requires": { - "lodash": "^4.17.5" + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" } }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "requires": { - "safe-buffer": "^5.0.1" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/webpack-cli/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { - "prelude-ls": "~1.1.2" + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", - "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" - }, + "node_modules/webpack-cli/node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, "dependencies": { - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" - } + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", - "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", - "dev": true - }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "node_modules/webpack-cli/node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" + "engines": { + "node": ">= 0.10" } }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "node_modules/webpack-cli/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "node_modules/webpack-cli/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "node_modules/webpack-cli/node_modules/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==", "dev": true, - "requires": { - "punycode": "^2.1.0" + "engines": { + "node": ">=8" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { + "node_modules/webpack-cli/node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "node_modules/webpack-cli/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" } }, - "utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", - "dev": true, - "requires": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - } + "node_modules/webpack-cli/node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "node_modules/webpack-cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "validator": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-3.43.0.tgz", - "integrity": "sha1-lkZLmS1BloM9l6GUv0Cxn/VLrgU=", - "dev": true + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "node_modules/webpack-cli/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, - "requires": { - "browser-process-hrtime": "^0.1.2" + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", - "dev": true + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true, - "requires": { - "makeerror": "1.0.x" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } }, - "whatwg-encoding": { + "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, - "requires": { + "dependencies": { "iconv-lite": "0.4.24" } }, - "whatwg-mimetype": { + "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "dev": true, - "requires": { + "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, - "which": { + "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "which-module": { + "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "winreg": { + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/winreg": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/winreg/-/winreg-0.0.12.tgz", "integrity": "sha1-BxBVVLoanQiXklHRKUdb/64wBrc=", "dev": true }, - "winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", + "node_modules/winston": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.7.tgz", + "integrity": "sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==", "dev": true, - "requires": { - "async": "0.2.x", - "colors": "0.6.x", + "dependencies": { + "async": "^2.6.4", + "colors": "1.0.x", "cycle": "1.0.x", "eyes": "0.1.x", "isstream": "0.1.x", - "pkginfo": "0.3.x", "stack-trace": "0.0.x" }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", - "dev": true - } + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/winston/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "engines": { + "node": ">=0.1.90" } }, - "wordwrap": { + "node_modules/wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, - "requires": { + "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, - "ws": { + "node_modules/ws": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "dev": true, - "requires": { + "dependencies": { "async-limiter": "~1.0.0" } }, - "xml-name-validator": { + "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, - "requires": { + "dependencies": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "xslt-processor": { + "node_modules/xslt-processor": { "version": "0.11.5", "resolved": "https://registry.npmjs.org/xslt-processor/-/xslt-processor-0.11.5.tgz", "integrity": "sha512-1sqWl7cfLLPpGi5cieiIlqqpQU3f44N7gfFzCqvi0Om53vxmwZIp877x5+H6HoxaL8cr1xGG3OWRR2FtOC7zTg==", - "requires": { + "dependencies": { "he": "^1.2.0" } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { + "node_modules/yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, - "requires": { + "dependencies": { "cliui": "^4.0.0", "decamelize": "^1.2.0", "find-up": "^3.0.0", @@ -6248,36 +10762,49 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - } } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, - "zip-stream": { + "node_modules/yargs/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", "dev": true, - "requires": { + "dependencies": { "archiver-utils": "^1.3.0", "compress-commons": "^1.2.0", "lodash": "^4.8.0", "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" } } } diff --git a/package.json b/package.json index 9b79b7f5..4fc2cbc9 100644 --- a/package.json +++ b/package.json @@ -5,31 +5,27 @@ "scripts": { "test": "npm run jest", "prebuild": "npm install --no-optional", - "build": "npm run prebuild && npm run build:emailreport && npm run build:prinsights", - "build:t1": "npm run prebuild && npm run build:emailreport", + + "build:release": "npm run clean && npm run prebuild && npm run deps:npm:tasks && npm run compile && npm run deps:prune:tasks && webpack", + "deps:npm:tasks": "glob-exec --parallel --foreach \"Extensions/emailReportTask/Tasks/*/tsconfig.json\" -- \"cd {{file.dir}} && npm install --no-update-notifier --no-progress\"", + "deps:prune:tasks": "glob-exec --parallel --foreach \"Extensions/emailReportTask/Tasks/*/tsconfig.json\" -- \"cd {{file.dir}} && npm prune --production --no-update-notifier --no-progress\"", + "webpack": "webpack --config webpack.config.js --progress", + "compile": "npm run compile:tasks", + "compile:tasks": "glob-exec \"Extensions/emailReportTask/Tasks/*/tsconfig.json\" -- \"tsc -b {{files.join(' ')}}\"", + "package:dev": "tfx extension create --rev-version --manifest-globs azure-devops-extension.json task.json --overrides-file ./configs/dev.json --root ./dist", + "package:release": "", + + "build": "npm run prebuild && npm run build:prinsights", "build:t2": "npm run prebuild && npm run build:prinsights", - "pack:t1": "npm run clean && npm run build:t1 && npm run pack:emailreport", "pack:t2": "npm run clean && npm run build:t2 && npm run pack:prinsights", "e2e:t1": "npm run e2e:emailreport", "e2e:t2": "npm run e2e:prinsights", "build:prinsights": "tsc -p Tasks/pullRequestInsightsTask/tsconfig.json", - - "build:test": "nom run prebuild && np run deps:npm:tasks && npm run deps:prune:tasks", - "build:emailreport": "tsc -p Tasks/emailReportTask/tsconfig.json && node ./commands/postbuild.js emailReport", - "pack:emailreport": "node ./commands/package.js emailreport", - "deps:npm:tasks": "glob-exec --parallel --foreach \"Tasks/emailReportTask/*/tsconfig.json\" -- \"cd {{file.dir}} && npm install --no-update-notifier --no-progress\"", - "deps:prune:tasks": "glob-exec --parallel --foreach \"Tasks/TerraformTask/*/tsconfig.json\" -- \"cd {{file.dir}} && npm prune --production --no-update-notifier --no-progress\"", - "pack:prinsights": "node ./commands/package.js pullRequestInsights", - "e2e:emailreport": "node js/emailReportExtension/emailReportTask/tests/__e_to_e_tests__/InvokeTest.js", - "e2e:prinsights": "node js/pullRequestInsightsExtension/pullRequestInsightsTask/tests/__e_to_e_tests__/InvokeTest.js", "clean": "rimraf dist" - - - }, "repository": { "type": "git", @@ -59,10 +55,11 @@ "rimraf": "^2.6.3", "sinon": "^7.3.2", "source-map-loader": "^0.2.3", - "tfx-cli": "^0.12.0", + "tfx-cli": "^0.16.0", "ts-jest": "^24.0.2", "ts-loader": "^6.0.4", "typescript": "^3.5.3", + "copy-webpack-plugin": "^6.3.2", "webpack": "^4.46.0", "webpack-cli": "^4.9.2", "glob-parent": ">=6.0.2", diff --git a/temp.js b/temp.js new file mode 100644 index 00000000..e69de29b diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..d3f9c481 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,33 @@ +const path = require('path'); +const CopyWebpackPlugin = require("copy-webpack-plugin"); + +module.exports = { + mode: 'production', + entry: { + temp: './temp.js', + }, + output: { + path: __dirname + '/dist' + }, + plugins: [ + new CopyWebpackPlugin({ + patterns: [ + { from: "./images", to: "images", context: "." }, + { from: "./Extensions/emailReportTask/images", to: "images", context: "." }, + { from: "./README.md", to: "README.md" }, + { from: "./LICENSE", to: "." }, + { from: "./Extensions/emailReportTask/azure-devops-extensions.json", to: "azure-devops-extension.json" }, + { + from: "./Extensions/dist/Tasks", + globOptions: { + dot: true, + gitignore: false, + ignore: ["**/Tests/**", "**/*.ts"], + }, + to: "Tasks" + }, + + ] + }) + ] +}; \ No newline at end of file From 9c76121809f93980de761608fbf45160940247b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Wed, 30 Aug 2023 15:29:55 +0300 Subject: [PATCH 06/11] resturcure, setup packagin for dev and release --- .../emailReportTaskV1/EmailSender.d.ts | 7 + .../emailReportTaskV1/EmailSender.js | 94 +++++++++ .../emailReportTaskV1/EmailSender.js.map | 1 + .../emailReportTaskV1/EmailSender.ts | 0 .../emailReportTaskV1/IReportSender.d.ts | 5 + .../emailReportTaskV1/IReportSender.js | 3 + .../emailReportTaskV1/IReportSender.js.map | 1 + .../emailReportTaskV1/IReportSender.ts | 0 .../emailReportTaskV1/README.md | 0 .../emailReportTaskV1/ReportManager.d.ts | 11 ++ .../emailReportTaskV1/ReportManager.js | 50 +++++ .../emailReportTaskV1/ReportManager.js.map | 1 + .../emailReportTaskV1/ReportManager.ts | 0 .../config/ConfigurationProvider.d.ts | 26 +++ .../config/ConfigurationProvider.js | 145 ++++++++++++++ .../config/ConfigurationProvider.js.map | 1 + .../config/ConfigurationProvider.ts | 0 .../config/IConfigurationProvider.d.ts | 10 + .../config/IConfigurationProvider.js | 3 + .../config/IConfigurationProvider.js.map | 1 + .../config/IConfigurationProvider.ts | 0 .../config/ReportConfiguration.d.ts | 19 ++ .../config/ReportConfiguration.js | 52 +++++ .../config/ReportConfiguration.js.map | 1 + .../config/ReportConfiguration.ts | 0 .../config/TaskConstants.d.ts | 28 +++ .../emailReportTaskV1/config/TaskConstants.js | 35 ++++ .../config/TaskConstants.js.map | 1 + .../emailReportTaskV1/config/TaskConstants.ts | 0 .../config/mail/MailConfiguration.d.ts | 40 ++++ .../config/mail/MailConfiguration.js | 56 ++++++ .../config/mail/MailConfiguration.js.map | 1 + .../config/mail/MailConfiguration.ts | 0 .../config/mail/RecipientsConfiguration.d.ts | 33 ++++ .../config/mail/RecipientsConfiguration.js | 49 +++++ .../mail/RecipientsConfiguration.js.map | 1 + .../config/mail/RecipientsConfiguration.ts | 0 .../config/mail/SmtpConfiguration.d.ts | 27 +++ .../config/mail/SmtpConfiguration.js | 41 ++++ .../config/mail/SmtpConfiguration.js.map | 1 + .../config/mail/SmtpConfiguration.ts | 0 .../pipeline/PipelineConfiguration.d.ts | 60 ++++++ .../config/pipeline/PipelineConfiguration.js | 94 +++++++++ .../pipeline/PipelineConfiguration.js.map | 1 + .../config/pipeline/PipelineConfiguration.ts | 0 .../config/pipeline/PipelineType.d.ts | 4 + .../config/pipeline/PipelineType.js | 9 + .../config/pipeline/PipelineType.js.map | 1 + .../config/pipeline/PipelineType.ts | 0 .../config/report/GroupTestResultsBy.d.ts | 5 + .../config/report/GroupTestResultsBy.js | 10 + .../config/report/GroupTestResultsBy.js.map | 1 + .../config/report/GroupTestResultsBy.ts | 0 .../report/ReportDataConfiguration.d.ts | 35 ++++ .../config/report/ReportDataConfiguration.js | 49 +++++ .../report/ReportDataConfiguration.js.map | 1 + .../config/report/ReportDataConfiguration.ts | 0 .../config/report/SendMailCondition.d.ts | 6 + .../config/report/SendMailCondition.js | 11 ++ .../config/report/SendMailCondition.js.map | 1 + .../config/report/SendMailCondition.ts | 0 .../report/TestResultsConfiguration.d.ts | 46 +++++ .../config/report/TestResultsConfiguration.js | 65 +++++++ .../report/TestResultsConfiguration.js.map | 1 + .../config/report/TestResultsConfiguration.ts | 0 .../exceptions/DataProviderError.d.ts | 4 + .../exceptions/DataProviderError.js | 12 ++ .../exceptions/DataProviderError.js.map | 1 + .../exceptions/DataProviderError.ts | 0 .../exceptions/InputError.d.ts | 4 + .../exceptions/InputError.js | 12 ++ .../exceptions/InputError.js.map | 1 + .../exceptions/InputError.ts | 0 .../InvalidTestResultDataError.d.ts | 4 + .../exceptions/InvalidTestResultDataError.js | 12 ++ .../InvalidTestResultDataError.js.map | 1 + .../exceptions/InvalidTestResultDataError.ts | 0 .../exceptions/MailError.d.ts | 4 + .../emailReportTaskV1/exceptions/MailError.js | 12 ++ .../exceptions/MailError.js.map | 1 + .../emailReportTaskV1/exceptions/MailError.ts | 0 .../exceptions/MissingDataError.d.ts | 4 + .../exceptions/MissingDataError.js | 12 ++ .../exceptions/MissingDataError.js.map | 1 + .../exceptions/MissingDataError.ts | 0 .../exceptions/PipelineNotFoundError.d.ts | 4 + .../exceptions/PipelineNotFoundError.js | 12 ++ .../exceptions/PipelineNotFoundError.js.map | 1 + .../exceptions/PipelineNotFoundError.ts | 0 .../exceptions/PostProcessorError.d.ts | 4 + .../exceptions/PostProcessorError.js | 12 ++ .../exceptions/PostProcessorError.js.map | 1 + .../exceptions/PostProcessorError.ts | 0 .../exceptions/ReportError.d.ts | 6 + .../exceptions/ReportError.js | 27 +++ .../exceptions/ReportError.js.map | 1 + .../exceptions/ReportError.ts | 0 .../htmlreport/EmailTemplate.xslt | 0 .../htmlreport/HTMLReportCreator.d.ts | 6 + .../htmlreport/HTMLReportCreator.js | 33 ++++ .../htmlreport/HTMLReportCreator.js.map | 1 + .../htmlreport/HTMLReportCreator.ts | 0 .../htmlreport/IHTMLReportCreator.d.ts | 5 + .../htmlreport/IHTMLReportCreator.js | 3 + .../htmlreport/IHTMLReportCreator.js.map | 1 + .../htmlreport/IHTMLReportCreator.ts | 0 .../emailReportTaskV1/index.d.ts | 1 + .../emailReportTaskV1/index.js | 67 +++++++ .../emailReportTaskV1/index.js.map | 1 + .../emailReportTaskV1/index.ts | 0 .../emailReportTaskV1/model/BuildReport.d.ts | 25 +++ .../emailReportTaskV1/model/BuildReport.js | 79 ++++++++ .../model/BuildReport.js.map | 1 + .../emailReportTaskV1/model/BuildReport.ts | 0 .../emailReportTaskV1/model/ChangeModel.d.ts | 34 ++++ .../emailReportTaskV1/model/ChangeModel.js | 49 +++++ .../model/ChangeModel.js.map | 1 + .../emailReportTaskV1/model/ChangeModel.ts | 0 .../emailReportTaskV1/model/IssueModel.d.ts | 15 ++ .../emailReportTaskV1/model/IssueModel.js | 25 +++ .../emailReportTaskV1/model/IssueModel.js.map | 1 + .../emailReportTaskV1/model/IssueModel.ts | 0 .../emailReportTaskV1/model/JobModel.d.ts | 30 +++ .../emailReportTaskV1/model/JobModel.js | 41 ++++ .../emailReportTaskV1/model/JobModel.js.map | 1 + .../emailReportTaskV1/model/JobModel.ts | 0 .../emailReportTaskV1/model/PhaseModel.d.ts | 28 +++ .../emailReportTaskV1/model/PhaseModel.js | 41 ++++ .../emailReportTaskV1/model/PhaseModel.js.map | 1 + .../emailReportTaskV1/model/PhaseModel.ts | 0 .../model/ReleaseReport.d.ts | 51 +++++ .../emailReportTaskV1/model/ReleaseReport.js | 179 ++++++++++++++++++ .../model/ReleaseReport.js.map | 1 + .../emailReportTaskV1/model/ReleaseReport.ts | 0 .../emailReportTaskV1/model/Report.d.ts | 73 +++++++ .../emailReportTaskV1/model/Report.js | 99 ++++++++++ .../emailReportTaskV1/model/Report.js.map | 1 + .../emailReportTaskV1/model/Report.ts | 0 .../model/ReportFactory.d.ts | 9 + .../emailReportTaskV1/model/ReportFactory.js | 73 +++++++ .../model/ReportFactory.js.map | 1 + .../emailReportTaskV1/model/ReportFactory.ts | 0 .../emailReportTaskV1/model/TaskModel.d.ts | 41 ++++ .../emailReportTaskV1/model/TaskModel.js | 57 ++++++ .../emailReportTaskV1/model/TaskModel.js.map | 1 + .../emailReportTaskV1/model/TaskModel.ts | 0 .../model/helpers/LinkHelper.d.ts | 28 +++ .../model/helpers/LinkHelper.js | 125 ++++++++++++ .../model/helpers/LinkHelper.js.map | 1 + .../model/helpers/LinkHelper.ts | 0 .../model/helpers/TestResultsHelper.d.ts | 10 + .../model/helpers/TestResultsHelper.js | 48 +++++ .../model/helpers/TestResultsHelper.js.map | 1 + .../model/helpers/TestResultsHelper.ts | 0 .../model/helpers/TimeFormatter.d.ts | 7 + .../model/helpers/TimeFormatter.js | 79 ++++++++ .../model/helpers/TimeFormatter.js.map | 1 + .../model/helpers/TimeFormatter.ts | 0 .../testresults/TestOutcomeForPriority.d.ts | 7 + .../testresults/TestOutcomeForPriority.js | 12 ++ .../testresults/TestOutcomeForPriority.js.map | 1 + .../testresults/TestOutcomeForPriority.ts | 0 .../testresults/TestResultGroupModel.d.ts | 6 + .../model/testresults/TestResultGroupModel.js | 10 + .../testresults/TestResultGroupModel.js.map | 1 + .../model/testresults/TestResultGroupModel.ts | 0 .../model/testresults/TestResultModel.d.ts | 7 + .../model/testresults/TestResultModel.js | 11 ++ .../model/testresults/TestResultModel.js.map | 1 + .../model/testresults/TestResultModel.ts | 0 .../testresults/TestSummaryGroupModel.d.ts | 6 + .../testresults/TestSummaryGroupModel.js | 10 + .../testresults/TestSummaryGroupModel.js.map | 1 + .../testresults/TestSummaryGroupModel.ts | 0 .../testresults/TestSummaryItemModel.d.ts | 55 ++++++ .../model/testresults/TestSummaryItemModel.js | 91 +++++++++ .../testresults/TestSummaryItemModel.js.map | 1 + .../model/testresults/TestSummaryItemModel.ts | 0 .../model/viewmodel/ArtifactViewModel.d.ts | 15 ++ .../model/viewmodel/ArtifactViewModel.js | 31 +++ .../model/viewmodel/ArtifactViewModel.js.map | 1 + .../model/viewmodel/ArtifactViewModel.ts | 0 .../viewmodel/BuildReferenceViewModel.d.ts | 11 ++ .../viewmodel/BuildReferenceViewModel.js | 28 +++ .../viewmodel/BuildReferenceViewModel.js.map | 1 + .../viewmodel/BuildReferenceViewModel.ts | 0 .../model/viewmodel/ChangeViewModel.d.ts | 15 ++ .../model/viewmodel/ChangeViewModel.js | 21 ++ .../model/viewmodel/ChangeViewModel.js.map | 1 + .../model/viewmodel/ChangeViewModel.ts | 0 .../viewmodel/DeploymentJobViewModel.d.ts | 10 + .../model/viewmodel/DeploymentJobViewModel.js | 49 +++++ .../viewmodel/DeploymentJobViewModel.js.map | 1 + .../model/viewmodel/DeploymentJobViewModel.ts | 0 .../model/viewmodel/EmailReportViewModel.d.ts | 38 ++++ .../model/viewmodel/EmailReportViewModel.js | 132 +++++++++++++ .../viewmodel/EmailReportViewModel.js.map | 1 + .../model/viewmodel/EmailReportViewModel.ts | 0 .../model/viewmodel/MailAddressViewModel.d.ts | 18 ++ .../model/viewmodel/MailAddressViewModel.js | 128 +++++++++++++ .../viewmodel/MailAddressViewModel.js.map | 1 + .../model/viewmodel/MailAddressViewModel.ts | 0 .../model/viewmodel/PhaseIssuesViewModel.d.ts | 7 + .../model/viewmodel/PhaseIssuesViewModel.js | 31 +++ .../viewmodel/PhaseIssuesViewModel.js.map | 1 + .../model/viewmodel/PhaseIssuesViewModel.ts | 0 .../model/viewmodel/PhaseViewModel.d.ts | 15 ++ .../model/viewmodel/PhaseViewModel.js | 35 ++++ .../model/viewmodel/PhaseViewModel.js.map | 1 + .../model/viewmodel/PhaseViewModel.ts | 0 .../ReleaseEnvironmentViewModel.d.ts | 6 + .../viewmodel/ReleaseEnvironmentViewModel.js | 11 ++ .../ReleaseEnvironmentViewModel.js.map | 1 + .../viewmodel/ReleaseEnvironmentViewModel.ts | 0 .../viewmodel/ReleaseReferenceViewModel.d.ts | 8 + .../viewmodel/ReleaseReferenceViewModel.js | 13 ++ .../ReleaseReferenceViewModel.js.map | 1 + .../viewmodel/ReleaseReferenceViewModel.ts | 0 .../model/viewmodel/ReleaseViewModel.d.ts | 13 ++ .../model/viewmodel/ReleaseViewModel.js | 25 +++ .../model/viewmodel/ReleaseViewModel.js.map | 1 + .../model/viewmodel/ReleaseViewModel.ts | 0 .../viewmodel/TaskIssueSummaryViewModel.d.ts | 14 ++ .../viewmodel/TaskIssueSummaryViewModel.js | 58 ++++++ .../TaskIssueSummaryViewModel.js.map | 1 + .../viewmodel/TaskIssueSummaryViewModel.ts | 0 .../model/viewmodel/TaskIssueViewModel.d.ts | 9 + .../model/viewmodel/TaskIssueViewModel.js | 15 ++ .../model/viewmodel/TaskIssueViewModel.js.map | 1 + .../model/viewmodel/TaskIssueViewModel.ts | 0 .../model/viewmodel/TaskResultViewModel.d.ts | 24 +++ .../model/viewmodel/TaskResultViewModel.js | 82 ++++++++ .../viewmodel/TaskResultViewModel.js.map | 1 + .../model/viewmodel/TaskResultViewModel.ts | 0 .../TestInfoByPriorityViewModel.d.ts | 11 ++ .../viewmodel/TestInfoByPriorityViewModel.js | 25 +++ .../TestInfoByPriorityViewModel.js.map | 1 + .../viewmodel/TestInfoByPriorityViewModel.ts | 0 .../viewmodel/TestResultSummaryViewModel.d.ts | 14 ++ .../viewmodel/TestResultSummaryViewModel.js | 37 ++++ .../TestResultSummaryViewModel.js.map | 1 + .../viewmodel/TestResultSummaryViewModel.ts | 0 .../model/viewmodel/TestResultViewModel.d.ts | 26 +++ .../model/viewmodel/TestResultViewModel.js | 70 +++++++ .../viewmodel/TestResultViewModel.js.map | 1 + .../model/viewmodel/TestResultViewModel.ts | 0 .../viewmodel/TestResultsGroupViewModel.d.ts | 18 ++ .../viewmodel/TestResultsGroupViewModel.js | 43 +++++ .../TestResultsGroupViewModel.js.map | 1 + .../viewmodel/TestResultsGroupViewModel.ts | 0 .../viewmodel/TestSummaryGroupViewModel.d.ts | 15 ++ .../viewmodel/TestSummaryGroupViewModel.js | 40 ++++ .../TestSummaryGroupViewModel.js.map | 1 + .../viewmodel/TestSummaryGroupViewModel.ts | 0 .../viewmodel/TestSummaryItemViewModel.d.ts | 15 ++ .../viewmodel/TestSummaryItemViewModel.js | 37 ++++ .../viewmodel/TestSummaryItemViewModel.js.map | 1 + .../viewmodel/TestSummaryItemViewModel.ts | 0 .../model/viewmodel/WorkItemViewModel.d.ts | 14 ++ .../model/viewmodel/WorkItemViewModel.js | 28 +++ .../model/viewmodel/WorkItemViewModel.js.map | 1 + .../model/viewmodel/WorkItemViewModel.ts | 0 .../emailReportTaskV1/package-lock.json | 0 .../emailReportTaskV1/package.json | 0 .../providers/DataProviderFactory.d.ts | 14 ++ .../providers/DataProviderFactory.js | 56 ++++++ .../providers/DataProviderFactory.js.map | 1 + .../providers/DataProviderFactory.ts | 0 .../providers/IDataProvider.d.ts | 6 + .../providers/IDataProvider.js | 3 + .../providers/IDataProvider.js.map | 1 + .../providers/IDataProvider.ts | 0 .../providers/IDataProviderFactory.d.ts | 6 + .../providers/IDataProviderFactory.js | 3 + .../providers/IDataProviderFactory.js.map | 1 + .../providers/IDataProviderFactory.ts | 0 .../providers/IPostProcessor.d.ts | 5 + .../providers/IPostProcessor.js | 3 + .../providers/IPostProcessor.js.map | 1 + .../providers/IPostProcessor.ts | 0 .../providers/IReportProvider.d.ts | 5 + .../providers/IReportProvider.js | 3 + .../providers/IReportProvider.js.map | 1 + .../providers/IReportProvider.ts | 0 .../providers/ReportProvider.d.ts | 12 ++ .../providers/ReportProvider.js | 86 +++++++++ .../providers/ReportProvider.js.map | 1 + .../providers/ReportProvider.ts | 0 .../providers/SendMailConditionProcessor.d.ts | 14 ++ .../providers/SendMailConditionProcessor.js | 140 ++++++++++++++ .../SendMailConditionProcessor.js.map | 1 + .../providers/SendMailConditionProcessor.ts | 0 .../AbstractTestResultsDetailsParser.d.ts | 9 + .../AbstractTestResultsDetailsParser.js | 35 ++++ .../AbstractTestResultsDetailsParser.js.map | 1 + .../AbstractTestResultsDetailsParser.ts | 0 .../TestResultDetailsParserFactory.d.ts | 5 + .../helpers/TestResultDetailsParserFactory.js | 20 ++ .../TestResultDetailsParserFactory.js.map | 1 + .../helpers/TestResultDetailsParserFactory.ts | 0 .../TestResultDetailsParserForPriority.d.ts | 11 ++ .../TestResultDetailsParserForPriority.js | 64 +++++++ .../TestResultDetailsParserForPriority.js.map | 1 + .../TestResultDetailsParserForPriority.ts | 0 .../TestResultDetailsParserForRun.d.ts | 14 ++ .../helpers/TestResultDetailsParserForRun.js | 39 ++++ .../TestResultDetailsParserForRun.js.map | 1 + .../helpers/TestResultDetailsParserForRun.ts | 0 .../providers/pipeline/BuildDataProvider.d.ts | 14 ++ .../providers/pipeline/BuildDataProvider.js | 101 ++++++++++ .../pipeline/BuildDataProvider.js.map | 1 + .../providers/pipeline/BuildDataProvider.ts | 0 .../pipeline/ReleaseDataProvider.d.ts | 15 ++ .../providers/pipeline/ReleaseDataProvider.js | 116 ++++++++++++ .../pipeline/ReleaseDataProvider.js.map | 1 + .../providers/pipeline/ReleaseDataProvider.ts | 0 .../providers/restclients/AbstractClient.d.ts | 13 ++ .../providers/restclients/AbstractClient.js | 21 ++ .../restclients/AbstractClient.js.map | 1 + .../providers/restclients/AbstractClient.ts | 0 .../AbstractTestResultsClient.d.ts | 28 +++ .../restclients/AbstractTestResultsClient.js | 104 ++++++++++ .../AbstractTestResultsClient.js.map | 1 + .../restclients/AbstractTestResultsClient.ts | 0 .../providers/restclients/BuildClient.d.ts | 13 ++ .../providers/restclients/BuildClient.js | 53 ++++++ .../providers/restclients/BuildClient.js.map | 1 + .../providers/restclients/BuildClient.ts | 0 .../restclients/BuildTestResultsClient.d.ts | 9 + .../restclients/BuildTestResultsClient.js | 30 +++ .../restclients/BuildTestResultsClient.js.map | 1 + .../restclients/BuildTestResultsClient.ts | 0 .../restclients/IPipelineRestClient.d.ts | 8 + .../restclients/IPipelineRestClient.js | 3 + .../restclients/IPipelineRestClient.js.map | 1 + .../restclients/IPipelineRestClient.ts | 0 .../restclients/ITestResultsClient.d.ts | 12 ++ .../restclients/ITestResultsClient.js | 3 + .../restclients/ITestResultsClient.js.map | 1 + .../restclients/ITestResultsClient.ts | 0 .../restclients/IWorkItemClient.d.ts | 4 + .../providers/restclients/IWorkItemClient.js | 3 + .../restclients/IWorkItemClient.js.map | 1 + .../providers/restclients/IWorkItemClient.ts | 0 .../providers/restclients/ReleaseClient.d.ts | 12 ++ .../providers/restclients/ReleaseClient.js | 68 +++++++ .../restclients/ReleaseClient.js.map | 1 + .../providers/restclients/ReleaseClient.ts | 0 .../restclients/ReleaseTestResultsClient.d.ts | 9 + .../restclients/ReleaseTestResultsClient.js | 30 +++ .../ReleaseTestResultsClient.js.map | 1 + .../restclients/ReleaseTestResultsClient.ts | 0 .../restclients/RetryablePromise.d.ts | 4 + .../providers/restclients/RetryablePromise.js | 50 +++++ .../restclients/RetryablePromise.js.map | 1 + .../providers/restclients/RetryablePromise.ts | 0 .../providers/restclients/WorkItemClient.d.ts | 9 + .../providers/restclients/WorkItemClient.js | 37 ++++ .../restclients/WorkItemClient.js.map | 1 + .../providers/restclients/WorkItemClient.ts | 0 .../providers/tcmproviders/TcmHelper.d.ts | 9 + .../providers/tcmproviders/TcmHelper.js | 67 +++++++ .../providers/tcmproviders/TcmHelper.js.map | 1 + .../providers/tcmproviders/TcmHelper.ts | 0 .../tcmproviders/TestOwnersDataProvider.d.ts | 10 + .../tcmproviders/TestOwnersDataProvider.js | 35 ++++ .../TestOwnersDataProvider.js.map | 1 + .../tcmproviders/TestOwnersDataProvider.ts | 0 .../tcmproviders/TestResultsDataProvider.d.ts | 19 ++ .../tcmproviders/TestResultsDataProvider.js | 177 +++++++++++++++++ .../TestResultsDataProvider.js.map | 1 + .../tcmproviders/TestResultsDataProvider.ts | 0 .../tcmproviders/TestSummaryDataProvider.d.ts | 14 ++ .../tcmproviders/TestSummaryDataProvider.js | 120 ++++++++++++ .../TestSummaryDataProvider.js.map | 1 + .../tcmproviders/TestSummaryDataProvider.ts | 0 .../emailReportTaskV1/task.dev.json | 0 .../emailReportTaskV1/task.json | 0 .../telemetry/TelemetryLogger.d.ts | 17 ++ .../telemetry/TelemetryLogger.js | 103 ++++++++++ .../telemetry/TelemetryLogger.js.map | 1 + .../telemetry/TelemetryLogger.ts | 0 .../tests/__e_to_e_tests__/InvokeTest.d.ts | 14 ++ .../tests/__e_to_e_tests__/InvokeTest.js | 80 ++++++++ .../tests/__e_to_e_tests__/InvokeTest.js.map | 1 + .../tests/__e_to_e_tests__/InvokeTest.ts | 0 .../tests/__tests__/ReportManagerTests.d.ts | 1 + .../tests/__tests__/ReportManagerTests.js | 32 ++++ .../tests/__tests__/ReportManagerTests.js.map | 1 + .../tests/__tests__/ReportManagerTests.ts | 0 .../emailReportTaskV1/tsconfig.json | 3 +- .../utils/DisplayNameHelper.d.ts | 3 + .../utils/DisplayNameHelper.js | 14 ++ .../utils/DisplayNameHelper.js.map | 1 + .../utils/DisplayNameHelper.ts | 0 .../emailReportTaskV1/utils/EnumUtils.d.ts | 6 + .../emailReportTaskV1/utils/EnumUtils.js | 45 +++++ .../emailReportTaskV1/utils/EnumUtils.js.map | 1 + .../emailReportTaskV1/utils/EnumUtils.ts | 0 .../utils/EnvironmentExtensions.d.ts | 4 + .../utils/EnvironmentExtensions.js | 21 ++ .../utils/EnvironmentExtensions.js.map | 1 + .../utils/EnvironmentExtensions.ts | 0 .../emailReportTaskV1/utils/StringUtils.d.ts | 7 + .../emailReportTaskV1/utils/StringUtils.js | 39 ++++ .../utils/StringUtils.js.map | 1 + .../emailReportTaskV1/utils/StringUtils.ts | 0 .../emailReportTaskV2/EmailSender.d.ts | 7 + .../emailReportTaskV2/EmailSender.js | 94 +++++++++ .../emailReportTaskV2/EmailSender.js.map | 1 + .../emailReportTaskV2/EmailSender.ts | 0 .../emailReportTaskV2/IReportSender.d.ts | 5 + .../emailReportTaskV2/IReportSender.js | 3 + .../emailReportTaskV2/IReportSender.js.map | 1 + .../emailReportTaskV2/IReportSender.ts | 0 .../emailReportTaskV2/README.md | 0 .../emailReportTaskV2/ReportManager.d.ts | 11 ++ .../emailReportTaskV2/ReportManager.js | 50 +++++ .../emailReportTaskV2/ReportManager.js.map | 1 + .../emailReportTaskV2/ReportManager.ts | 0 .../config/ConfigurationProvider.d.ts | 26 +++ .../config/ConfigurationProvider.js | 145 ++++++++++++++ .../config/ConfigurationProvider.js.map | 1 + .../config/ConfigurationProvider.ts | 0 .../config/IConfigurationProvider.d.ts | 10 + .../config/IConfigurationProvider.js | 3 + .../config/IConfigurationProvider.js.map | 1 + .../config/IConfigurationProvider.ts | 0 .../config/ReportConfiguration.d.ts | 19 ++ .../config/ReportConfiguration.js | 52 +++++ .../config/ReportConfiguration.js.map | 1 + .../config/ReportConfiguration.ts | 0 .../config/TaskConstants.d.ts | 28 +++ .../emailReportTaskV2/config/TaskConstants.js | 35 ++++ .../config/TaskConstants.js.map | 1 + .../emailReportTaskV2/config/TaskConstants.ts | 0 .../config/mail/MailConfiguration.d.ts | 40 ++++ .../config/mail/MailConfiguration.js | 56 ++++++ .../config/mail/MailConfiguration.js.map | 1 + .../config/mail/MailConfiguration.ts | 0 .../config/mail/RecipientsConfiguration.d.ts | 33 ++++ .../config/mail/RecipientsConfiguration.js | 49 +++++ .../mail/RecipientsConfiguration.js.map | 1 + .../config/mail/RecipientsConfiguration.ts | 0 .../config/mail/SmtpConfiguration.d.ts | 27 +++ .../config/mail/SmtpConfiguration.js | 41 ++++ .../config/mail/SmtpConfiguration.js.map | 1 + .../config/mail/SmtpConfiguration.ts | 0 .../pipeline/PipelineConfiguration.d.ts | 60 ++++++ .../config/pipeline/PipelineConfiguration.js | 94 +++++++++ .../pipeline/PipelineConfiguration.js.map | 1 + .../config/pipeline/PipelineConfiguration.ts | 0 .../config/pipeline/PipelineType.d.ts | 4 + .../config/pipeline/PipelineType.js | 9 + .../config/pipeline/PipelineType.js.map | 1 + .../config/pipeline/PipelineType.ts | 0 .../config/report/GroupTestResultsBy.d.ts | 5 + .../config/report/GroupTestResultsBy.js | 10 + .../config/report/GroupTestResultsBy.js.map | 1 + .../config/report/GroupTestResultsBy.ts | 0 .../report/ReportDataConfiguration.d.ts | 35 ++++ .../config/report/ReportDataConfiguration.js | 49 +++++ .../report/ReportDataConfiguration.js.map | 1 + .../config/report/ReportDataConfiguration.ts | 0 .../config/report/SendMailCondition.d.ts | 6 + .../config/report/SendMailCondition.js | 11 ++ .../config/report/SendMailCondition.js.map | 1 + .../config/report/SendMailCondition.ts | 0 .../report/TestResultsConfiguration.d.ts | 46 +++++ .../config/report/TestResultsConfiguration.js | 65 +++++++ .../report/TestResultsConfiguration.js.map | 1 + .../config/report/TestResultsConfiguration.ts | 0 .../exceptions/DataProviderError.d.ts | 4 + .../exceptions/DataProviderError.js | 12 ++ .../exceptions/DataProviderError.js.map | 1 + .../exceptions/DataProviderError.ts | 0 .../exceptions/InputError.d.ts | 4 + .../exceptions/InputError.js | 12 ++ .../exceptions/InputError.js.map | 1 + .../exceptions/InputError.ts | 0 .../InvalidTestResultDataError.d.ts | 4 + .../exceptions/InvalidTestResultDataError.js | 12 ++ .../InvalidTestResultDataError.js.map | 1 + .../exceptions/InvalidTestResultDataError.ts | 0 .../exceptions/MailError.d.ts | 4 + .../emailReportTaskV2/exceptions/MailError.js | 12 ++ .../exceptions/MailError.js.map | 1 + .../emailReportTaskV2/exceptions/MailError.ts | 0 .../exceptions/MissingDataError.d.ts | 4 + .../exceptions/MissingDataError.js | 12 ++ .../exceptions/MissingDataError.js.map | 1 + .../exceptions/MissingDataError.ts | 0 .../exceptions/PipelineNotFoundError.d.ts | 4 + .../exceptions/PipelineNotFoundError.js | 12 ++ .../exceptions/PipelineNotFoundError.js.map | 1 + .../exceptions/PipelineNotFoundError.ts | 0 .../exceptions/PostProcessorError.d.ts | 4 + .../exceptions/PostProcessorError.js | 12 ++ .../exceptions/PostProcessorError.js.map | 1 + .../exceptions/PostProcessorError.ts | 0 .../exceptions/ReportError.d.ts | 6 + .../exceptions/ReportError.js | 27 +++ .../exceptions/ReportError.js.map | 1 + .../exceptions/ReportError.ts | 0 .../htmlreport/EmailTemplate.xslt | 0 .../htmlreport/HTMLReportCreator.d.ts | 6 + .../htmlreport/HTMLReportCreator.js | 33 ++++ .../htmlreport/HTMLReportCreator.js.map | 1 + .../htmlreport/HTMLReportCreator.ts | 0 .../htmlreport/IHTMLReportCreator.d.ts | 5 + .../htmlreport/IHTMLReportCreator.js | 3 + .../htmlreport/IHTMLReportCreator.js.map | 1 + .../htmlreport/IHTMLReportCreator.ts | 0 .../emailReportTaskV2/index.d.ts | 1 + .../emailReportTaskV2/index.js | 67 +++++++ .../emailReportTaskV2/index.js.map | 1 + .../emailReportTaskV2/index.ts | 0 .../emailReportTaskV2/model/BuildReport.d.ts | 25 +++ .../emailReportTaskV2/model/BuildReport.js | 79 ++++++++ .../model/BuildReport.js.map | 1 + .../emailReportTaskV2/model/BuildReport.ts | 0 .../emailReportTaskV2/model/ChangeModel.d.ts | 34 ++++ .../emailReportTaskV2/model/ChangeModel.js | 49 +++++ .../model/ChangeModel.js.map | 1 + .../emailReportTaskV2/model/ChangeModel.ts | 0 .../emailReportTaskV2/model/IssueModel.d.ts | 15 ++ .../emailReportTaskV2/model/IssueModel.js | 25 +++ .../emailReportTaskV2/model/IssueModel.js.map | 1 + .../emailReportTaskV2/model/IssueModel.ts | 0 .../emailReportTaskV2/model/JobModel.d.ts | 30 +++ .../emailReportTaskV2/model/JobModel.js | 41 ++++ .../emailReportTaskV2/model/JobModel.js.map | 1 + .../emailReportTaskV2/model/JobModel.ts | 0 .../emailReportTaskV2/model/PhaseModel.d.ts | 28 +++ .../emailReportTaskV2/model/PhaseModel.js | 41 ++++ .../emailReportTaskV2/model/PhaseModel.js.map | 1 + .../emailReportTaskV2/model/PhaseModel.ts | 0 .../model/ReleaseReport.d.ts | 51 +++++ .../emailReportTaskV2/model/ReleaseReport.js | 179 ++++++++++++++++++ .../model/ReleaseReport.js.map | 1 + .../emailReportTaskV2/model/ReleaseReport.ts | 0 .../emailReportTaskV2/model/Report.d.ts | 73 +++++++ .../emailReportTaskV2/model/Report.js | 99 ++++++++++ .../emailReportTaskV2/model/Report.js.map | 1 + .../emailReportTaskV2/model/Report.ts | 0 .../model/ReportFactory.d.ts | 9 + .../emailReportTaskV2/model/ReportFactory.js | 73 +++++++ .../model/ReportFactory.js.map | 1 + .../emailReportTaskV2/model/ReportFactory.ts | 0 .../emailReportTaskV2/model/TaskModel.d.ts | 41 ++++ .../emailReportTaskV2/model/TaskModel.js | 57 ++++++ .../emailReportTaskV2/model/TaskModel.js.map | 1 + .../emailReportTaskV2/model/TaskModel.ts | 0 .../model/helpers/LinkHelper.d.ts | 28 +++ .../model/helpers/LinkHelper.js | 125 ++++++++++++ .../model/helpers/LinkHelper.js.map | 1 + .../model/helpers/LinkHelper.ts | 0 .../model/helpers/TestResultsHelper.d.ts | 10 + .../model/helpers/TestResultsHelper.js | 48 +++++ .../model/helpers/TestResultsHelper.js.map | 1 + .../model/helpers/TestResultsHelper.ts | 0 .../model/helpers/TimeFormatter.d.ts | 7 + .../model/helpers/TimeFormatter.js | 79 ++++++++ .../model/helpers/TimeFormatter.js.map | 1 + .../model/helpers/TimeFormatter.ts | 0 .../testresults/TestOutcomeForPriority.d.ts | 7 + .../testresults/TestOutcomeForPriority.js | 12 ++ .../testresults/TestOutcomeForPriority.js.map | 1 + .../testresults/TestOutcomeForPriority.ts | 0 .../testresults/TestResultGroupModel.d.ts | 6 + .../model/testresults/TestResultGroupModel.js | 10 + .../testresults/TestResultGroupModel.js.map | 1 + .../model/testresults/TestResultGroupModel.ts | 0 .../model/testresults/TestResultModel.d.ts | 7 + .../model/testresults/TestResultModel.js | 11 ++ .../model/testresults/TestResultModel.js.map | 1 + .../model/testresults/TestResultModel.ts | 0 .../testresults/TestSummaryGroupModel.d.ts | 6 + .../testresults/TestSummaryGroupModel.js | 10 + .../testresults/TestSummaryGroupModel.js.map | 1 + .../testresults/TestSummaryGroupModel.ts | 0 .../testresults/TestSummaryItemModel.d.ts | 55 ++++++ .../model/testresults/TestSummaryItemModel.js | 91 +++++++++ .../testresults/TestSummaryItemModel.js.map | 1 + .../model/testresults/TestSummaryItemModel.ts | 0 .../model/viewmodel/ArtifactViewModel.d.ts | 15 ++ .../model/viewmodel/ArtifactViewModel.js | 31 +++ .../model/viewmodel/ArtifactViewModel.js.map | 1 + .../model/viewmodel/ArtifactViewModel.ts | 0 .../viewmodel/BuildReferenceViewModel.d.ts | 11 ++ .../viewmodel/BuildReferenceViewModel.js | 28 +++ .../viewmodel/BuildReferenceViewModel.js.map | 1 + .../viewmodel/BuildReferenceViewModel.ts | 0 .../model/viewmodel/ChangeViewModel.d.ts | 15 ++ .../model/viewmodel/ChangeViewModel.js | 21 ++ .../model/viewmodel/ChangeViewModel.js.map | 1 + .../model/viewmodel/ChangeViewModel.ts | 0 .../viewmodel/DeploymentJobViewModel.d.ts | 10 + .../model/viewmodel/DeploymentJobViewModel.js | 49 +++++ .../viewmodel/DeploymentJobViewModel.js.map | 1 + .../model/viewmodel/DeploymentJobViewModel.ts | 0 .../model/viewmodel/EmailReportViewModel.d.ts | 38 ++++ .../model/viewmodel/EmailReportViewModel.js | 132 +++++++++++++ .../viewmodel/EmailReportViewModel.js.map | 1 + .../model/viewmodel/EmailReportViewModel.ts | 0 .../model/viewmodel/MailAddressViewModel.d.ts | 18 ++ .../model/viewmodel/MailAddressViewModel.js | 128 +++++++++++++ .../viewmodel/MailAddressViewModel.js.map | 1 + .../model/viewmodel/MailAddressViewModel.ts | 0 .../model/viewmodel/PhaseIssuesViewModel.d.ts | 7 + .../model/viewmodel/PhaseIssuesViewModel.js | 31 +++ .../viewmodel/PhaseIssuesViewModel.js.map | 1 + .../model/viewmodel/PhaseIssuesViewModel.ts | 0 .../model/viewmodel/PhaseViewModel.d.ts | 15 ++ .../model/viewmodel/PhaseViewModel.js | 35 ++++ .../model/viewmodel/PhaseViewModel.js.map | 1 + .../model/viewmodel/PhaseViewModel.ts | 0 .../ReleaseEnvironmentViewModel.d.ts | 6 + .../viewmodel/ReleaseEnvironmentViewModel.js | 11 ++ .../ReleaseEnvironmentViewModel.js.map | 1 + .../viewmodel/ReleaseEnvironmentViewModel.ts | 0 .../viewmodel/ReleaseReferenceViewModel.d.ts | 8 + .../viewmodel/ReleaseReferenceViewModel.js | 13 ++ .../ReleaseReferenceViewModel.js.map | 1 + .../viewmodel/ReleaseReferenceViewModel.ts | 0 .../model/viewmodel/ReleaseViewModel.d.ts | 13 ++ .../model/viewmodel/ReleaseViewModel.js | 25 +++ .../model/viewmodel/ReleaseViewModel.js.map | 1 + .../model/viewmodel/ReleaseViewModel.ts | 0 .../viewmodel/TaskIssueSummaryViewModel.d.ts | 14 ++ .../viewmodel/TaskIssueSummaryViewModel.js | 58 ++++++ .../TaskIssueSummaryViewModel.js.map | 1 + .../viewmodel/TaskIssueSummaryViewModel.ts | 0 .../model/viewmodel/TaskIssueViewModel.d.ts | 9 + .../model/viewmodel/TaskIssueViewModel.js | 15 ++ .../model/viewmodel/TaskIssueViewModel.js.map | 1 + .../model/viewmodel/TaskIssueViewModel.ts | 0 .../model/viewmodel/TaskResultViewModel.d.ts | 24 +++ .../model/viewmodel/TaskResultViewModel.js | 82 ++++++++ .../viewmodel/TaskResultViewModel.js.map | 1 + .../model/viewmodel/TaskResultViewModel.ts | 0 .../TestInfoByPriorityViewModel.d.ts | 11 ++ .../viewmodel/TestInfoByPriorityViewModel.js | 25 +++ .../TestInfoByPriorityViewModel.js.map | 1 + .../viewmodel/TestInfoByPriorityViewModel.ts | 0 .../viewmodel/TestResultSummaryViewModel.d.ts | 14 ++ .../viewmodel/TestResultSummaryViewModel.js | 37 ++++ .../TestResultSummaryViewModel.js.map | 1 + .../viewmodel/TestResultSummaryViewModel.ts | 0 .../model/viewmodel/TestResultViewModel.d.ts | 26 +++ .../model/viewmodel/TestResultViewModel.js | 70 +++++++ .../viewmodel/TestResultViewModel.js.map | 1 + .../model/viewmodel/TestResultViewModel.ts | 0 .../viewmodel/TestResultsGroupViewModel.d.ts | 18 ++ .../viewmodel/TestResultsGroupViewModel.js | 43 +++++ .../TestResultsGroupViewModel.js.map | 1 + .../viewmodel/TestResultsGroupViewModel.ts | 0 .../viewmodel/TestSummaryGroupViewModel.d.ts | 15 ++ .../viewmodel/TestSummaryGroupViewModel.js | 40 ++++ .../TestSummaryGroupViewModel.js.map | 1 + .../viewmodel/TestSummaryGroupViewModel.ts | 0 .../viewmodel/TestSummaryItemViewModel.d.ts | 15 ++ .../viewmodel/TestSummaryItemViewModel.js | 37 ++++ .../viewmodel/TestSummaryItemViewModel.js.map | 1 + .../viewmodel/TestSummaryItemViewModel.ts | 0 .../model/viewmodel/WorkItemViewModel.d.ts | 14 ++ .../model/viewmodel/WorkItemViewModel.js | 28 +++ .../model/viewmodel/WorkItemViewModel.js.map | 1 + .../model/viewmodel/WorkItemViewModel.ts | 0 .../emailReportTaskV2/package-lock.json | 0 .../emailReportTaskV2/package.json | 0 .../providers/DataProviderFactory.d.ts | 14 ++ .../providers/DataProviderFactory.js | 56 ++++++ .../providers/DataProviderFactory.js.map | 1 + .../providers/DataProviderFactory.ts | 0 .../providers/IDataProvider.d.ts | 6 + .../providers/IDataProvider.js | 3 + .../providers/IDataProvider.js.map | 1 + .../providers/IDataProvider.ts | 0 .../providers/IDataProviderFactory.d.ts | 6 + .../providers/IDataProviderFactory.js | 3 + .../providers/IDataProviderFactory.js.map | 1 + .../providers/IDataProviderFactory.ts | 0 .../providers/IPostProcessor.d.ts | 5 + .../providers/IPostProcessor.js | 3 + .../providers/IPostProcessor.js.map | 1 + .../providers/IPostProcessor.ts | 0 .../providers/IReportProvider.d.ts | 5 + .../providers/IReportProvider.js | 3 + .../providers/IReportProvider.js.map | 1 + .../providers/IReportProvider.ts | 0 .../providers/ReportProvider.d.ts | 12 ++ .../providers/ReportProvider.js | 86 +++++++++ .../providers/ReportProvider.js.map | 1 + .../providers/ReportProvider.ts | 0 .../providers/SendMailConditionProcessor.d.ts | 14 ++ .../providers/SendMailConditionProcessor.js | 140 ++++++++++++++ .../SendMailConditionProcessor.js.map | 1 + .../providers/SendMailConditionProcessor.ts | 0 .../AbstractTestResultsDetailsParser.d.ts | 9 + .../AbstractTestResultsDetailsParser.js | 35 ++++ .../AbstractTestResultsDetailsParser.js.map | 1 + .../AbstractTestResultsDetailsParser.ts | 0 .../TestResultDetailsParserFactory.d.ts | 5 + .../helpers/TestResultDetailsParserFactory.js | 20 ++ .../TestResultDetailsParserFactory.js.map | 1 + .../helpers/TestResultDetailsParserFactory.ts | 0 .../TestResultDetailsParserForPriority.d.ts | 11 ++ .../TestResultDetailsParserForPriority.js | 64 +++++++ .../TestResultDetailsParserForPriority.js.map | 1 + .../TestResultDetailsParserForPriority.ts | 0 .../TestResultDetailsParserForRun.d.ts | 14 ++ .../helpers/TestResultDetailsParserForRun.js | 39 ++++ .../TestResultDetailsParserForRun.js.map | 1 + .../helpers/TestResultDetailsParserForRun.ts | 0 .../providers/pipeline/BuildDataProvider.d.ts | 14 ++ .../providers/pipeline/BuildDataProvider.js | 101 ++++++++++ .../pipeline/BuildDataProvider.js.map | 1 + .../providers/pipeline/BuildDataProvider.ts | 0 .../pipeline/ReleaseDataProvider.d.ts | 15 ++ .../providers/pipeline/ReleaseDataProvider.js | 116 ++++++++++++ .../pipeline/ReleaseDataProvider.js.map | 1 + .../providers/pipeline/ReleaseDataProvider.ts | 0 .../providers/restclients/AbstractClient.d.ts | 13 ++ .../providers/restclients/AbstractClient.js | 21 ++ .../restclients/AbstractClient.js.map | 1 + .../providers/restclients/AbstractClient.ts | 0 .../AbstractTestResultsClient.d.ts | 28 +++ .../restclients/AbstractTestResultsClient.js | 104 ++++++++++ .../AbstractTestResultsClient.js.map | 1 + .../restclients/AbstractTestResultsClient.ts | 0 .../providers/restclients/BuildClient.d.ts | 13 ++ .../providers/restclients/BuildClient.js | 53 ++++++ .../providers/restclients/BuildClient.js.map | 1 + .../providers/restclients/BuildClient.ts | 0 .../restclients/BuildTestResultsClient.d.ts | 9 + .../restclients/BuildTestResultsClient.js | 30 +++ .../restclients/BuildTestResultsClient.js.map | 1 + .../restclients/BuildTestResultsClient.ts | 0 .../restclients/IPipelineRestClient.d.ts | 8 + .../restclients/IPipelineRestClient.js | 3 + .../restclients/IPipelineRestClient.js.map | 1 + .../restclients/IPipelineRestClient.ts | 0 .../restclients/ITestResultsClient.d.ts | 12 ++ .../restclients/ITestResultsClient.js | 3 + .../restclients/ITestResultsClient.js.map | 1 + .../restclients/ITestResultsClient.ts | 0 .../restclients/IWorkItemClient.d.ts | 4 + .../providers/restclients/IWorkItemClient.js | 3 + .../restclients/IWorkItemClient.js.map | 1 + .../providers/restclients/IWorkItemClient.ts | 0 .../providers/restclients/ReleaseClient.d.ts | 12 ++ .../providers/restclients/ReleaseClient.js | 68 +++++++ .../restclients/ReleaseClient.js.map | 1 + .../providers/restclients/ReleaseClient.ts | 0 .../restclients/ReleaseTestResultsClient.d.ts | 9 + .../restclients/ReleaseTestResultsClient.js | 30 +++ .../ReleaseTestResultsClient.js.map | 1 + .../restclients/ReleaseTestResultsClient.ts | 0 .../restclients/RetryablePromise.d.ts | 4 + .../providers/restclients/RetryablePromise.js | 50 +++++ .../restclients/RetryablePromise.js.map | 1 + .../providers/restclients/RetryablePromise.ts | 0 .../providers/restclients/WorkItemClient.d.ts | 9 + .../providers/restclients/WorkItemClient.js | 37 ++++ .../restclients/WorkItemClient.js.map | 1 + .../providers/restclients/WorkItemClient.ts | 0 .../providers/tcmproviders/TcmHelper.d.ts | 9 + .../providers/tcmproviders/TcmHelper.js | 67 +++++++ .../providers/tcmproviders/TcmHelper.js.map | 1 + .../providers/tcmproviders/TcmHelper.ts | 0 .../tcmproviders/TestOwnersDataProvider.d.ts | 10 + .../tcmproviders/TestOwnersDataProvider.js | 35 ++++ .../TestOwnersDataProvider.js.map | 1 + .../tcmproviders/TestOwnersDataProvider.ts | 0 .../tcmproviders/TestResultsDataProvider.d.ts | 19 ++ .../tcmproviders/TestResultsDataProvider.js | 177 +++++++++++++++++ .../TestResultsDataProvider.js.map | 1 + .../tcmproviders/TestResultsDataProvider.ts | 0 .../tcmproviders/TestSummaryDataProvider.d.ts | 14 ++ .../tcmproviders/TestSummaryDataProvider.js | 120 ++++++++++++ .../TestSummaryDataProvider.js.map | 1 + .../tcmproviders/TestSummaryDataProvider.ts | 0 .../emailReportTaskV2/task.dev.json | 0 .../emailReportTaskV2/task.json | 0 .../telemetry/TelemetryLogger.d.ts | 17 ++ .../telemetry/TelemetryLogger.js | 103 ++++++++++ .../telemetry/TelemetryLogger.js.map | 1 + .../telemetry/TelemetryLogger.ts | 0 .../tests/__e_to_e_tests__/InvokeTest.d.ts | 14 ++ .../tests/__e_to_e_tests__/InvokeTest.js | 80 ++++++++ .../tests/__e_to_e_tests__/InvokeTest.js.map | 1 + .../tests/__e_to_e_tests__/InvokeTest.ts | 0 .../tests/__tests__/ReportManagerTests.d.ts | 1 + .../tests/__tests__/ReportManagerTests.js | 32 ++++ .../tests/__tests__/ReportManagerTests.js.map | 1 + .../tests/__tests__/ReportManagerTests.ts | 0 .../emailReportTaskV2/tsconfig.json | 3 +- .../utils/DisplayNameHelper.d.ts | 3 + .../utils/DisplayNameHelper.js | 14 ++ .../utils/DisplayNameHelper.js.map | 1 + .../utils/DisplayNameHelper.ts | 0 .../emailReportTaskV2/utils/EnumUtils.d.ts | 6 + .../emailReportTaskV2/utils/EnumUtils.js | 45 +++++ .../emailReportTaskV2/utils/EnumUtils.js.map | 1 + .../emailReportTaskV2/utils/EnumUtils.ts | 0 .../utils/EnvironmentExtensions.d.ts | 4 + .../utils/EnvironmentExtensions.js | 21 ++ .../utils/EnvironmentExtensions.js.map | 1 + .../utils/EnvironmentExtensions.ts | 0 .../emailReportTaskV2/utils/StringUtils.d.ts | 7 + .../emailReportTaskV2/utils/StringUtils.js | 39 ++++ .../utils/StringUtils.js.map | 1 + .../emailReportTaskV2/utils/StringUtils.ts | 0 .../emailReportTaskV1/vss-extension.json | 55 ------ .../azure-devops-extensions.json | 2 +- package.json | 6 +- webpack.config.js | 2 +- 818 files changed, 12733 insertions(+), 64 deletions(-) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/EmailSender.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/IReportSender.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/README.md (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/ReportManager.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/ConfigurationProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/IConfigurationProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/ReportConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/TaskConstants.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/mail/MailConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/mail/RecipientsConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/mail/SmtpConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/pipeline/PipelineType.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/report/GroupTestResultsBy.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/report/ReportDataConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/report/SendMailCondition.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/config/report/TestResultsConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/exceptions/DataProviderError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/exceptions/InputError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/exceptions/MailError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/exceptions/MissingDataError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/exceptions/PipelineNotFoundError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/exceptions/PostProcessorError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/exceptions/ReportError.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/htmlreport/EmailTemplate.xslt (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/htmlreport/HTMLReportCreator.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/index.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/BuildReport.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/ChangeModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/IssueModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/JobModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/PhaseModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/ReleaseReport.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/Report.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/ReportFactory.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/TaskModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/helpers/LinkHelper.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/helpers/TestResultsHelper.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/helpers/TimeFormatter.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/testresults/TestResultGroupModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/testresults/TestResultModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/package-lock.json (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/package.json (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/DataProviderFactory.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/IDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/IDataProviderFactory.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/IPostProcessor.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/IReportProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/ReportProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/SendMailConditionProcessor.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/AbstractClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/BuildClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/ITestResultsClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/IWorkItemClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/ReleaseClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/RetryablePromise.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/restclients/WorkItemClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/task.dev.json (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/task.json (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/telemetry/TelemetryLogger.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/tsconfig.json (74%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/utils/DisplayNameHelper.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/utils/EnumUtils.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/utils/EnvironmentExtensions.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV1/utils/StringUtils.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/EmailSender.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/IReportSender.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/README.md (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/ReportManager.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/ConfigurationProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/IConfigurationProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/ReportConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/TaskConstants.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/mail/MailConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/mail/RecipientsConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/mail/SmtpConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/pipeline/PipelineType.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/report/GroupTestResultsBy.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/report/ReportDataConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/report/SendMailCondition.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/config/report/TestResultsConfiguration.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/exceptions/DataProviderError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/exceptions/InputError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/exceptions/MailError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/exceptions/MissingDataError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/exceptions/PipelineNotFoundError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/exceptions/PostProcessorError.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/exceptions/ReportError.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/htmlreport/EmailTemplate.xslt (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/htmlreport/HTMLReportCreator.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/index.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/BuildReport.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/ChangeModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/IssueModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/JobModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/PhaseModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/ReleaseReport.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/Report.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/ReportFactory.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/TaskModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/helpers/LinkHelper.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/helpers/TestResultsHelper.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/helpers/TimeFormatter.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/testresults/TestResultGroupModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/testresults/TestResultModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/package-lock.json (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/package.json (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/DataProviderFactory.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/IDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/IDataProviderFactory.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/IPostProcessor.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/IReportProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/ReportProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/SendMailConditionProcessor.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/AbstractClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/BuildClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/ITestResultsClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/IWorkItemClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/ReleaseClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/RetryablePromise.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/restclients/WorkItemClient.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/task.dev.json (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/task.json (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/telemetry/TelemetryLogger.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts (100%) rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/tsconfig.json (74%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/utils/DisplayNameHelper.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/utils/EnumUtils.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/utils/EnvironmentExtensions.ts (100%) create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.d.ts create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js create mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js.map rename Extensions/emailReportTask/Tasks/{ => emailReportTask}/emailReportTaskV2/utils/StringUtils.ts (100%) delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTaskV1/vss-extension.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.d.ts new file mode 100644 index 00000000..15ea15d1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.d.ts @@ -0,0 +1,7 @@ +import { IReportSender } from "./IReportSender"; +import { MailConfiguration } from "./config/mail/MailConfiguration"; +import { Report } from "./model/Report"; +export declare class EmailSender implements IReportSender { + sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; + private sendMailAsync; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js new file mode 100644 index 00000000..e3f84dab --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js @@ -0,0 +1,94 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EmailSender = void 0; +const MailAddressViewModel_1 = require("./model/viewmodel/MailAddressViewModel"); +const MailError_1 = require("./exceptions/MailError"); +const util_1 = require("util"); +const nodemailer = require("nodemailer"); +const url = require("url"); +class EmailSender { + sendReportAsync(report, htmlReportMessage, mailConfiguration) { + return __awaiter(this, void 0, void 0, function* () { + const mailAddressViewModel = new MailAddressViewModel_1.MailAddressViewModel(report, mailConfiguration); + let smtpUrlProvided = mailConfiguration.$smtpConfig.$smtpHost; + console.log(`Using SmtpHost URL: ${smtpUrlProvided}`); + smtpUrlProvided = smtpUrlProvided.includes("://") ? smtpUrlProvided : "smtp://" + smtpUrlProvided; + console.log(`Parsed Url: ${smtpUrlProvided}`); + let smtpUrl = url.parse(smtpUrlProvided, true); + console.log(`Host: ${smtpUrl.host}`); + console.log(`HostName: ${smtpUrl.hostname}`); + console.log(`Port: ${smtpUrl.port}`); + console.log(`Protocol: ${smtpUrl.protocol}`); + const smtpHost = smtpUrl.hostname; + let smtpPort = smtpUrl.port; + smtpPort = util_1.isNullOrUndefined(smtpUrl.port) ? 587 : smtpUrl.port; + console.log(`Using HostName: ${smtpHost} and port: ${smtpPort}`); + let transporter; + if (mailConfiguration.$smtpConfig.$enableTLS) { + transporter = nodemailer.createTransport({ + host: smtpHost, + port: smtpPort, + tls: { + maxVersion: 'TLSv1.2', + minVersion: 'TLSv1.2', + rejectUnauthorized: false + }, + requireTLS: true, + auth: { + user: mailConfiguration.$smtpConfig.$userName, + pass: mailConfiguration.$smtpConfig.$password + } + }); + } + else { + transporter = nodemailer.createTransport({ + host: smtpHost, + port: smtpPort, + auth: { + user: mailConfiguration.$smtpConfig.$userName, + pass: mailConfiguration.$smtpConfig.$password + } + }); + } + try { + const result = yield this.sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, htmlReportMessage); + console.log(`Mail Sent Successfully: ${result.response}`); + return true; + } + catch (err) { + throw new MailError_1.MailError(err); + } + }); + } + sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, message) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + yield transporter.sendMail({ + from: mailAddressViewModel.from, + to: mailAddressViewModel.to.join(","), + cc: util_1.isNullOrUndefined(mailAddressViewModel.cc) || mailAddressViewModel.cc.length < 1 ? null : mailAddressViewModel.cc.join(","), + subject: mailConfiguration.$mailSubject, + html: message + }, (err, response) => { + if (err) { + reject(err); + } + else { + resolve(response); + } + }); + })); + }); + } +} +exports.EmailSender = EmailSender; +//# sourceMappingURL=EmailSender.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js.map new file mode 100644 index 00000000..ae6f1e15 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EmailSender.js","sourceRoot":"","sources":["EmailSender.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/EmailSender.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/EmailSender.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.d.ts new file mode 100644 index 00000000..f5cd6ac2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.d.ts @@ -0,0 +1,5 @@ +import { Report } from "./model/Report"; +import { MailConfiguration } from "./config/mail/MailConfiguration"; +export interface IReportSender { + sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js new file mode 100644 index 00000000..71c2bb2b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IReportSender.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js.map new file mode 100644 index 00000000..8b73c789 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IReportSender.js","sourceRoot":"","sources":["IReportSender.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/IReportSender.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/IReportSender.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/README.md b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/README.md similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/README.md rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/README.md diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.d.ts new file mode 100644 index 00000000..7eca7eed --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.d.ts @@ -0,0 +1,11 @@ +import { IReportProvider } from "./providers/IReportProvider"; +import { ReportConfiguration } from "./config/ReportConfiguration"; +import { IReportSender } from "./IReportSender"; +import { IHTMLReportCreator } from "./htmlreport/IHTMLReportCreator"; +export declare class ReportManager { + private reportProvider; + private reportSender; + private htmlReportCreator; + constructor(reportProvider: IReportProvider, htmlReportCreator: IHTMLReportCreator, reportSender: IReportSender); + sendReportAsync(reportConfig: ReportConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js new file mode 100644 index 00000000..43d04bff --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js @@ -0,0 +1,50 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportManager = void 0; +const ReportError_1 = require("./exceptions/ReportError"); +const MissingDataError_1 = require("./exceptions/MissingDataError"); +const EnumUtils_1 = require("./utils/EnumUtils"); +class ReportManager { + constructor(reportProvider, htmlReportCreator, reportSender) { + this.reportProvider = reportProvider; + this.reportSender = reportSender; + this.htmlReportCreator = htmlReportCreator; + } + sendReportAsync(reportConfig) { + return __awaiter(this, void 0, void 0, function* () { + let mailSent = false; + try { + console.log("Fetching data for email report"); + const report = yield this.reportProvider.createReportAsync(reportConfig); + console.log("Created report view model"); + if (report.$dataMissing) { + throw new MissingDataError_1.MissingDataError("Unable to fetch all data for generating report. Not Sending report."); + } + else if (report.$sendMailConditionSatisfied && this.reportSender != null) { + console.log("Creating report message"); + const htmlMessage = this.htmlReportCreator.createHtmlReport(report, reportConfig); + mailSent = yield this.reportSender.sendReportAsync(report, htmlMessage, reportConfig.$mailConfiguration); + } + else { + console.log(`Not sending mail, as the user send mail condition - '${EnumUtils_1.EnumUtils.GetMailConditionString(reportConfig.$sendMailCondition)}' is not satisfied.`); + } + } + catch (err) { + // Exit Task with Error to fail the task + ReportError_1.ReportError.HandleError(err, true); + } + return mailSent; + }); + } +} +exports.ReportManager = ReportManager; +//# sourceMappingURL=ReportManager.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js.map new file mode 100644 index 00000000..d231f427 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportManager.js","sourceRoot":"","sources":["ReportManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,0DAAuD;AAGvD,oEAAiE;AACjE,iDAA8C;AAE9C,MAAa,aAAa;IAMxB,YAAY,cAA+B,EAAE,iBAAqC,EAAE,YAA2B;QAC7G,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEY,eAAe,CAAC,YAAiC;;YAC5D,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI;gBACF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBAEzC,IAAI,MAAM,CAAC,YAAY,EAAE;oBACvB,MAAM,IAAI,mCAAgB,CAAC,qEAAqE,CAAC,CAAC;iBACnG;qBACI,IAAI,MAAM,CAAC,2BAA2B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;oBACxE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACvC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;oBAClF,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;iBAC1G;qBAAM;oBACL,OAAO,CAAC,GAAG,CAAC,wDAAwD,qBAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;iBAC7J;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,wCAAwC;gBACxC,yBAAW,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;aACpC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;KAAA;CACF;AApCD,sCAoCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/ReportManager.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/ReportManager.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.d.ts new file mode 100644 index 00000000..8ca4269d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.d.ts @@ -0,0 +1,26 @@ +import { IConfigurationProvider } from "./IConfigurationProvider"; +import { SendMailCondition } from "./report/SendMailCondition"; +import { MailConfiguration } from "./mail/MailConfiguration"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +export declare class ConfigurationProvider implements IConfigurationProvider { + private pipelineConfiguration; + private mailConfiguration; + private reportDataConfiguration; + private sendMailCondition; + constructor(); + getPipelineConfiguration(): PipelineConfiguration; + getMailConfiguration(): MailConfiguration; + getReportDataConfiguration(): ReportDataConfiguration; + getSendMailCondition(): SendMailCondition; + /** + * Gets access token from system + */ + private getAccessKey; + private initPipelineConfiguration; + private initMailConfiguration; + private initReportDataConfiguration; + initSendMailCondition(): void; + private getRecipientConfiguration; + private getGroupTestResultsByEnumFromString; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js new file mode 100644 index 00000000..da9e522b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js @@ -0,0 +1,145 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ConfigurationProvider = void 0; +const tl = require("azure-pipelines-task-lib"); +const TaskConstants_1 = require("./TaskConstants"); +const SendMailCondition_1 = require("./report/SendMailCondition"); +const MailConfiguration_1 = require("./mail/MailConfiguration"); +const RecipientsConfiguration_1 = require("./mail/RecipientsConfiguration"); +const SmtpConfiguration_1 = require("./mail/SmtpConfiguration"); +const InputError_1 = require("../exceptions/InputError"); +const ReportDataConfiguration_1 = require("./report/ReportDataConfiguration"); +const TestResultsConfiguration_1 = require("./report/TestResultsConfiguration"); +const GroupTestResultsBy_1 = require("./report/GroupTestResultsBy"); +const PipelineConfiguration_1 = require("./pipeline/PipelineConfiguration"); +const PipelineType_1 = require("./pipeline/PipelineType"); +const StringUtils_1 = require("../utils/StringUtils"); +const util_1 = require("util"); +class ConfigurationProvider { + constructor() { + this.initPipelineConfiguration(); + this.initMailConfiguration(); + this.initReportDataConfiguration(); + this.initSendMailCondition(); + } + getPipelineConfiguration() { + return this.pipelineConfiguration; + } + getMailConfiguration() { + return this.mailConfiguration; + } + getReportDataConfiguration() { + return this.reportDataConfiguration; + } + getSendMailCondition() { + return this.sendMailCondition; + } + /** + * Gets access token from system + */ + getAccessKey() { + return tl.getEndpointAuthorizationParameter(TaskConstants_1.TaskConstants.VSS_CONNECTION_KEY, TaskConstants_1.TaskConstants.ACCESS_PARAMETER, false); + } + initPipelineConfiguration() { + const hostType = tl.getVariable(TaskConstants_1.TaskConstants.HOST_KEY); + const pipelineType = hostType == "build" ? PipelineType_1.PipelineType.Build : PipelineType_1.PipelineType.Release; + const pipelineIdKey = pipelineType == PipelineType_1.PipelineType.Build ? TaskConstants_1.TaskConstants.BUILD_ID_KEY : TaskConstants_1.TaskConstants.RELEASE_ID_KEY; + const pipelineId = Number(tl.getVariable(pipelineIdKey)); + const projectId = tl.getVariable(TaskConstants_1.TaskConstants.PROJECTID_KEY); + const projectName = tl.getVariable(TaskConstants_1.TaskConstants.PROJECTNAME_KEY); + const envId = Number(tl.getVariable(TaskConstants_1.TaskConstants.ENVIRONMENTID_KEY)); + const envDefId = Number(tl.getVariable(TaskConstants_1.TaskConstants.ENVIRONMENTDEFID_KEY)); + const usePrevEnvironment = tl.getBoolInput(TaskConstants_1.TaskConstants.USEPREVENV_INPUTKEY); + const teamUri = tl.getVariable(TaskConstants_1.TaskConstants.TEAM_FOUNDATION_KEY); + this.pipelineConfiguration = new PipelineConfiguration_1.PipelineConfiguration(pipelineType, pipelineId, projectId, projectName, envId, envDefId, usePrevEnvironment, teamUri, this.getAccessKey()); + } + initMailConfiguration() { + const smtpConnectionId = tl.getInput(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, true); + const endPointScheme = tl.getEndpointAuthorizationScheme(smtpConnectionId, true); + if (endPointScheme != "UsernamePassword") { + throw new InputError_1.InputError(`Incorrect EndPoint Scheme Provided - '${endPointScheme}'. Only UserName and Password type Endpoints allowed.`); + } + const smtpHost = tl.getEndpointUrl(smtpConnectionId, true).replace(/(^\w+:|^)\/\//, '').replace(/\/$/, ''); + const userName = tl.getEndpointAuthorizationParameter(smtpConnectionId, "UserName", true); + const password = tl.getEndpointAuthorizationParameter(smtpConnectionId, "Password", true); + const enableTLS = tl.getBoolInput(TaskConstants_1.TaskConstants.ENABLETLS_INPUTKEY, true); + const smtpConfig = new SmtpConfiguration_1.SmtpConfiguration(userName, password, smtpHost, enableTLS); + // Mail Subject + const mailSubject = tl.getInput(TaskConstants_1.TaskConstants.SUBJECT_INPUTKEY, true); + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(mailSubject)) { + throw new InputError_1.InputError("Email subject not set"); + } + // Optional inputs + const toAddresses = tl.getInput(TaskConstants_1.TaskConstants.TOADDRESS_INPUTKEY, false); + const ccAddresses = tl.getInput(TaskConstants_1.TaskConstants.CCADDRESS_INPUTKEY, false); + const includeInToAddressesConfig = tl.getInput(TaskConstants_1.TaskConstants.INCLUDEINTO_INPUTKEY, false); + const includeInCCAddressesConfig = tl.getInput(TaskConstants_1.TaskConstants.INCLUDEINCC_INPUTKEY, false); + // Addresses Configuration + const toRecipientsConfiguration = this.getRecipientConfiguration(toAddresses, includeInToAddressesConfig); + const ccRecipientsConfiguration = this.getRecipientConfiguration(ccAddresses, includeInCCAddressesConfig); + const defaultDomain = tl.getInput(TaskConstants_1.TaskConstants.DEFAULTDOMAIN_INPUTKEY, true); + this.mailConfiguration = new MailConfiguration_1.MailConfiguration(mailSubject, toRecipientsConfiguration, ccRecipientsConfiguration, smtpConfig, defaultDomain); + } + initReportDataConfiguration() { + // required inputs + const groupResultsBy = this.getGroupTestResultsByEnumFromString(tl.getInput(TaskConstants_1.TaskConstants.GROUPTESTRESULTSBY_INPUTKEY, true)); + const includeOthersInTotal = tl.getBoolInput(TaskConstants_1.TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY, true); + const maxTestFailuresToShow = Number(tl.getInput(TaskConstants_1.TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, true)); + const includeCommits = tl.getBoolInput(TaskConstants_1.TaskConstants.INCLUDECOMMITS_INPUTKEY, true); + // optional inputs + const includeResultsStr = tl.getInput(TaskConstants_1.TaskConstants.INCLUDERESULTS_INPUTKEY, false); + const groupTestSummaryByStr = tl.getInput(TaskConstants_1.TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY, false); + const groupTestSummaryBy = new Array(); + if (!util_1.isNullOrUndefined(groupTestSummaryByStr)) { + groupTestSummaryByStr.split(",").forEach(element => { groupTestSummaryBy.push(this.getGroupTestResultsByEnumFromString(element)); }); + } + // derived input values + const includeResultsConfig = util_1.isNullOrUndefined(includeResultsStr) ? [] : includeResultsStr.split(","); + const includeFailedTests = includeResultsConfig.includes("1"); + const includeOtherTests = includeResultsConfig.includes("2"); + const includePassedTests = includeResultsConfig.includes("3"); + const includeInconclusiveTests = includeResultsConfig.includes("4"); + const includeNotExecutedTests = includeResultsConfig.includes("5"); + const testResultsConfig = new TestResultsConfiguration_1.TestResultsConfiguration(includeFailedTests, includePassedTests, includeInconclusiveTests, includeNotExecutedTests, includeOtherTests, groupResultsBy, maxTestFailuresToShow); + this.reportDataConfiguration = new ReportDataConfiguration_1.ReportDataConfiguration(includeCommits, includeOthersInTotal, true, groupTestSummaryBy, testResultsConfig); + } + initSendMailCondition() { + const sendMailConditionStr = tl.getInput(TaskConstants_1.TaskConstants.SENDMAILCONDITION_INPUTKEY); + let sendMailCondition; + switch (sendMailConditionStr) { + case "On Failure": + sendMailCondition = SendMailCondition_1.SendMailCondition.OnFailure; + break; + case "On Success": + sendMailCondition = SendMailCondition_1.SendMailCondition.OnSuccess; + break; + case "On New Failures Only": + sendMailCondition = SendMailCondition_1.SendMailCondition.OnNewFailuresOnly; + break; + default: + sendMailCondition = SendMailCondition_1.SendMailCondition.Always; + break; + } + this.sendMailCondition = sendMailCondition; + } + getRecipientConfiguration(namedRecipients, includeConfigStr) { + if (includeConfigStr != null) { + const includeConfig = includeConfigStr.split(","); + const includeChangesetOwners = includeConfig.includes("1"); + const includeTestOwners = includeConfig.includes("2"); + const includeActiveBugOwners = includeConfig.includes("3"); + const includeCreatedBy = includeConfig.includes("4"); + return new RecipientsConfiguration_1.RecipientsConfiguration(namedRecipients, includeChangesetOwners, includeTestOwners, includeActiveBugOwners, includeCreatedBy); + } + return new RecipientsConfiguration_1.RecipientsConfiguration(namedRecipients); + } + getGroupTestResultsByEnumFromString(groupResultsByStr) { + switch (groupResultsByStr) { + case "Priority": return GroupTestResultsBy_1.GroupTestResultsBy.Priority; + case "Team": return GroupTestResultsBy_1.GroupTestResultsBy.Team; + default: return GroupTestResultsBy_1.GroupTestResultsBy.Run; + } + } +} +exports.ConfigurationProvider = ConfigurationProvider; +//# sourceMappingURL=ConfigurationProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js.map new file mode 100644 index 00000000..96b7fe79 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ConfigurationProvider.js","sourceRoot":"","sources":["ConfigurationProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/ConfigurationProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/ConfigurationProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.d.ts new file mode 100644 index 00000000..df19ee31 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.d.ts @@ -0,0 +1,10 @@ +import { SendMailCondition } from "./report/SendMailCondition"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +import { MailConfiguration } from "./mail/MailConfiguration"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; +export interface IConfigurationProvider { + getPipelineConfiguration(): PipelineConfiguration; + getMailConfiguration(): MailConfiguration; + getReportDataConfiguration(): ReportDataConfiguration; + getSendMailCondition(): SendMailCondition; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js new file mode 100644 index 00000000..6a116ba8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IConfigurationProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js.map new file mode 100644 index 00000000..916dcc67 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IConfigurationProvider.js","sourceRoot":"","sources":["IConfigurationProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/IConfigurationProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/IConfigurationProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.d.ts new file mode 100644 index 00000000..26b2dde4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.d.ts @@ -0,0 +1,19 @@ +import { MailConfiguration } from "./mail/MailConfiguration"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; +import { IConfigurationProvider } from "./IConfigurationProvider"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +import { SendMailCondition } from "./report/SendMailCondition"; +export declare class ReportConfiguration { + private sendMailCondition; + private mailConfiguration; + private reportDataConfiguration; + private pipelineConfiguration; + constructor(configProvider: IConfigurationProvider); + validateConfiguration(): void; + private validateMailConfig; + get $sendMailCondition(): SendMailCondition; + get $mailConfiguration(): MailConfiguration; + get $reportDataConfiguration(): ReportDataConfiguration; + get $pipelineConfiguration(): PipelineConfiguration; + private throwError; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js new file mode 100644 index 00000000..a602ef99 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportConfiguration = void 0; +const InputError_1 = require("../exceptions/InputError"); +const TaskConstants_1 = require("./TaskConstants"); +const StringUtils_1 = require("../utils/StringUtils"); +class ReportConfiguration { + constructor(configProvider) { + this.sendMailCondition = configProvider.getSendMailCondition(); + this.mailConfiguration = configProvider.getMailConfiguration(); + this.reportDataConfiguration = configProvider.getReportDataConfiguration(); + this.pipelineConfiguration = configProvider.getPipelineConfiguration(); + } + validateConfiguration() { + if (this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow <= 0) { + this.throwError(TaskConstants_1.TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow, "be > 0"); + } + this.validateMailConfig(); + } + validateMailConfig() { + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$mailSubject)) { + this.throwError(TaskConstants_1.TaskConstants.SUBJECT_INPUTKEY, this.mailConfiguration.$mailSubject, "be specified"); + } + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$smtpHost)) { + this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$smtpHost, "specify SMTP Host URL"); + } + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$userName)) { + this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$userName, "specify SMTP UserName"); + } + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$password)) { + this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$password, "specify SMTP Password"); + } + } + // Getters + get $sendMailCondition() { + return this.sendMailCondition; + } + get $mailConfiguration() { + return this.mailConfiguration; + } + get $reportDataConfiguration() { + return this.reportDataConfiguration; + } + get $pipelineConfiguration() { + return this.pipelineConfiguration; + } + throwError(prefix, suffix, expectation) { + throw new InputError_1.InputError(`${prefix} should ${expectation}. Actual Input value: '${suffix}'`); + } +} +exports.ReportConfiguration = ReportConfiguration; +//# sourceMappingURL=ReportConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js.map new file mode 100644 index 00000000..77e9fd87 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportConfiguration.js","sourceRoot":"","sources":["ReportConfiguration.ts"],"names":[],"mappings":";;;AAKA,yDAAsD;AACtD,mDAAgD;AAChD,sDAAmD;AAEnD,MAAa,mBAAmB;IAM9B,YAAY,cAAsC;QAChD,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,uBAAuB,GAAG,cAAc,CAAC,0BAA0B,EAAE,CAAC;QAC3E,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC,wBAAwB,EAAE,CAAC;IACzE,CAAC;IAED,qBAAqB;QACnB,IAAI,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,eAAe,IAAI,CAAC,EAAE;YACxE,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,8BAA8B,EAAE,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;SAC1I;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,kBAAkB;QACxB,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;YACvE,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;SACtG;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;IACH,CAAC;IAED,UAAU;IACV,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,MAAW,EAAE,WAAmB;QACjE,MAAM,IAAI,uBAAU,CAAC,GAAG,MAAM,WAAW,WAAW,0BAA0B,MAAM,GAAG,CAAC,CAAC;IAC3F,CAAC;CACF;AA3DD,kDA2DC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/ReportConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/ReportConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.d.ts new file mode 100644 index 00000000..d88a6fb3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.d.ts @@ -0,0 +1,28 @@ +export declare class TaskConstants { + static readonly SUBJECT_INPUTKEY = "subject"; + static readonly SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; + static readonly INCLUDECOMMITS_INPUTKEY = "includeCommits"; + static readonly GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; + static readonly INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; + static readonly MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; + static readonly GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; + static readonly INCLUDERESULTS_INPUTKEY = "includeResultsStr"; + static readonly TOADDRESS_INPUTKEY = "toAddress"; + static readonly CCADDRESS_INPUTKEY = "ccAddress"; + static readonly INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; + static readonly INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; + static readonly SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; + static readonly ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; + static readonly USEPREVENV_INPUTKEY = "usePreviousEnvironment"; + static readonly DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; + static readonly TEAM_FOUNDATION_KEY: string; + static readonly VSS_CONNECTION_KEY: string; + static readonly ACCESS_PARAMETER: string; + static readonly PROJECTNAME_KEY: string; + static readonly PROJECTID_KEY: string; + static readonly BUILD_ID_KEY: string; + static readonly RELEASE_ID_KEY: string; + static readonly HOST_KEY: string; + static readonly ENVIRONMENTID_KEY: string; + static readonly ENVIRONMENTDEFID_KEY: string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js new file mode 100644 index 00000000..8faed453 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskConstants = void 0; +class TaskConstants { +} +exports.TaskConstants = TaskConstants; +TaskConstants.SUBJECT_INPUTKEY = "subject"; +TaskConstants.SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; +TaskConstants.INCLUDECOMMITS_INPUTKEY = "includeCommits"; +TaskConstants.GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; +TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; +TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; +TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; +TaskConstants.INCLUDERESULTS_INPUTKEY = "includeResultsStr"; +TaskConstants.TOADDRESS_INPUTKEY = "toAddress"; +TaskConstants.CCADDRESS_INPUTKEY = "ccAddress"; +TaskConstants.INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; +TaskConstants.INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; +TaskConstants.SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; +// Inputkey value should be "enableTLS" - however changing that will break the task for everyone. See task.dev.json or task.prod.json for the confusion. +// For now -inputkey has to be enableSSL... until AzureDevOps marketplace supports a way to rename params in json +TaskConstants.ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; +TaskConstants.USEPREVENV_INPUTKEY = "usePreviousEnvironment"; +TaskConstants.DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; +TaskConstants.TEAM_FOUNDATION_KEY = "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"; +TaskConstants.VSS_CONNECTION_KEY = "SYSTEMVSSCONNECTION"; +TaskConstants.ACCESS_PARAMETER = "ACCESSTOKEN"; +TaskConstants.PROJECTNAME_KEY = "SYSTEM_TEAMPROJECT"; +TaskConstants.PROJECTID_KEY = "SYSTEM_TEAMPROJECTID"; +TaskConstants.BUILD_ID_KEY = "BUILD_BUILDID"; +TaskConstants.RELEASE_ID_KEY = "RELEASE_RELEASEID"; +TaskConstants.HOST_KEY = "SYSTEM_HOSTTYPE"; +TaskConstants.ENVIRONMENTID_KEY = "RELEASE_ENVIRONMENTID"; +TaskConstants.ENVIRONMENTDEFID_KEY = "RELEASE_DEFINITIONENVIRONMENTID"; +//# sourceMappingURL=TaskConstants.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js.map new file mode 100644 index 00000000..c88ee1c5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskConstants.js","sourceRoot":"","sources":["TaskConstants.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;;AAA1B,sCAgCC;AA/BwB,8BAAgB,GAAG,SAAS,CAAC;AAC7B,wCAA0B,GAAG,yBAAyB,CAAC;AACvD,qCAAuB,GAAG,gBAAgB,CAAC;AAC3C,yCAA2B,GAAG,oBAAoB,CAAC;AACnD,2CAA6B,GAAG,sBAAsB,CAAC;AACvD,4CAA8B,GAAG,uBAAuB,CAAC;AACzD,yCAA2B,GAAG,uBAAuB,CAAC;AACtD,qCAAuB,GAAG,mBAAmB,CAAC;AAC9C,gCAAkB,GAAG,WAAW,CAAC;AACjC,gCAAkB,GAAG,WAAW,CAAC;AACjC,kCAAoB,GAAG,uBAAuB,CAAC;AAC/C,kCAAoB,GAAG,uBAAuB,CAAC;AAC/C,qCAAuB,GAAG,wBAAwB,CAAC;AAC1E,wJAAwJ;AACxJ,iHAAiH;AAC1F,gCAAkB,GAAG,2BAA2B,CAAC;AACjD,iCAAmB,GAAG,wBAAwB,CAAC;AAC/C,oCAAsB,GAAG,eAAe,CAAC;AAEzC,iCAAmB,GACxC,oCAAoC,CAAC;AAChB,gCAAkB,GAAW,qBAAqB,CAAC;AACnD,8BAAgB,GAAW,aAAa,CAAC;AACzC,6BAAe,GAAW,oBAAoB,CAAC;AAC/C,2BAAa,GAAW,sBAAsB,CAAC;AAC/C,0BAAY,GAAW,eAAe,CAAC;AACvC,4BAAc,GAAW,mBAAmB,CAAC;AAC7C,sBAAQ,GAAW,iBAAiB,CAAC;AAErC,+BAAiB,GAAW,uBAAuB,CAAC;AACpD,kCAAoB,GAAW,iCAAiC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/TaskConstants.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/TaskConstants.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.d.ts new file mode 100644 index 00000000..dee79830 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.d.ts @@ -0,0 +1,40 @@ +import { RecipientsConfiguration } from "./RecipientsConfiguration"; +import { SmtpConfiguration } from "./SmtpConfiguration"; +export declare class MailConfiguration { + private mailSubject; + private toRecipientsConfig; + private ccRecipientsConfig; + private smtpConfig; + private defaultDomain; + constructor($mailSubject: string, $toRecipientsConfig: RecipientsConfiguration, $ccRecipientsConfig: RecipientsConfiguration, $smtpConfig: SmtpConfiguration, $defaultDomain: string); + /** + * Getter $defaultDomain + * @return {string} + */ + get $defaultDomain(): string; + /** + * Getter $mailSubject + * @return {string} + */ + get $mailSubject(): string; + /** + * Getter $ccRecipientsConfig + * @return {RecipientsConfiguration} + */ + get $ccRecipientsConfig(): RecipientsConfiguration; + /** + * Getter $smtpConfig + * @return {SmtpConfiguration} + */ + get $smtpConfig(): SmtpConfiguration; + /** + * Getter $toRecipientsConfig + * @return {RecipientsConfiguration} + */ + get $toRecipientsConfig(): RecipientsConfiguration; + /** + * Setter $mailSubject + * @param {string} value + */ + set $mailSubject(value: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js new file mode 100644 index 00000000..b92224fc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MailConfiguration = void 0; +class MailConfiguration { + constructor($mailSubject, $toRecipientsConfig, $ccRecipientsConfig, $smtpConfig, $defaultDomain) { + this.mailSubject = $mailSubject; + this.toRecipientsConfig = $toRecipientsConfig; + this.ccRecipientsConfig = $ccRecipientsConfig; + this.smtpConfig = $smtpConfig; + this.defaultDomain = $defaultDomain; + } + /** + * Getter $defaultDomain + * @return {string} + */ + get $defaultDomain() { + return this.defaultDomain; + } + /** + * Getter $mailSubject + * @return {string} + */ + get $mailSubject() { + return this.mailSubject; + } + /** + * Getter $ccRecipientsConfig + * @return {RecipientsConfiguration} + */ + get $ccRecipientsConfig() { + return this.ccRecipientsConfig; + } + /** + * Getter $smtpConfig + * @return {SmtpConfiguration} + */ + get $smtpConfig() { + return this.smtpConfig; + } + /** + * Getter $toRecipientsConfig + * @return {RecipientsConfiguration} + */ + get $toRecipientsConfig() { + return this.toRecipientsConfig; + } + /** + * Setter $mailSubject + * @param {string} value + */ + set $mailSubject(value) { + this.mailSubject = value; + } +} +exports.MailConfiguration = MailConfiguration; +//# sourceMappingURL=MailConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js.map new file mode 100644 index 00000000..29e7bf96 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MailConfiguration.js","sourceRoot":"","sources":["MailConfiguration.ts"],"names":[],"mappings":";;;AAGA,MAAa,iBAAiB;IAQ5B,YAAY,YAAoB,EAAE,mBAA4C,EAAE,mBAA4C,EAAE,WAA8B,EAAE,cAAsB;QAClL,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;KAGC;IACD,IAAW,YAAY,CAAC,KAAa;QACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CAEF;AAhED,8CAgEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/MailConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/MailConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.d.ts new file mode 100644 index 00000000..5b3d30ce --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.d.ts @@ -0,0 +1,33 @@ +export declare class RecipientsConfiguration { + private defaultRecipients; + private includeChangesetOwners; + private includeTestOwners; + private includeActiveBugOwners; + private includeCreatedBy; + constructor($defaultRecipients: string, $includeChangesetOwners?: boolean, $includeTestOwners?: boolean, $includeActiveBugOwners?: boolean, $includeCreatedBy?: boolean); + /** + * Getter $defaultRecipients + * @return {string} + */ + get $defaultRecipients(): string; + /** + * Getter $includeChangesetOwners + * @return {boolean} + */ + get $includeChangesetOwners(): boolean; + /** + * Getter $includeTestOwners + * @return {boolean} + */ + get $includeTestOwners(): boolean; + /** + * Getter $includeActiveBugOwners + * @return {boolean} + */ + get $includeActiveBugOwners(): boolean; + /** + * Getter $includeCreatedBy + * @return {boolean} + */ + get $includeCreatedBy(): boolean; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js new file mode 100644 index 00000000..a13ce410 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RecipientsConfiguration = void 0; +class RecipientsConfiguration { + constructor($defaultRecipients, $includeChangesetOwners, $includeTestOwners, $includeActiveBugOwners, $includeCreatedBy) { + this.defaultRecipients = $defaultRecipients; + this.includeChangesetOwners = $includeChangesetOwners; + this.includeTestOwners = $includeTestOwners; + this.includeActiveBugOwners = $includeActiveBugOwners; + this.includeCreatedBy = $includeCreatedBy; + } + /** + * Getter $defaultRecipients + * @return {string} + */ + get $defaultRecipients() { + return this.defaultRecipients; + } + /** + * Getter $includeChangesetOwners + * @return {boolean} + */ + get $includeChangesetOwners() { + return this.includeChangesetOwners; + } + /** + * Getter $includeTestOwners + * @return {boolean} + */ + get $includeTestOwners() { + return this.includeTestOwners; + } + /** + * Getter $includeActiveBugOwners + * @return {boolean} + */ + get $includeActiveBugOwners() { + return this.includeActiveBugOwners; + } + /** + * Getter $includeCreatedBy + * @return {boolean} + */ + get $includeCreatedBy() { + return this.includeCreatedBy; + } +} +exports.RecipientsConfiguration = RecipientsConfiguration; +//# sourceMappingURL=RecipientsConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js.map new file mode 100644 index 00000000..f69f3fbe --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RecipientsConfiguration.js","sourceRoot":"","sources":["RecipientsConfiguration.ts"],"names":[],"mappings":";;;AAAA,MAAa,uBAAuB;IAOlC,YAAY,kBAA0B,EAAE,uBAAiC,EAAE,kBAA4B,EAAE,uBAAiC,EAAE,iBAA2B;QACrK,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAtDD,0DAsDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/RecipientsConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/RecipientsConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.d.ts new file mode 100644 index 00000000..3d9e3705 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.d.ts @@ -0,0 +1,27 @@ +export declare class SmtpConfiguration { + private userName; + private password; + private smtpHost; + private enableTLS; + constructor($userName: string, $password: string, $smtpHost: string, $enableTLS: boolean); + /** + * Getter $userName + * @return {string} + */ + get $userName(): string; + /** + * Getter $password + * @return {string} + */ + get $password(): string; + /** + * Getter $smtpHost + * @return {string} + */ + get $smtpHost(): string; + /** + * Getter $enableSSL + * @return {boolean} + */ + get $enableTLS(): boolean; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js new file mode 100644 index 00000000..10c87f7d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SmtpConfiguration = void 0; +class SmtpConfiguration { + constructor($userName, $password, $smtpHost, $enableTLS) { + this.userName = $userName; + this.password = $password; + this.smtpHost = $smtpHost; + this.enableTLS = $enableTLS; + } + /** + * Getter $userName + * @return {string} + */ + get $userName() { + return this.userName; + } + /** + * Getter $password + * @return {string} + */ + get $password() { + return this.password; + } + /** + * Getter $smtpHost + * @return {string} + */ + get $smtpHost() { + return this.smtpHost; + } + /** + * Getter $enableSSL + * @return {boolean} + */ + get $enableTLS() { + return this.enableTLS; + } +} +exports.SmtpConfiguration = SmtpConfiguration; +//# sourceMappingURL=SmtpConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js.map new file mode 100644 index 00000000..445b4fd3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SmtpConfiguration.js","sourceRoot":"","sources":["SmtpConfiguration.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAM5B,YAAY,SAAiB,EAAE,SAAiB,EAAE,SAAiB,EAAE,UAAmB;QACtF,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;KAGC;IACD,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA5CD,8CA4CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/SmtpConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/mail/SmtpConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.d.ts new file mode 100644 index 00000000..f5d5457a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.d.ts @@ -0,0 +1,60 @@ +import { PipelineType } from "./PipelineType"; +export declare class PipelineConfiguration { + private pipelineType; + private pipelineId; + private projectId; + private projectName; + private environmentId; + private environmentDefinitionId; + private usePreviousEnvironment; + private teamUri; + private accessKey; + private testTabLink; + constructor($pipelineType: PipelineType, $pipelineId: number, $projectId: string, $projectName: string, $environmentId: number, $environmentDefinitionId: number, $usePreviousEnvironment: boolean, $teamUri: string, $accessKey: string); + /** + * Getter $pipelineId + * @return {number} + */ + get $pipelineType(): number; + /** + * Getter $pipelineId + * @return {number} + */ + get $pipelineId(): number; + /** + * Getter $projectId + * @return {string} + */ + get $projectId(): string; + /** + * Getter $projectName + * @return {string} + */ + get $projectName(): string; + /** + * Getter $environmentId + * @return {number} + */ + get $environmentId(): number; + /** + * Getter $environmentDefinitionId + * @return {number} + */ + get $environmentDefinitionId(): number; + /** + * Getter $usePreviousEnvironment + * @return {boolean} + */ + get $usePreviousEnvironment(): boolean; + /** + * Getter $teamUri + * @return {string} + */ + get $teamUri(): string; + /** + * Getter $accessKey + * @return {string} + */ + get $accessKey(): string; + getTestTabLink(): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js new file mode 100644 index 00000000..c8844b9f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js @@ -0,0 +1,94 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PipelineConfiguration = void 0; +const PipelineType_1 = require("./PipelineType"); +const LinkHelper_1 = require("../../model/helpers/LinkHelper"); +class PipelineConfiguration { + constructor($pipelineType, $pipelineId, $projectId, $projectName, $environmentId, $environmentDefinitionId, $usePreviousEnvironment, $teamUri, $accessKey) { + this.pipelineType = $pipelineType; + this.pipelineId = $pipelineId; + this.projectId = $projectId; + this.projectName = $projectName; + this.environmentId = $environmentId; + this.environmentDefinitionId = $environmentDefinitionId; + this.usePreviousEnvironment = $usePreviousEnvironment; + this.teamUri = $teamUri; + this.accessKey = $accessKey; + } + /** + * Getter $pipelineId + * @return {number} + */ + get $pipelineType() { + return this.pipelineType; + } + /** + * Getter $pipelineId + * @return {number} + */ + get $pipelineId() { + return this.pipelineId; + } + /** + * Getter $projectId + * @return {string} + */ + get $projectId() { + return this.projectId; + } + /** + * Getter $projectName + * @return {string} + */ + get $projectName() { + return this.projectName; + } + /** + * Getter $environmentId + * @return {number} + */ + get $environmentId() { + return this.environmentId; + } + /** + * Getter $environmentDefinitionId + * @return {number} + */ + get $environmentDefinitionId() { + return this.environmentDefinitionId; + } + /** + * Getter $usePreviousEnvironment + * @return {boolean} + */ + get $usePreviousEnvironment() { + return this.usePreviousEnvironment; + } + /** + * Getter $teamUri + * @return {string} + */ + get $teamUri() { + return this.teamUri; + } + /** + * Getter $accessKey + * @return {string} + */ + get $accessKey() { + return this.accessKey; + } + getTestTabLink() { + if (this.testTabLink == null) { + if (this.pipelineType == PipelineType_1.PipelineType.Release) { + this.testTabLink = LinkHelper_1.LinkHelper.getTestTabLinkInRelease(this); + } + else if (this.pipelineType == PipelineType_1.PipelineType.Build) { + this.testTabLink = LinkHelper_1.LinkHelper.getTestTabLinkInBuild(this); + } + } + return this.testTabLink; + } +} +exports.PipelineConfiguration = PipelineConfiguration; +//# sourceMappingURL=PipelineConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js.map new file mode 100644 index 00000000..57b349db --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PipelineConfiguration.js","sourceRoot":"","sources":["PipelineConfiguration.ts"],"names":[],"mappings":";;;AAAA,iDAA8C;AAC9C,+DAA4D;AAE5D,MAAa,qBAAqB;IAYhC,YAAY,aAA2B,EACrC,WAAmB,EACnB,UAAkB,EAClB,YAAoB,EACpB,cAAsB,EACtB,wBAAgC,EAChC,uBAAgC,EAChC,QAAgB,EAChB,UAAkB;QAClB,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;QACpC,IAAI,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;QACxD,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;KAGC;IACD,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;IAGA;IACA,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;YAC5B,IAAI,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC,OAAO,EAAE;gBAC7C,IAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;aAC7D;iBAAM,IAAI,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC,KAAK,EAAE;gBAClD,IAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;aAC3D;SACF;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAlHD,sDAkHC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.d.ts new file mode 100644 index 00000000..09b23178 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.d.ts @@ -0,0 +1,4 @@ +export declare enum PipelineType { + Build = 0, + Release = 1 +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js new file mode 100644 index 00000000..630d9589 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PipelineType = void 0; +var PipelineType; +(function (PipelineType) { + PipelineType[PipelineType["Build"] = 0] = "Build"; + PipelineType[PipelineType["Release"] = 1] = "Release"; +})(PipelineType = exports.PipelineType || (exports.PipelineType = {})); +//# sourceMappingURL=PipelineType.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js.map new file mode 100644 index 00000000..a7c978d9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PipelineType.js","sourceRoot":"","sources":["PipelineType.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,iDAAK,CAAA;IACL,qDAAO,CAAA;AACT,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/pipeline/PipelineType.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/pipeline/PipelineType.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.d.ts new file mode 100644 index 00000000..f5970674 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.d.ts @@ -0,0 +1,5 @@ +export declare enum GroupTestResultsBy { + Priority = 0, + Run = 1, + Team = 2 +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js new file mode 100644 index 00000000..e5a1d7b0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GroupTestResultsBy = void 0; +var GroupTestResultsBy; +(function (GroupTestResultsBy) { + GroupTestResultsBy[GroupTestResultsBy["Priority"] = 0] = "Priority"; + GroupTestResultsBy[GroupTestResultsBy["Run"] = 1] = "Run"; + GroupTestResultsBy[GroupTestResultsBy["Team"] = 2] = "Team"; +})(GroupTestResultsBy = exports.GroupTestResultsBy || (exports.GroupTestResultsBy = {})); +//# sourceMappingURL=GroupTestResultsBy.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js.map new file mode 100644 index 00000000..fa15639d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js.map @@ -0,0 +1 @@ +{"version":3,"file":"GroupTestResultsBy.js","sourceRoot":"","sources":["GroupTestResultsBy.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC5B,mEAAY,CAAA;IACZ,yDAAG,CAAA;IACH,2DAAI,CAAA;AACN,CAAC,EAJW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAI7B"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/GroupTestResultsBy.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/GroupTestResultsBy.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.d.ts new file mode 100644 index 00000000..afcfadd4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.d.ts @@ -0,0 +1,35 @@ +import { GroupTestResultsBy } from "./GroupTestResultsBy"; +import { TestResultsConfiguration } from "./TestResultsConfiguration"; +export declare class ReportDataConfiguration { + private includeCommits; + private includeOthersInTotal; + private includeEnvironmentInfo; + private groupTestSummaryBy; + private testResultsConfig; + constructor($includeCommits: boolean, $includeOthersInTotal: boolean, $includeEnvironmentInfo: boolean, $groupTestSummaryBy: GroupTestResultsBy[], $testResultsConfig: TestResultsConfiguration); + /** + * Getter $includeCommits + * @return {boolean} + */ + get $includeCommits(): boolean; + /** + * Getter $includeOthersInTotal + * @return {boolean} + */ + get $includeOthersInTotal(): boolean; + /** + * Getter $includeEnvironmentInfo + * @return {boolean} + */ + get $includeEnvironmentInfo(): boolean; + /** + * Getter $groupTestSummaryBy + * @return {GroupTestResultsBy[]} + */ + get $groupTestSummaryBy(): GroupTestResultsBy[]; + /** + * Getter $testResultsConfig + * @return {TestResultsConfiguration} + */ + get $testResultsConfig(): TestResultsConfiguration; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js new file mode 100644 index 00000000..770aad71 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportDataConfiguration = void 0; +class ReportDataConfiguration { + constructor($includeCommits, $includeOthersInTotal, $includeEnvironmentInfo, $groupTestSummaryBy, $testResultsConfig) { + this.includeCommits = $includeCommits; + this.includeOthersInTotal = $includeOthersInTotal; + this.includeEnvironmentInfo = $includeEnvironmentInfo; + this.groupTestSummaryBy = $groupTestSummaryBy; + this.testResultsConfig = $testResultsConfig; + } + /** + * Getter $includeCommits + * @return {boolean} + */ + get $includeCommits() { + return this.includeCommits; + } + /** + * Getter $includeOthersInTotal + * @return {boolean} + */ + get $includeOthersInTotal() { + return this.includeOthersInTotal; + } + /** + * Getter $includeEnvironmentInfo + * @return {boolean} + */ + get $includeEnvironmentInfo() { + return this.includeEnvironmentInfo; + } + /** + * Getter $groupTestSummaryBy + * @return {GroupTestResultsBy[]} + */ + get $groupTestSummaryBy() { + return this.groupTestSummaryBy; + } + /** + * Getter $testResultsConfig + * @return {TestResultsConfiguration} + */ + get $testResultsConfig() { + return this.testResultsConfig; + } +} +exports.ReportDataConfiguration = ReportDataConfiguration; +//# sourceMappingURL=ReportDataConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js.map new file mode 100644 index 00000000..2b4825c2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportDataConfiguration.js","sourceRoot":"","sources":["ReportDataConfiguration.ts"],"names":[],"mappings":";;;AAGA,MAAa,uBAAuB;IAYlC,YAAY,eAAwB,EAAE,qBAA8B,EAAE,uBAAgC,EAAE,mBAAyC,EAAE,kBAA4C;QAC7L,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;QACtC,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC;QAClD,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AA3DD,0DA2DC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/ReportDataConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/ReportDataConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.d.ts new file mode 100644 index 00000000..81073e1f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.d.ts @@ -0,0 +1,6 @@ +export declare enum SendMailCondition { + Always = 0, + OnFailure = 1, + OnSuccess = 2, + OnNewFailuresOnly = 3 +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js new file mode 100644 index 00000000..faa08b3e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SendMailCondition = void 0; +var SendMailCondition; +(function (SendMailCondition) { + SendMailCondition[SendMailCondition["Always"] = 0] = "Always"; + SendMailCondition[SendMailCondition["OnFailure"] = 1] = "OnFailure"; + SendMailCondition[SendMailCondition["OnSuccess"] = 2] = "OnSuccess"; + SendMailCondition[SendMailCondition["OnNewFailuresOnly"] = 3] = "OnNewFailuresOnly"; +})(SendMailCondition = exports.SendMailCondition || (exports.SendMailCondition = {})); +//# sourceMappingURL=SendMailCondition.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js.map new file mode 100644 index 00000000..36ca9571 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SendMailCondition.js","sourceRoot":"","sources":["SendMailCondition.ts"],"names":[],"mappings":";;;AAAA,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,6DAAU,CAAA;IACV,mEAAS,CAAA;IACT,mEAAS,CAAA;IACT,mFAAiB,CAAA;AACnB,CAAC,EALW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAK5B"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/SendMailCondition.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/SendMailCondition.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.d.ts new file mode 100644 index 00000000..0a73878c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.d.ts @@ -0,0 +1,46 @@ +import { GroupTestResultsBy } from "./GroupTestResultsBy"; +export declare class TestResultsConfiguration { + private includeFailedTests; + private includePassedTests; + private includeInconclusiveTests; + private includeNotExecutedTests; + private includeOtherTests; + private groupTestResultsBy; + private maxItemsToShow; + constructor($includeFailedTests: boolean, $includePassedTests: boolean, $includeInconclusiveTests: boolean, $includeNotExecutedTests: boolean, $includeOtherTests: boolean, $groupTestResultsBy: GroupTestResultsBy, $maxItemsToShow: number); + /** + * Getter $includeFailedTests + * @return {boolean} + */ + get $includeFailedTests(): boolean; + /** + * Getter $includePassedTests + * @return {boolean} + */ + get $includePassedTests(): boolean; + /** + * Getter $includeInconclusiveTests + * @return {boolean} + */ + get $includeInconclusiveTests(): boolean; + /** + * Getter $includeNotExecutedTests + * @return {boolean} + */ + get $includeNotExecutedTests(): boolean; + /** + * Getter $includeOtherTests + * @return {boolean} + */ + get $includeOtherTests(): boolean; + /** + * Getter $groupTestResultsBy + * @return {GroupTestResultsBy} + */ + get $groupTestResultsBy(): GroupTestResultsBy; + /** + * Getter $maxItemsToShow + * @return {number} + */ + get $maxItemsToShow(): number; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js new file mode 100644 index 00000000..24fb9a79 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js @@ -0,0 +1,65 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsConfiguration = void 0; +class TestResultsConfiguration { + constructor($includeFailedTests, $includePassedTests, $includeInconclusiveTests, $includeNotExecutedTests, $includeOtherTests, $groupTestResultsBy, $maxItemsToShow) { + this.includeFailedTests = $includeFailedTests; + this.includePassedTests = $includePassedTests; + this.includeInconclusiveTests = $includeInconclusiveTests; + this.includeNotExecutedTests = $includeNotExecutedTests; + this.includeOtherTests = $includeOtherTests; + this.groupTestResultsBy = $groupTestResultsBy; + this.maxItemsToShow = $maxItemsToShow; + } + /** + * Getter $includeFailedTests + * @return {boolean} + */ + get $includeFailedTests() { + return this.includeFailedTests; + } + /** + * Getter $includePassedTests + * @return {boolean} + */ + get $includePassedTests() { + return this.includePassedTests; + } + /** + * Getter $includeInconclusiveTests + * @return {boolean} + */ + get $includeInconclusiveTests() { + return this.includeInconclusiveTests; + } + /** + * Getter $includeNotExecutedTests + * @return {boolean} + */ + get $includeNotExecutedTests() { + return this.includeNotExecutedTests; + } + /** + * Getter $includeOtherTests + * @return {boolean} + */ + get $includeOtherTests() { + return this.includeOtherTests; + } + /** + * Getter $groupTestResultsBy + * @return {GroupTestResultsBy} + */ + get $groupTestResultsBy() { + return this.groupTestResultsBy; + } + /** + * Getter $maxItemsToShow + * @return {number} + */ + get $maxItemsToShow() { + return this.maxItemsToShow; + } +} +exports.TestResultsConfiguration = TestResultsConfiguration; +//# sourceMappingURL=TestResultsConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js.map new file mode 100644 index 00000000..0e9bbf3b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultsConfiguration.js","sourceRoot":"","sources":["TestResultsConfiguration.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAwB;IASnC,YAAY,mBAA4B,EAAE,mBAA4B,EAAE,yBAAkC,EAAE,wBAAiC,EAAE,kBAA2B,EAAE,mBAAuC,EAAE,eAAuB;QAC1O,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,wBAAwB,GAAG,yBAAyB,CAAC;QAC1D,IAAI,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;QACxD,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,yBAAyB;QAClC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AA1ED,4DA0EC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/TestResultsConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/config/report/TestResultsConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.d.ts new file mode 100644 index 00000000..9b6a8d92 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class DataProviderError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js new file mode 100644 index 00000000..bfb8da0a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DataProviderError = void 0; +const ReportError_1 = require("./ReportError"); +class DataProviderError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = DataProviderError.name; + } +} +exports.DataProviderError = DataProviderError; +//# sourceMappingURL=DataProviderError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js.map new file mode 100644 index 00000000..c033f135 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DataProviderError.js","sourceRoot":"","sources":["DataProviderError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,iBAAkB,SAAQ,yBAAW;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;IACrC,CAAC;CACF;AALD,8CAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/DataProviderError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/DataProviderError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.d.ts new file mode 100644 index 00000000..808fd744 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class InputError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js new file mode 100644 index 00000000..14470419 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InputError = void 0; +const ReportError_1 = require("./ReportError"); +class InputError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = InputError.name; + } +} +exports.InputError = InputError; +//# sourceMappingURL=InputError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js.map new file mode 100644 index 00000000..f852e88d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"InputError.js","sourceRoot":"","sources":["InputError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,UAAW,SAAQ,yBAAW;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AALD,gCAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/InputError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/InputError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.d.ts new file mode 100644 index 00000000..9dfa8656 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class InvalidTestResultDataError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js new file mode 100644 index 00000000..d29437eb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InvalidTestResultDataError = void 0; +const ReportError_1 = require("./ReportError"); +class InvalidTestResultDataError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = InvalidTestResultDataError.name; + } +} +exports.InvalidTestResultDataError = InvalidTestResultDataError; +//# sourceMappingURL=InvalidTestResultDataError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js.map new file mode 100644 index 00000000..8dc89501 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"InvalidTestResultDataError.js","sourceRoot":"","sources":["InvalidTestResultDataError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,0BAA2B,SAAQ,yBAAW;IACzD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC;IAC9C,CAAC;CACF;AALD,gEAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.d.ts new file mode 100644 index 00000000..08659da2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class MailError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js new file mode 100644 index 00000000..d068d533 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MailError = void 0; +const ReportError_1 = require("./ReportError"); +class MailError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = MailError.name; + } +} +exports.MailError = MailError; +//# sourceMappingURL=MailError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js.map new file mode 100644 index 00000000..bf6960bb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MailError.js","sourceRoot":"","sources":["MailError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,SAAU,SAAQ,yBAAW;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF;AALD,8BAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/MailError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/MailError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.d.ts new file mode 100644 index 00000000..b4d47a5c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class MissingDataError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js new file mode 100644 index 00000000..7545c9e6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MissingDataError = void 0; +const ReportError_1 = require("./ReportError"); +class MissingDataError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = MissingDataError.name; + } +} +exports.MissingDataError = MissingDataError; +//# sourceMappingURL=MissingDataError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js.map new file mode 100644 index 00000000..5977fecc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MissingDataError.js","sourceRoot":"","sources":["MissingDataError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,gBAAiB,SAAQ,yBAAW;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AALD,4CAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/MissingDataError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/MissingDataError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.d.ts new file mode 100644 index 00000000..9ab6105d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class PipelineNotFoundError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js new file mode 100644 index 00000000..8ce54ee2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PipelineNotFoundError = void 0; +const ReportError_1 = require("./ReportError"); +class PipelineNotFoundError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = "PipelineNotFoundError"; + } +} +exports.PipelineNotFoundError = PipelineNotFoundError; +//# sourceMappingURL=PipelineNotFoundError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js.map new file mode 100644 index 00000000..1c02cf11 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PipelineNotFoundError.js","sourceRoot":"","sources":["PipelineNotFoundError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,qBAAsB,SAAQ,yBAAW;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/PipelineNotFoundError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/PipelineNotFoundError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.d.ts new file mode 100644 index 00000000..40ff69a1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class PostProcessorError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js new file mode 100644 index 00000000..0402641d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PostProcessorError = void 0; +const ReportError_1 = require("./ReportError"); +class PostProcessorError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = PostProcessorError.name; + } +} +exports.PostProcessorError = PostProcessorError; +//# sourceMappingURL=PostProcessorError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js.map new file mode 100644 index 00000000..7c84fb52 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PostProcessorError.js","sourceRoot":"","sources":["PostProcessorError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,kBAAmB,SAAQ,yBAAW;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACtC,CAAC;CACF;AALD,gDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/PostProcessorError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/PostProcessorError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.d.ts new file mode 100644 index 00000000..aa924ae6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.d.ts @@ -0,0 +1,6 @@ +export declare abstract class ReportError extends Error { + innerError: any; + constructor(message: string); + getMessage(): string; + static HandleError(err: Error, rethrow?: boolean): void; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js new file mode 100644 index 00000000..ab69ab25 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportError = void 0; +const util_1 = require("util"); +class ReportError extends Error { + constructor(message) { + super(message); + } + getMessage() { + const stack = util_1.isNullOrUndefined(this.innerError) || util_1.isNullOrUndefined(this.innerError.stack) ? this.stack : + `${this.stack}\r\nInnerError:${this.innerError.message}: ${this.innerError.stack}`; + return `${this.name}: ${this.message}\r\n ${stack}`; + } + static HandleError(err, rethrow = false) { + if (err instanceof ReportError) { + console.error(err.getMessage()); + } + else { + console.error(err); + } + if (rethrow) { + throw err; + } + } +} +exports.ReportError = ReportError; +//# sourceMappingURL=ReportError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js.map new file mode 100644 index 00000000..505bc060 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportError.js","sourceRoot":"","sources":["ReportError.ts"],"names":[],"mappings":";;;AAAA,+BAAyC;AAEzC,MAAsB,WAAY,SAAQ,KAAK;IAE7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAEM,UAAU;QACf,MAAM,KAAK,GAAG,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzG,GAAG,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACpF,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,QAAQ,KAAK,EAAE,CAAC;IACtD,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,GAAU,EAAE,UAAmB,KAAK;QAC5D,IAAG,GAAG,YAAY,WAAW,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAE,GAAmB,CAAC,UAAU,EAAE,CAAC,CAAC;SAClD;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpB;QAED,IAAG,OAAO,EAAE;YACV,MAAM,GAAG,CAAC;SACX;IACH,CAAC;CACF;AAvBD,kCAuBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/ReportError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/exceptions/ReportError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/EmailTemplate.xslt b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/EmailTemplate.xslt similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/EmailTemplate.xslt rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/EmailTemplate.xslt diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.d.ts new file mode 100644 index 00000000..9c4145c4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.d.ts @@ -0,0 +1,6 @@ +import { IHTMLReportCreator } from './IHTMLReportCreator'; +import { Report } from '../model/Report'; +import { ReportConfiguration } from '../config/ReportConfiguration'; +export declare class HTMLReportCreator implements IHTMLReportCreator { + createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js new file mode 100644 index 00000000..859c6c18 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HTMLReportCreator = void 0; +const EmailReportViewModel_1 = require("../model/viewmodel/EmailReportViewModel"); +const fs = require("fs"); +const o2x = require('object-to-xml'); +const xsltProcessor = require("xslt-processor"); +const { xmlParse, xsltProcess } = xsltProcessor; +class HTMLReportCreator { + createHtmlReport(report, reportConfiguration) { + const currDir = __dirname; + console.log(`CurrentDir: ${currDir}`); + var xsltTemplatePath = `${currDir}\\EmailTemplate.xslt`; + console.log("Loading Email Template: " + xsltTemplatePath); + // Create a view model object before serialize to xml + const reportViewModel = new EmailReportViewModel_1.EmailReportViewModel(report, reportConfiguration); + // Serialize gathered data into xml + const xmlString = "" + o2x(reportViewModel) + ""; + // Read XSLT email template + const buffer = fs.readFileSync(xsltTemplatePath); + // Parse the xml string as XmlDocument/Node + const xmlDoc = xmlParse(xmlString, "text/xml"); + // Parse XSLT as XMLDocument + const xsltDoc = xmlParse(buffer.toString(), "application/xml"); + // Fill the XSLT document template with the xml doc data + let outXmlString = xsltProcess(xmlDoc, xsltDoc); + // XML parsing changes
to special chars if they are part of xml nodevalues. Do string replace to fix the jankiness for HTML. + outXmlString = outXmlString.split("<br/>").join("
"); + return outXmlString; + } +} +exports.HTMLReportCreator = HTMLReportCreator; +//# sourceMappingURL=HTMLReportCreator.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js.map new file mode 100644 index 00000000..a6461dec --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"HTMLReportCreator.js","sourceRoot":"","sources":["HTMLReportCreator.ts"],"names":[],"mappings":";;;AAAA,kFAA+E;AAI/E,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AACrC,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAChD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;AAEhD,MAAa,iBAAiB;IAE5B,gBAAgB,CAAC,MAAc,EAAE,mBAAwC;QACvE,MAAM,OAAO,GAAG,SAAS,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QACtC,IAAI,gBAAgB,GAAG,GAAG,OAAO,sBAAsB,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,gBAAgB,CAAC,CAAC;QAE3D,qDAAqD;QACrD,MAAM,eAAe,GAAG,IAAI,2CAAoB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC9E,oCAAoC;QACpC,MAAM,SAAS,GAAW,wBAAwB,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,yBAAyB,CAAC;QACtG,4BAA4B;QAC5B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACjD,2CAA2C;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC/C,4BAA4B;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAC/D,wDAAwD;QACxD,IAAI,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,kIAAkI;QAClI,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAxBD,8CAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/HTMLReportCreator.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/HTMLReportCreator.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.d.ts new file mode 100644 index 00000000..9ceab733 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.d.ts @@ -0,0 +1,5 @@ +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +export interface IHTMLReportCreator { + createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js new file mode 100644 index 00000000..f626ba20 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IHTMLReportCreator.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js.map new file mode 100644 index 00000000..9ec8a16e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IHTMLReportCreator.js","sourceRoot":"","sources":["IHTMLReportCreator.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js new file mode 100644 index 00000000..239f955d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js @@ -0,0 +1,67 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const ReportConfiguration_1 = require("./config/ReportConfiguration"); +const ConfigurationProvider_1 = require("./config/ConfigurationProvider"); +const ReportManager_1 = require("./ReportManager"); +const ReportProvider_1 = require("./providers/ReportProvider"); +const DataProviderFactory_1 = require("./providers/DataProviderFactory"); +const HTMLReportCreator_1 = require("./htmlreport/HTMLReportCreator"); +const EmailSender_1 = require("./EmailSender"); +const ReportError_1 = require("./exceptions/ReportError"); +const TelemetryLogger_1 = require("./telemetry/TelemetryLogger"); +function run() { + return __awaiter(this, void 0, void 0, function* () { + try { + console.log('Node Version: ' + process.version); + const configProvider = new ConfigurationProvider_1.ConfigurationProvider(); + const reportConfiguration = new ReportConfiguration_1.ReportConfiguration(configProvider); + const reportProvider = new ReportProvider_1.ReportProvider(new DataProviderFactory_1.DataProviderFactory(configProvider.getPipelineConfiguration())); + // Log telemetry: Task Inputs and Configuration + TelemetryLogger_1.TelemetryLogger.LogTaskConfig(reportConfiguration); + const reportManager = new ReportManager_1.ReportManager(reportProvider, new HTMLReportCreator_1.HTMLReportCreator(), new EmailSender_1.EmailSender()); + const mailSent = yield reportManager.sendReportAsync(reportConfiguration); + if (mailSent) { + // Wait for 10 sec and timeout + let val = yield Promise.race([sleep(10000), setEmailSentVariable(mailSent)]); + if (!val) { + console.log("Unable to set variable value in 10 sec. Exiting task."); + } + } + } + catch (err) { + if (err instanceof ReportError_1.ReportError) { + console.log(err.getMessage()); + } + else { + console.log(err); + } + // Fail task + throw err; + } + finally { + console.log("Task Processing Complete."); + } + }); +} +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms, false)); +} +function setEmailSentVariable(mailSent) { + return __awaiter(this, void 0, void 0, function* () { + console.log("Setting EmailReportTask.EmailSent Variable value."); + console.log(`##vso[task.setvariable variable=EmailReportTask.EmailSent;]${mailSent}`); + console.log(`EmailReportTask.EmailSent Variable value set as ${mailSent}`); + return true; + }); +} +run(); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js.map new file mode 100644 index 00000000..c285d1a8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,sEAAmE;AACnE,0EAAuE;AACvE,mDAAgD;AAChD,+DAA4D;AAC5D,yEAAsE;AACtE,sEAAmE;AACnE,+CAA4C;AAC5C,0DAAuD;AACvD,iEAA8D;AAE9D,SAAe,GAAG;;QAChB,IAAI;YAEF,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAEhD,MAAM,cAAc,GAAG,IAAI,6CAAqB,EAAE,CAAC;YACnD,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,CAAC,cAAc,CAAC,CAAC;YACpE,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,yCAAmB,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAE9G,+CAA+C;YAC/C,iCAAe,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YAEnD,MAAM,aAAa,GAAG,IAAI,6BAAa,CACrC,cAAc,EACd,IAAI,qCAAiB,EAAE,EACvB,IAAI,yBAAW,EAAE,CAAC,CAAC;YAErB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YAC1E,IAAG,QAAQ,EAAE;gBACX,8BAA8B;gBAC9B,IAAI,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAG,CAAC,GAAG,EAAE;oBACP,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;iBACtE;aACF;SACF;QACD,OAAO,GAAG,EAAE;YACV,IAAI,GAAG,YAAY,yBAAW,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;aAC/B;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClB;YACD,YAAY;YACZ,MAAM,GAAG,CAAC;SACX;gBACO;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;SAC1C;IACH,CAAC;CAAA;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAe,oBAAoB,CAAC,QAAiB;;QACnD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,8DAA8D,QAAQ,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;CAAA;AAED,GAAG,EAAE,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/index.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/index.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.d.ts new file mode 100644 index 00000000..a84f16d5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.d.ts @@ -0,0 +1,25 @@ +import { Build, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { Report } from "./Report"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; +import { PhaseModel } from "./PhaseModel"; +import { ChangeModel } from "./ChangeModel"; +export declare class BuildReport extends Report { + private build; + private timeline; + private lastCompletedBuild; + private lastCompletedTimeline; + setBuildData($build: Build, $timeline: Timeline, $lastCompletedBuild: Build, $lastCompletedTimeline: Timeline, $phases: PhaseModel[], $changes: ChangeModel[]): void; + hasPrevGotSameFailures(): boolean; + hasFailedTasks(): boolean; + hasPrevFailedTasks(): boolean; + arePrevFailedTasksSame(): boolean; + getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; + getEnvironmentStatus(): string; + getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel; + getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; + hasCanceledPhases(): boolean; + private timelineHasFailedTasks; + private getTasksByResultinTimeline; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js new file mode 100644 index 00000000..90c7aa30 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js @@ -0,0 +1,79 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildReport = void 0; +const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); +const Report_1 = require("./Report"); +const util_1 = require("util"); +const PipelineConfiguration_1 = require("../config/pipeline/PipelineConfiguration"); +const PipelineType_1 = require("../config/pipeline/PipelineType"); +const BuildReferenceViewModel_1 = require("./viewmodel/BuildReferenceViewModel"); +class BuildReport extends Report_1.Report { + setBuildData($build, $timeline, $lastCompletedBuild, $lastCompletedTimeline, $phases, $changes) { + this.build = $build; + this.timeline = $timeline; + this.lastCompletedBuild = $lastCompletedBuild; + this.lastCompletedTimeline = $lastCompletedTimeline; + this.phases = $phases; + this.associatedChanges = $changes; + } + hasPrevGotSameFailures() { + if (this.lastCompletedBuild == null) { + return false; + } + console.log(`Using Last Completed Build: '${this.lastCompletedBuild.id}'.`); + if (this.lastCompletedBuild.id > this.build.id) { + // We are in a situation where current build completed latter compared to the newer one + // Newer one would have already evaluated the failures and sent a mail to committers anyway + // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer + // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line + return true; + } + return null; + } + hasFailedTasks() { + return this.timelineHasFailedTasks(this.timeline); + } + hasPrevFailedTasks() { + return this.timelineHasFailedTasks(this.lastCompletedTimeline); + } + arePrevFailedTasksSame() { + var prevfailedTask = this.getTasksByResultinTimeline(this.lastCompletedTimeline, BuildInterfaces_1.TaskResult.Failed)[0]; + var currentFailedTask = this.getTasksByResultinTimeline(this.timeline, BuildInterfaces_1.TaskResult.Failed)[0]; + // if both releases failed without executing any tasks, then they can be null + // otherwise, use name matching + return (prevfailedTask == null && currentFailedTask == null) + || (!util_1.isNullOrUndefined(prevfailedTask) && !util_1.isNullOrUndefined(currentFailedTask) && prevfailedTask.name.toLowerCase() == currentFailedTask.name.toLowerCase()); + } + getPrevConfig(config) { + var buildConfig = new PipelineConfiguration_1.PipelineConfiguration(PipelineType_1.PipelineType.Build, this.lastCompletedBuild.id, config.$projectId, config.$projectName, null, null, config.$usePreviousEnvironment, config.$teamUri, config.$accessKey); + return buildConfig; + } + getEnvironmentStatus() { + if (this.hasFailedTasks()) { + return "Failed"; + } + else if (this.getTasksByResultinTimeline(this.timeline, BuildInterfaces_1.TaskResult.SucceededWithIssues).length > 0) { + return "Partially Succeeded"; + } + else { + return "Succeeded"; + } + } + getPipelineViewModel(config) { + return new BuildReferenceViewModel_1.BuildReferenceViewModel(config, null, this.build); + } + getArtifactViewModels(config) { + return []; + } + hasCanceledPhases() { + return false; + } + timelineHasFailedTasks(timeLine) { + return this.getTasksByResultinTimeline(timeLine, BuildInterfaces_1.TaskResult.Failed).length > 0; + } + getTasksByResultinTimeline(timeLine, taskResult) { + return this.timeline == null || this.timeline.records == null ? [] : this.timeline.records.filter(r => r.result == taskResult); + } +} +exports.BuildReport = BuildReport; +//# sourceMappingURL=BuildReport.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js.map new file mode 100644 index 00000000..3811e9f5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildReport.js","sourceRoot":"","sources":["BuildReport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/BuildReport.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/BuildReport.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.d.ts new file mode 100644 index 00000000..72f457c1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.d.ts @@ -0,0 +1,34 @@ +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +export declare class ChangeModel { + private id; + private author; + private location; + private timeStamp; + private message; + constructor($id: string, $author: IdentityRef, $location: string, $timeStamp: Date, $message: string); + /** + * Getter $id + * @return {string} + */ + get $id(): string; + /** + * Getter $author + * @return {IdentityRef} + */ + get $author(): IdentityRef; + /** + * Getter $location + * @return {string} + */ + get $location(): string; + /** + * Getter $timeStamp + * @return {Date} + */ + get $timeStamp(): Date; + /** + * Getter $message + * @return {string} + */ + get $message(): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js new file mode 100644 index 00000000..615c8481 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ChangeModel = void 0; +class ChangeModel { + constructor($id, $author, $location, $timeStamp, $message) { + this.id = $id; + this.author = $author; + this.location = $location; + this.timeStamp = $timeStamp; + this.message = $message; + } + /** + * Getter $id + * @return {string} + */ + get $id() { + return this.id; + } + /** + * Getter $author + * @return {IdentityRef} + */ + get $author() { + return this.author; + } + /** + * Getter $location + * @return {string} + */ + get $location() { + return this.location; + } + /** + * Getter $timeStamp + * @return {Date} + */ + get $timeStamp() { + return this.timeStamp; + } + /** + * Getter $message + * @return {string} + */ + get $message() { + return this.message; + } +} +exports.ChangeModel = ChangeModel; +//# sourceMappingURL=ChangeModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js.map new file mode 100644 index 00000000..590feb10 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ChangeModel.js","sourceRoot":"","sources":["ChangeModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,WAAW;IAQtB,YAAY,GAAW,EAAE,OAAoB,EAAE,SAAiB,EAAE,UAAgB,EAAE,QAAgB;QAClG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAvDD,kCAuDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ChangeModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ChangeModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.d.ts new file mode 100644 index 00000000..11185df1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.d.ts @@ -0,0 +1,15 @@ +export declare class IssueModel { + private message; + private issueType; + constructor($issueType: string, $message: string); + /** + * Getter $message + * @return {string} + */ + get $message(): string; + /** + * Getter $issueType + * @return {string} + */ + get $issueType(): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js new file mode 100644 index 00000000..957d866e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IssueModel = void 0; +class IssueModel { + constructor($issueType, $message) { + this.message = $message; + this.issueType = $issueType; + } + /** + * Getter $message + * @return {string} + */ + get $message() { + return this.message; + } + /** + * Getter $issueType + * @return {string} + */ + get $issueType() { + return this.issueType; + } +} +exports.IssueModel = IssueModel; +//# sourceMappingURL=IssueModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js.map new file mode 100644 index 00000000..e1100e93 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IssueModel.js","sourceRoot":"","sources":["IssueModel.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;IAKrB,YAAY,UAAkB,EAAE,QAAgB;QAC9C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAzBD,gCAyBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/IssueModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/IssueModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.d.ts new file mode 100644 index 00000000..c9fd7b75 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.d.ts @@ -0,0 +1,30 @@ +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { TaskModel } from "./TaskModel"; +import { IssueModel } from "./IssueModel"; +export declare class JobModel { + private tasks; + private jobStatus; + private issues; + private jobName; + constructor($jobName: string, $jobStatus: TaskStatus, $issues: IssueModel[], $tasks: TaskModel[]); + /** + * Getter $jobName + * @return {string} + */ + get $jobName(): string; + /** + * Getter $issues + * @return {IssueModel[]} + */ + get $issues(): IssueModel[]; + /** + * Getter $tasks + * @return {TaskModel[]} + */ + get $tasks(): TaskModel[]; + /** + * Getter $jobStatus + * @return {TaskStatus} + */ + get $jobStatus(): TaskStatus; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js new file mode 100644 index 00000000..8c8162b7 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JobModel = void 0; +class JobModel { + constructor($jobName, $jobStatus, $issues, $tasks) { + this.tasks = $tasks; + this.jobStatus = $jobStatus; + this.issues = $issues; + this.jobName = $jobName; + } + /** + * Getter $jobName + * @return {string} + */ + get $jobName() { + return this.jobName; + } + /** + * Getter $issues + * @return {IssueModel[]} + */ + get $issues() { + return this.issues; + } + /** + * Getter $tasks + * @return {TaskModel[]} + */ + get $tasks() { + return this.tasks; + } + /** + * Getter $jobStatus + * @return {TaskStatus} + */ + get $jobStatus() { + return this.jobStatus; + } +} +exports.JobModel = JobModel; +//# sourceMappingURL=JobModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js.map new file mode 100644 index 00000000..600b4903 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"JobModel.js","sourceRoot":"","sources":["JobModel.ts"],"names":[],"mappings":";;;AAIA,MAAa,QAAQ;IAOnB,YAAY,QAAgB,EAAE,UAAsB,EAAE,OAAqB,EAAE,MAAmB;QAC9F,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACD,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;KAGC;IACD,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA7CD,4BA6CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/JobModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/JobModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.d.ts new file mode 100644 index 00000000..d99f19bd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.d.ts @@ -0,0 +1,28 @@ +import { JobModel } from "./JobModel"; +export declare class PhaseModel { + private name; + private jobs; + private status; + private rank; + constructor($name: string, $jobs: JobModel[], $status: string, $rank: number); + /** + * Getter $name + * @return {string} + */ + get $name(): string; + /** + * Getter $jobs + * @return {JobModel[]} + */ + get $jobs(): JobModel[]; + /** + * Getter $status + * @return {string} + */ + get $status(): string; + /** + * Getter $rank + * @return {number} + */ + get $rank(): number; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js new file mode 100644 index 00000000..28608efa --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PhaseModel = void 0; +class PhaseModel { + constructor($name, $jobs, $status, $rank) { + this.name = $name; + this.jobs = $jobs; + this.status = $status; + this.rank = $rank; + } + /** + * Getter $name + * @return {string} + */ + get $name() { + return this.name; + } + /** + * Getter $jobs + * @return {JobModel[]} + */ + get $jobs() { + return this.jobs; + } + /** + * Getter $status + * @return {string} + */ + get $status() { + return this.status; + } + /** + * Getter $rank + * @return {number} + */ + get $rank() { + return this.rank; + } +} +exports.PhaseModel = PhaseModel; +//# sourceMappingURL=PhaseModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js.map new file mode 100644 index 00000000..18d51840 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PhaseModel.js","sourceRoot":"","sources":["PhaseModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAOrB,YAAY,KAAa,EAAE,KAAiB,EAAE,OAAe,EAAE,KAAa;QAC1E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AA7CD,gCA6CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/PhaseModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/PhaseModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.d.ts new file mode 100644 index 00000000..69da9784 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.d.ts @@ -0,0 +1,51 @@ +import { Report } from "./Report"; +import { Artifact, Release, ReleaseEnvironment, ReleaseTask } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { ChangeModel } from "./ChangeModel"; +import { PhaseModel } from "./PhaseModel"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; +export declare class ReleaseReport extends Report { + private artifacts; + private release; + private environment; + private lastCompletedRelease; + private lastCompletedEnvironment; + setReleaseData($release: Release, $environment: ReleaseEnvironment, $lastCompletedRelease: Release, $phases: PhaseModel[], $changes: ChangeModel[], $lastCompletedEnvironment?: ReleaseEnvironment): void; + /** + * Getter $artifacts + * @return {Artifact[]} + */ + get $artifacts(): Artifact[]; + /** + * Getter $release + * @return {Release} + */ + get $release(): Release; + /** + * Getter $environment + * @return {ReleaseEnvironment} + */ + get $environment(): ReleaseEnvironment; + /** + * Getter $lastCompletedRelease + * @return {Release} + */ + get $lastCompletedRelease(): Release; + /** + * Getter $lastCompletedEnvironment + * @return {ReleaseEnvironment} + */ + get $lastCompletedEnvironment(): ReleaseEnvironment; + hasPrevGotSameFailures(): boolean; + hasFailedTasks(): boolean; + hasPrevFailedTasks(): boolean; + arePrevFailedTasksSame(): boolean; + getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; + getEnvironmentStatus(): string; + private hasPartiallySucceededTasks; + hasCanceledPhases(): boolean; + getPipelineViewModel(config: PipelineConfiguration): ReleaseViewModel; + getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; + getReleaseTasks(source: ReleaseEnvironment): ReleaseTask[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js new file mode 100644 index 00000000..6f58a957 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js @@ -0,0 +1,179 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseReport = void 0; +const Report_1 = require("./Report"); +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const PipelineConfiguration_1 = require("../config/pipeline/PipelineConfiguration"); +const ArtifactViewModel_1 = require("./viewmodel/ArtifactViewModel"); +const ReleaseViewModel_1 = require("./viewmodel/ReleaseViewModel"); +const util_1 = require("util"); +class ReleaseReport extends Report_1.Report { + constructor() { + super(...arguments); + this.artifacts = []; + } + setReleaseData($release, $environment, $lastCompletedRelease, $phases, $changes, $lastCompletedEnvironment) { + this.artifacts = $release.artifacts == null ? [] : $release.artifacts; + this.createdBy = $release.createdBy; + this.phases = $phases; + this.associatedChanges = $changes; + this.release = $release; + this.environment = $environment; + this.lastCompletedRelease = $lastCompletedRelease; + if ($lastCompletedEnvironment == null) { + if ($lastCompletedRelease != null && $lastCompletedRelease.environments != null) { + var lastEnvironments = $lastCompletedRelease.environments.filter(e => e.definitionEnvironmentId == $environment.definitionEnvironmentId); + if (lastEnvironments != null && lastEnvironments.length > 0) { + this.lastCompletedEnvironment = lastEnvironments[0]; + } + } + } + else { + this.lastCompletedEnvironment = $lastCompletedEnvironment; + } + } + /** + * Getter $artifacts + * @return {Artifact[]} + */ + get $artifacts() { + return this.artifacts; + } + /** + * Getter $release + * @return {Release} + */ + get $release() { + return this.release; + } + /** + * Getter $environment + * @return {ReleaseEnvironment} + */ + get $environment() { + return this.environment; + } + /** + * Getter $lastCompletedRelease + * @return {Release} + */ + get $lastCompletedRelease() { + return this.lastCompletedRelease; + } + /** + * Getter $lastCompletedEnvironment + * @return {ReleaseEnvironment} + */ + get $lastCompletedEnvironment() { + return this.lastCompletedEnvironment; + } + hasPrevGotSameFailures() { + const lastId = this.lastCompletedRelease == null ? "null" : this.lastCompletedRelease.id; + console.log(`Using Last Completed Release: '${lastId}'`); + if (this.lastCompletedRelease == null || this.$lastCompletedEnvironment == null) { + return false; + } + if (lastId > this.release.id) { + // We are in a situation where current build completed latter compared to the newer one + // Newer one would have already evaluated the failures and sent a mail to committers anyway + // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer + // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line + return true; + } + return null; + } + hasFailedTasks() { + const tasks = this.getReleaseTasks(this.environment); + return tasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed).length > 0; + } + hasPrevFailedTasks() { + const tasks = this.getReleaseTasks(this.lastCompletedEnvironment); + return tasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed).length > 0; + } + arePrevFailedTasksSame() { + const lastTasks = this.getReleaseTasks(this.lastCompletedEnvironment); + const lastFailedTasks = lastTasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed); + var prevfailedTask = lastFailedTasks.length > 0 ? lastFailedTasks[0] : null; + const currentTasks = this.getReleaseTasks(this.environment); + const currentFailedTasks = currentTasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed); + var currfailedTask = currentFailedTasks.length > 0 ? currentFailedTasks[0] : null; + const prevfailedTaskName = prevfailedTask == null ? "" : prevfailedTask.name; + const currfailedTaskName = currfailedTask == null ? "" : currfailedTask.name; + // if both releases failed without executing any tasks, then they can be null + // otherwise, use name matching + return (prevfailedTask == null && currfailedTask == null) || prevfailedTaskName == currfailedTaskName; + } + getPrevConfig(config) { + if (util_1.isNullOrUndefined(this.lastCompletedRelease) || util_1.isNullOrUndefined(this.lastCompletedEnvironment)) { + return null; + } + var prevConfig = new PipelineConfiguration_1.PipelineConfiguration(config.$pipelineType, this.lastCompletedRelease.id, config.$projectId, config.$projectName, this.lastCompletedEnvironment.id, this.lastCompletedEnvironment.definitionEnvironmentId, config.$usePreviousEnvironment, config.$teamUri, config.$accessKey); + return prevConfig; + } + getEnvironmentStatus() { + if (this.hasFailedTasks() || this.hasCanceledPhases()) { + return "Failed"; + } + else if (this.hasPartiallySucceededTasks(this.environment)) { + return "Partially Succeeded"; + } + else { + return "Succeeded"; + } + } + hasPartiallySucceededTasks(source) { + if (source == null) { + return false; + } + const tasks = this.getReleaseTasks(source); + return tasks.filter(t => t.status == ReleaseInterfaces_1.TaskStatus.PartiallySucceeded).length > 0; + } + hasCanceledPhases() { + if (this.phases == null) { + return false; + } + const jobs = []; + this.phases.forEach(p => { + if (p.$jobs != null) { + p.$jobs.forEach(j => { + if (j.$jobStatus == ReleaseInterfaces_1.TaskStatus.Canceled) { + jobs.push(j); + } + }); + } + }); + return jobs.length > 0; + } + getPipelineViewModel(config) { + return new ReleaseViewModel_1.ReleaseViewModel(this.environment, config); + } + getArtifactViewModels(config) { + var artifacts = []; + if (this.artifacts != null && this.artifacts.length > 0) { + this.artifacts.forEach(artifact => { + artifacts.push(new ArtifactViewModel_1.ArtifactViewModel(artifact, config)); + }); + } + return artifacts; + } + getReleaseTasks(source) { + const tasks = []; + if (source != null && source.deploySteps != null && source.deploySteps.length > 0) { + let attempt = 0; + let deploymentAttempt = source.deploySteps[0]; + for (var i = 0; i < source.deploySteps.length; i++) { + if (source.deploySteps[i].attempt > attempt) { + deploymentAttempt = source.deploySteps[i]; + } + } + deploymentAttempt.releaseDeployPhases.forEach(releaseDeployPhase => { + releaseDeployPhase.deploymentJobs.forEach(deploymentJob => { + tasks.push(...deploymentJob.tasks); + }); + }); + } + return tasks; + } +} +exports.ReleaseReport = ReleaseReport; +//# sourceMappingURL=ReleaseReport.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js.map new file mode 100644 index 00000000..f45029cf --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseReport.js","sourceRoot":"","sources":["ReleaseReport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ReleaseReport.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ReleaseReport.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.d.ts new file mode 100644 index 00000000..85204208 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.d.ts @@ -0,0 +1,73 @@ +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +import { ChangeModel } from "./ChangeModel"; +import { PhaseModel } from "./PhaseModel"; +import { TestSummaryGroupModel } from "./testresults/TestSummaryGroupModel"; +import { TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestResultsGroupModel } from "./testresults/TestResultGroupModel"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; +import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; +export declare abstract class Report { + private dataMissing; + private sendMailConditionSatisfied; + createdBy: IdentityRef; + protected associatedChanges: ChangeModel[]; + protected phases: PhaseModel[]; + private failedTestOwners; + filteredResults: TestResultsGroupModel[]; + hasFilteredTests: boolean; + private testSummaryGroups; + testResultSummary: TestResultSummary; + /** + * Getter $dataMissing + * @return {boolean} + */ + get $dataMissing(): boolean; + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + get $associatedChanges(): ChangeModel[]; + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + get $phases(): PhaseModel[]; + /** + * Getter $sendMailConditionSatisfied + * @return {boolean} + */ + get $sendMailConditionSatisfied(): boolean; + /** + * Setter $dataMissing + * @param {boolean} value + */ + set $dataMissing(value: boolean); + /** + * Setter $sendMailConditionSatisfied + * @param {boolean} value + */ + set $sendMailConditionSatisfied(value: boolean); + /** + * Getter $testSummaryGroups + * @return {TestSummaryGroupModel[]} + */ + get $testSummaryGroups(): TestSummaryGroupModel[]; + /** + * Getter $failedTestOwners + * @return {IdentityRef[] } + */ + get $failedTestOwners(): IdentityRef[]; + abstract hasPrevGotSameFailures(): boolean; + abstract hasFailedTasks(): boolean; + abstract hasPrevFailedTasks(): boolean; + abstract arePrevFailedTasksSame(): boolean; + abstract getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; + abstract getEnvironmentStatus(): string; + abstract getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel | ReleaseViewModel; + abstract getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; + hasFailedTests(includeOthersInTotal: boolean): boolean; + private getTestCountForOutcome; + abstract hasCanceledPhases(): boolean; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js new file mode 100644 index 00000000..acded510 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js @@ -0,0 +1,99 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Report = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const util_1 = require("util"); +class Report { + constructor() { + this.dataMissing = false; + this.sendMailConditionSatisfied = false; + this.associatedChanges = []; + this.phases = []; + this.failedTestOwners = []; + this.filteredResults = []; + this.hasFilteredTests = false; + this.testSummaryGroups = []; + } + /** + * Getter $dataMissing + * @return {boolean} + */ + get $dataMissing() { + return this.dataMissing; + } + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + get $associatedChanges() { + return this.associatedChanges; + } + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + get $phases() { + return this.phases; + } + /** + * Getter $sendMailConditionSatisfied + * @return {boolean} + */ + get $sendMailConditionSatisfied() { + return this.sendMailConditionSatisfied; + } + /** + * Setter $dataMissing + * @param {boolean} value + */ + set $dataMissing(value) { + this.dataMissing = value; + } + /** + * Setter $sendMailConditionSatisfied + * @param {boolean} value + */ + set $sendMailConditionSatisfied(value) { + this.sendMailConditionSatisfied = value; + } + /** + * Getter $testSummaryGroups + * @return {TestSummaryGroupModel[]} + */ + get $testSummaryGroups() { + return this.testSummaryGroups; + } + /** + * Getter $failedTestOwners + * @return {IdentityRef[] } + */ + get $failedTestOwners() { + return this.failedTestOwners; + } + hasFailedTests(includeOthersInTotal) { + if (util_1.isNullOrUndefined(this.testResultSummary)) { + return false; + } + if (!includeOthersInTotal) { + return this.getTestCountForOutcome(TestInterfaces_1.TestOutcome.Failed) > 0; + } + // Others need to be included - Calculate failed as (total - passed) + const passedCount = this.getTestCountForOutcome(TestInterfaces_1.TestOutcome.Passed); + if (passedCount > 0) { + return (this.testResultSummary.aggregatedResultsAnalysis.totalTests - passedCount) > 0; + } + // If no passed tests, then anything ran should be considered as failed since "other" outcomes need to be considered as failures + // if no tests ran, then we don't have failed tests + return this.testResultSummary.aggregatedResultsAnalysis.totalTests > 0; + } + getTestCountForOutcome(outcome) { + const resultsByOutcome = this.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome; + let testsForOutcome = 0; + if (!util_1.isNullOrUndefined(resultsByOutcome) && !util_1.isNullOrUndefined(resultsByOutcome[outcome])) { + testsForOutcome += resultsByOutcome[outcome].count; + } + return testsForOutcome; + } +} +exports.Report = Report; +//# sourceMappingURL=Report.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js.map new file mode 100644 index 00000000..7d2f9b8c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Report.js","sourceRoot":"","sources":["Report.ts"],"names":[],"mappings":";;;AAIA,oFAA6H;AAG7H,+BAAyC;AAKzC,MAAsB,MAAM;IAA5B;QACU,gBAAW,GAAY,KAAK,CAAC;QAE7B,+BAA0B,GAAY,KAAK,CAAC;QAI1C,sBAAiB,GAAkB,EAAE,CAAC;QAEtC,WAAM,GAAiB,EAAE,CAAC;QAE5B,qBAAgB,GAAkB,EAAE,CAAC;QAEtC,oBAAe,GAA4B,EAAE,CAAC;QAE9C,qBAAgB,GAAY,KAAK,CAAC;QAEjC,sBAAiB,GAA4B,EAAE,CAAC;IAqH1D,CAAC;IAjHC;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;IAGA;IACA,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B;QACpC,OAAO,IAAI,CAAC,0BAA0B,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B,CAAC,KAAc;QACnD,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAGD;;;OAGG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAkBM,cAAc,CAAC,oBAA6B;QACjD,IAAI,wBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;YAC7C,OAAO,KAAK,CAAC;SACd;QAED,IAAI,CAAC,oBAAoB,EAAE;YACzB,OAAO,IAAI,CAAC,sBAAsB,CAAC,4BAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC5D;QAED,oEAAoE;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,WAAW,GAAG,CAAC,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;SACxF;QAED,gIAAgI;QAChI,oDAAoD;QACpD,OAAO,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,UAAU,GAAG,CAAC,CAAC;IACzE,CAAC;IAEO,sBAAsB,CAAC,OAAoB;QACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;QAEzF,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE;YACzF,eAAe,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;SACpD;QAED,OAAO,eAAe,CAAC;IAC3B,CAAC;CAGF;AAtID,wBAsIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/Report.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/Report.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.d.ts new file mode 100644 index 00000000..f8335f5d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.d.ts @@ -0,0 +1,9 @@ +import { ReleaseReport } from "./ReleaseReport"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { Report } from "./Report"; +import { BuildReport } from "./BuildReport"; +export declare class ReportFactory { + static createNewReport(pipelineConfig: PipelineConfiguration): ReleaseReport | BuildReport; + static mergeReports(reports: Report[]): Report; + private static mergeTwoReports; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js new file mode 100644 index 00000000..1d372832 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportFactory = void 0; +const ReleaseReport_1 = require("./ReleaseReport"); +const PipelineType_1 = require("../config/pipeline/PipelineType"); +const BuildReport_1 = require("./BuildReport"); +class ReportFactory { + static createNewReport(pipelineConfig) { + return (pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build) ? new BuildReport_1.BuildReport() : new ReleaseReport_1.ReleaseReport(); + } + static mergeReports(reports) { + if (reports == null || reports.length == 0) + return null; + if (reports.length == 1) + return reports[0]; + let finalReport = reports[0]; + for (var i = 1; i < reports.length; i++) { + finalReport = ReportFactory.mergeTwoReports(finalReport, reports[i]); + } + return finalReport; + } + static mergeTwoReports(source, target) { + let associatedChanges = []; + let phases = []; + if (target.$testSummaryGroups != null) { + source.$testSummaryGroups.push(...target.$testSummaryGroups); + } + if (target.$associatedChanges != null) { + associatedChanges = target.$associatedChanges; + } + if (target.$failedTestOwners != null) { + source.$failedTestOwners.push(...target.$failedTestOwners); + } + if (target.filteredResults != null) { + source.filteredResults = target.filteredResults; + } + if (target.hasFilteredTests) { + source.hasFilteredTests = target.hasFilteredTests; + } + if (target.testResultSummary != null) { + source.testResultSummary = target.testResultSummary; + } + if (target.$phases != null) { + phases = target.$phases; + } + if (source instanceof ReleaseReport_1.ReleaseReport) { + var releaseTarget = target; + var releaseSource = source; + let targetRelease = null; + let targetEnv = null; + let targetLastRelease = null; + let targetLastEnv = null; + if (releaseTarget.$release != null) { + targetRelease = releaseTarget.$release; + } + if (releaseTarget.$environment != null) { + targetEnv = releaseTarget.$environment; + } + if (releaseTarget.$lastCompletedEnvironment != null) { + targetLastRelease = releaseTarget.$lastCompletedRelease; + } + if (releaseTarget.$lastCompletedEnvironment != null) { + targetLastEnv = releaseTarget.$lastCompletedEnvironment; + } + if (targetRelease != null) { + releaseSource.setReleaseData(targetRelease, targetEnv, targetLastRelease, phases, associatedChanges, targetLastEnv); + } + } + return source; + } +} +exports.ReportFactory = ReportFactory; +//# sourceMappingURL=ReportFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js.map new file mode 100644 index 00000000..46ca8c40 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportFactory.js","sourceRoot":"","sources":["ReportFactory.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ReportFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/ReportFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.d.ts new file mode 100644 index 00000000..38981545 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.d.ts @@ -0,0 +1,41 @@ +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { IssueModel } from "./IssueModel"; +export declare class TaskModel { + private name; + private status; + private issues; + private agentName; + private finishTime; + private startTime; + constructor($name: string, $status: TaskStatus, $issues: IssueModel[], $agentName: string, $finishTime: Date, $startTime: Date); + /** + * Getter $name + * @return {string} + */ + get $name(): string; + /** + * Getter $status + * @return {TaskStatus} + */ + get $status(): TaskStatus; + /** + * Getter $issues + * @return {IssueModel[]} + */ + get $issues(): IssueModel[]; + /** + * Getter $agentName + * @return {string} + */ + get $agentName(): string; + /** + * Getter $finishTime + * @return {Date} + */ + get $finishTime(): Date; + /** + * Getter $startTime + * @return {Date} + */ + get $startTime(): Date; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js new file mode 100644 index 00000000..0e7a9d5c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskModel = void 0; +class TaskModel { + constructor($name, $status, $issues, $agentName, $finishTime, $startTime) { + this.name = $name; + this.status = $status; + this.issues = $issues; + this.agentName = $agentName; + this.finishTime = $finishTime; + this.startTime = $startTime; + } + /** + * Getter $name + * @return {string} + */ + get $name() { + return this.name; + } + /** + * Getter $status + * @return {TaskStatus} + */ + get $status() { + return this.status; + } + /** + * Getter $issues + * @return {IssueModel[]} + */ + get $issues() { + return this.issues; + } + /** + * Getter $agentName + * @return {string} + */ + get $agentName() { + return this.agentName; + } + /** + * Getter $finishTime + * @return {Date} + */ + get $finishTime() { + return this.finishTime; + } + /** + * Getter $startTime + * @return {Date} + */ + get $startTime() { + return this.startTime; + } +} +exports.TaskModel = TaskModel; +//# sourceMappingURL=TaskModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js.map new file mode 100644 index 00000000..de1c9842 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskModel.js","sourceRoot":"","sources":["TaskModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,SAAS;IASpB,YAAY,KAAa,EAAE,OAAmB,EAAE,OAAqB,EAAE,UAAkB,EAAE,WAAiB,EAAE,UAAgB;QAC5H,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAjED,8BAiEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/TaskModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/TaskModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.d.ts new file mode 100644 index 00000000..72d5f999 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.d.ts @@ -0,0 +1,28 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestCaseResult } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class LinkHelper { + private static readonly TcmPipelineExtension; + private static readonly ReleaseProgressView; + private static readonly ReleaseDefView; + private static readonly ReleaseEnvironmentExtension; + private static readonly ReleaseEnvironmentLogsExtension; + private static readonly ReleaseLinkTestExtensionId; + private static readonly WorkItemPipelineExtension; + private static readonly BuildPipelineExtension; + static getBuildDefinitionLinkById(definitionId: any, config: PipelineConfiguration): string; + private static getBuildLink; + static getCommitLink(changeId: string, changeUri: string, config: PipelineConfiguration): string; + static getCreateBugLinkForTest(config: PipelineConfiguration, testResult: TestCaseResult): string; + static getQueryParameter(parameterValues: Map): string; + static getReleaseDefinitionLink(config: PipelineConfiguration, releaseDefinitionId: number): string; + static getReleaseLogsTabLink(config: PipelineConfiguration): string; + static getReleaseSummaryLink(config: PipelineConfiguration): string; + static getTestResultLink(config: PipelineConfiguration, runId: string, resultId: number, queryParams?: Map): string; + static getTestTabLinkInRelease(config: PipelineConfiguration): string; + static getWorkItemLink(config: PipelineConfiguration, workItemId: number): string; + private static getBuildRelativeUrl; + static getTestTabLinkInBuild(config: PipelineConfiguration): string; + private static getTcmRelativeUrl; + private static getWorkItemRelativeUrl; + static getTestTabLink(pipelineConfiguration: PipelineConfiguration): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js new file mode 100644 index 00000000..df8c399f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js @@ -0,0 +1,125 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LinkHelper = void 0; +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +class LinkHelper { + static getBuildDefinitionLinkById(definitionId, config) { + var collectionUri = config.$teamUri; + var parameters = new Map(); + parameters.set("definitionId", definitionId.toString()); + parameters.set("_a", "summary"); + var uri = this.getBuildLink(config, collectionUri, parameters); + return uri; + } + static getBuildLink(config, collectionUri, parameters) { + return collectionUri + "/" + this.getBuildRelativeUrl(config.$projectName) + "/results" + this.getQueryParameter(parameters); + } + static getCommitLink(changeId, changeUri, config) { + var collectionUri = config.$teamUri; + let repoId = null; + var pos = changeUri.indexOf("repositories"); + if (pos > 0) { + repoId = changeUri.substr(pos).split("/")[1]; + } + var uri = collectionUri + `/${config.$projectName}/_git/${repoId}/commit/${changeId})`; + return uri; + } + static getCreateBugLinkForTest(config, testResult) { + const testRunId = testResult.testRun == null ? null : testResult.testRun.id; + const parameters = new Map(); + parameters.set("create-bug", "true"); + return LinkHelper.getTestResultLink(config, testRunId, testResult.id, parameters); + } + static getQueryParameter(parameterValues) { + var queryString = ""; + parameterValues.forEach((value, key) => { + queryString = (queryString == "") + ? "?" + key + "=" + value + : queryString + "&" + key + "=" + value; + }); + return queryString; + } + static getReleaseDefinitionLink(config, releaseDefinitionId) { + var collectionUri = config.$teamUri; + const parameters = new Map(); + parameters.set("definitionId", releaseDefinitionId.toString()); + parameters.set("_a", "environments-editor"); + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseDefView + "/" + LinkHelper.getQueryParameter(parameters); + } + static getReleaseLogsTabLink(config) { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + queryParams.set("_a", LinkHelper.ReleaseEnvironmentLogsExtension); + queryParams.set("environmentId", config.$environmentId.toString()); + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + static getReleaseSummaryLink(config) { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + static getTestResultLink(config, runId, resultId, queryParams) { + var collectionUri = config.$teamUri; + const parameters = new Map(); + parameters.set("runId", runId); + parameters.set("_a", "resultSummary"); + parameters.set("resultId", resultId.toString()); + if (queryParams != null) { + queryParams.forEach((value, key) => { + 6; + parameters.set(key, value); + }); + } + return collectionUri + "\\" + LinkHelper.getTcmRelativeUrl(config.$projectName) + "\\" + LinkHelper.getQueryParameter(parameters); + } + static getTestTabLinkInRelease(config) { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + queryParams.set("_a", LinkHelper.ReleaseEnvironmentExtension); + queryParams.set("environmentId", config.$environmentId.toString()); + queryParams.set("extensionId", LinkHelper.ReleaseLinkTestExtensionId); + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + static getWorkItemLink(config, workItemId) { + const queryParams = new Map(); + queryParams.set("id", workItemId.toString()); + return config.$teamUri + "/" + LinkHelper.getWorkItemRelativeUrl(config.$projectName) + "/" + LinkHelper.getQueryParameter(queryParams); + } + static getBuildRelativeUrl(projectName) { + return projectName + "/" + LinkHelper.BuildPipelineExtension; + } + static getTestTabLinkInBuild(config) { + var collectionUri = config.$teamUri; + var parameters = new Map([ + ["buildId", config.$pipelineId.toString()], + ["view", "ms.vss-test-web.build-test-results-tab"] + ]); + var uri = this.getBuildLink(config, collectionUri, parameters); + return uri; + } + static getTcmRelativeUrl(projectName) { + return projectName + "/" + LinkHelper.TcmPipelineExtension; + } + static getWorkItemRelativeUrl(projectName) { + return projectName + "/" + LinkHelper.WorkItemPipelineExtension; + } + static getTestTabLink(pipelineConfiguration) { + return pipelineConfiguration.$pipelineType == PipelineType_1.PipelineType.Release ? + this.getTestTabLinkInRelease(pipelineConfiguration) : + this.getTestTabLinkInBuild(pipelineConfiguration); + } +} +exports.LinkHelper = LinkHelper; +LinkHelper.TcmPipelineExtension = "_TestManagement/Runs"; +// Release related strings +LinkHelper.ReleaseProgressView = "_releaseProgress"; +LinkHelper.ReleaseDefView = "_releaseDefinition"; +LinkHelper.ReleaseEnvironmentExtension = "release-environment-extension"; +LinkHelper.ReleaseEnvironmentLogsExtension = "release-environment-logs"; +LinkHelper.ReleaseLinkTestExtensionId = "ms.vss-test-web.test-result-in-release-environment-editor-tab"; +LinkHelper.WorkItemPipelineExtension = "_workitems"; +LinkHelper.BuildPipelineExtension = "_build"; +//# sourceMappingURL=LinkHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js.map new file mode 100644 index 00000000..bec637f7 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"LinkHelper.js","sourceRoot":"","sources":["LinkHelper.ts"],"names":[],"mappings":";;;AAIA,qEAAkE;AAElE,MAAa,UAAU;IAad,MAAM,CAAC,0BAA0B,CAAC,YAAiB,EAAE,MAA6B;QACvF,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,IAAI,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxD,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QAE/D,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,MAA6B,EAAE,aAAqB,EAAE,UAA+B;QAC/G,OAAO,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC/H,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,QAAgB,EAAE,SAAiB,EAAE,MAA6B;QAC5F,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,GAAG,GAAG,CAAC,EAAE;YACX,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9C;QAED,IAAI,GAAG,GAAG,aAAa,GAAG,IAAI,MAAM,CAAC,YAAY,SAAS,MAAM,WAAW,QAAQ,GAAG,CAAC;QACvF,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,uBAAuB,CAAC,MAA6B,EAAE,UAA0B;QAC7F,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACpF,CAAC;IAEM,MAAM,CAAC,iBAAiB,CAAC,eAAoC;QAClE,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,eAAe,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;YACrD,WAAW,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;gBAC/B,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK;gBACzB,CAAC,CAAC,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IAEM,MAAM,CAAC,wBAAwB,CAAC,MAA6B,EAAE,mBAA2B;QAC/F,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/D,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QAE5C,OAAO,aAAa,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,UAAU,CAAC,cAAc,GAAG,GAAG,GAAG,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACtI,CAAC;IAEM,MAAM,CAAC,qBAAqB,CAAC,MAA6B;QAC/D,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,+BAA+B,CAAC,CAAC;QAClE,WAAW,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnE,OAAO,aAAa,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,UAAU,CAAC,mBAAmB,GAAG,UAAU,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACtI,CAAC;IAEM,MAAM,CAAC,qBAAqB,CAAC,MAA6B;QAC/D,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE5D,OAAO,aAAa,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,UAAU,CAAC,mBAAmB,GAAG,UAAU,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACtI,CAAC;IAEM,MAAM,CAAC,iBAAiB,CAAC,MAA6B,EAAE,KAAa,EAAE,QAAgB,EAAE,WAAiC;QAC/H,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/B,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACtC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhD,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,WAAW,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;gBAAE,CAAC,CAAA;gBACpD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;SACJ;QAED,OAAO,aAAa,GAAG,IAAI,GAAG,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACpI,CAAC;IAEM,MAAM,CAAC,uBAAuB,CAAC,MAA6B;QACjE,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,2BAA2B,CAAC,CAAC;QAC9D,WAAW,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,0BAA0B,CAAC,CAAC;QAEtE,OAAO,aAAa,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,UAAU,CAAC,mBAAmB,GAAG,UAAU,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACtI,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,MAA6B,EAAE,UAAkB;QAC7E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7C,OAAO,MAAM,CAAC,QAAQ,GAAG,GAAG,GAAG,UAAU,CAAC,sBAAsB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,UAAU,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC1I,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAAC,WAAmB;QACpD,OAAO,WAAW,GAAG,GAAG,GAAG,UAAU,CAAC,sBAAsB,CAAC;IAC/D,CAAC;IAEM,MAAM,CAAC,qBAAqB,CAAC,MAA6B;QAC/D,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,IAAI,UAAU,GAAG,IAAI,GAAG,CACtB;YACE,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1C,CAAC,MAAM,EAAE,wCAAwC,CAAC;SACnD,CAAC,CAAC;QAEL,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QAC/D,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,WAAmB;QAClD,OAAO,WAAW,GAAG,GAAG,GAAG,UAAU,CAAC,oBAAoB,CAAC;IAC7D,CAAC;IAEO,MAAM,CAAC,sBAAsB,CAAC,WAAmB;QACvD,OAAO,WAAW,GAAG,GAAG,GAAG,UAAU,CAAC,yBAAyB,CAAC;IAClE,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,qBAA4C;QACvE,OAAO,qBAAqB,CAAC,aAAa,IAAI,2BAAY,CAAC,OAAO,CAAC,CAAC;YAClE,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;IACtD,CAAC;;AAlJH,gCAmJC;AAlJyB,+BAAoB,GAAG,sBAAsB,CAAC;AAEtE,0BAA0B;AACF,8BAAmB,GAAG,kBAAkB,CAAC;AACzC,yBAAc,GAAG,oBAAoB,CAAC;AACtC,sCAA2B,GAAG,+BAA+B,CAAC;AAC9D,0CAA+B,GAAG,0BAA0B,CAAC;AAC7D,qCAA0B,GAAG,+DAA+D,CAAC;AAE7F,oCAAyB,GAAG,YAAY,CAAC;AACzC,iCAAsB,GAAG,QAAQ,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/LinkHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/LinkHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.d.ts new file mode 100644 index 00000000..0173bac6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.d.ts @@ -0,0 +1,10 @@ +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; +export declare class TestResultsHelper { + static readonly PercentagePrecision = 2; + static getTestOutcomePercentage(testCountForOutcome: number, totalTests: number): number; + private static getCustomizedDecimalValue; + static getTestOutcomePercentageString(testCountForOutcome: number, totalTests: number): string; + static getTotalTestCountBasedOnUserConfiguration(testCountsByOutcome: Map, includeOthersInTotal: boolean): number; + static getTotalTestCountBasedOnUserConfigurationPriority(testCountsByOutcome: Map, includeOthersInTotal: boolean): number; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js new file mode 100644 index 00000000..ffb3f0a9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js @@ -0,0 +1,48 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsHelper = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TestOutcomeForPriority_1 = require("../testresults/TestOutcomeForPriority"); +class TestResultsHelper { + static getTestOutcomePercentage(testCountForOutcome, totalTests) { + if (totalTests == 0) { + console.log("Total Test count is 0. Setting outcome percentage to 0"); + } + let testOutcomePercentage = totalTests == 0 ? + 0 : + testCountForOutcome / totalTests * 100; + return TestResultsHelper.getCustomizedDecimalValue(testOutcomePercentage); + } + static getCustomizedDecimalValue(value) { + var fixedValue = Math.pow(10, TestResultsHelper.PercentagePrecision); + return ((Math.floor(value * fixedValue)) / fixedValue); + } + static getTestOutcomePercentageString(testCountForOutcome, totalTests) { + return this.getTestOutcomePercentage(testCountForOutcome, totalTests) + "%"; + } + static getTotalTestCountBasedOnUserConfiguration(testCountsByOutcome, includeOthersInTotal) { + var totalTests = 0; + testCountsByOutcome.forEach((testCount, testOutcome) => { + var isPassedTest = testOutcome == TestInterfaces_1.TestOutcome.Passed; + var isFailedTest = testOutcome == TestInterfaces_1.TestOutcome.Failed; + if (isPassedTest || isFailedTest || includeOthersInTotal) { + totalTests += testCount; + } + }); + return totalTests; + } + static getTotalTestCountBasedOnUserConfigurationPriority(testCountsByOutcome, includeOthersInTotal) { + var totalTests = 0; + testCountsByOutcome.forEach((testCount, testOutcome) => { + var isPassedTest = testOutcome == TestOutcomeForPriority_1.TestOutcomeForPriority.Passed; + var isFailedTest = testOutcome == TestOutcomeForPriority_1.TestOutcomeForPriority.Failed; + if (isPassedTest || isFailedTest || includeOthersInTotal) { + totalTests += testCount; + } + }); + return totalTests; + } +} +exports.TestResultsHelper = TestResultsHelper; +TestResultsHelper.PercentagePrecision = 2; +//# sourceMappingURL=TestResultsHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js.map new file mode 100644 index 00000000..f0422c22 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultsHelper.js","sourceRoot":"","sources":["TestResultsHelper.ts"],"names":[],"mappings":";;;AAAA,oFAA8E;AAC9E,kFAA+E;AAE/E,MAAa,iBAAiB;IAGrB,MAAM,CAAC,wBAAwB,CAAC,mBAA2B,EAAE,UAAkB;QACpF,IAAI,UAAU,IAAI,CAAC,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;SACvE;QAED,IAAI,qBAAqB,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,mBAAmB,GAAG,UAAU,GAAG,GAAG,CAAC;QAEzC,OAAO,iBAAiB,CAAC,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAEO,MAAM,CAAC,yBAAyB,CAAC,KAAa;QACpD,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;IACzD,CAAC;IAEM,MAAM,CAAC,8BAA8B,CAAC,mBAA2B,EAAE,UAAkB;QAC1F,OAAO,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC;IAC9E,CAAC;IAEM,MAAM,CAAC,yCAAyC,CACrD,mBAA6C,EAC7C,oBAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,WAAwB,EAAE,EAAE;YAC1E,IAAI,YAAY,GAAG,WAAW,IAAI,4BAAW,CAAC,MAAM,CAAC;YACrD,IAAI,YAAY,GAAG,WAAW,IAAI,4BAAW,CAAC,MAAM,CAAC;YAErD,IAAI,YAAY,IAAI,YAAY,IAAI,oBAAoB,EAAE;gBACxD,UAAU,IAAI,SAAS,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,MAAM,CAAC,iDAAiD,CAC7D,mBAAwD,EACxD,oBAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,WAAmC,EAAE,EAAE;YACrF,IAAI,YAAY,GAAG,WAAW,IAAI,+CAAsB,CAAC,MAAM,CAAC;YAChE,IAAI,YAAY,GAAG,WAAW,IAAI,+CAAsB,CAAC,MAAM,CAAC;YAEhE,IAAI,YAAY,IAAI,YAAY,IAAI,oBAAoB,EAAE;gBACxD,UAAU,IAAI,SAAS,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;;AAxDH,8CAyDC;AAxDwB,qCAAmB,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/TestResultsHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/TestResultsHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.d.ts new file mode 100644 index 00000000..c4e88503 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.d.ts @@ -0,0 +1,7 @@ +export declare class TimeFormatter { + static ConvertTimeStringToMilliSeconds(duration: string): number; + static FormatDuration(timeInMilliseconds: number): string; + static FormatDurationStr(timeStr: string): string; + private static getCombinedTimeString; + private static getTimeUnitString; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js new file mode 100644 index 00000000..d7b813fc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js @@ -0,0 +1,79 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TimeFormatter = void 0; +const util_1 = require("util"); +class TimeFormatter { + static ConvertTimeStringToMilliSeconds(duration) { + const timeSpanArray = duration.split("."); + let durationNum = 0; + let hmsIndex = 0; + if (timeSpanArray.length > 3) { + console.warn("cannot format time duration"); + return 0; + } + else if (timeSpanArray.length == 3) { + // Eg: 1.03:04:05.567 = 1 day, 3 hours, 4 min, 5 seconds and 567 ms. + // Days to ms + durationNum += Number(timeSpanArray[0]) * 24 * 3600; + hmsIndex = 1; + } + let timeStrArray = timeSpanArray[hmsIndex].split(":"); + if (timeStrArray.length != 3) { + console.warn("cannot format time duration properly. test run duration will not be accurate"); + } + else { + durationNum += Number(timeStrArray[2]); // secs + durationNum += Number(timeStrArray[1]) * 60; // mins to secs + durationNum += Number(timeStrArray[0]) * 3600; // hours to secs + } + return durationNum * 1000; + } + static FormatDuration(timeInMilliseconds) { + let timeStr = ""; + // 1- Convert to seconds: + var seconds = timeInMilliseconds / 1000; + // 2- Extract hours: + var hours = Math.round(seconds / 3600); // 3,600 seconds in 1 hour + seconds = seconds % 3600; // seconds remaining after extracting hours + // 3- Extract minutes: + var minutes = Math.round(seconds / 60); // 60 seconds in 1 minute + // 4- Keep only seconds not extracted to minutes: + seconds = seconds % 60; + seconds = Math.round(seconds); + if (minutes == 60) { + hours += 1; + minutes = 0; + } + return this.getCombinedTimeString(hours, minutes, seconds); + } + static FormatDurationStr(timeStr) { + let resultStr = ""; + if (!util_1.isNullOrUndefined(timeStr)) { + // strip off milliseconds if any, and then split into hh:mm:ss + const timeStrArray = timeStr.split(".")[0].split(":"); + if (timeStrArray.length != 3) { + // not supported + return timeStr; + } + // 1- Convert to seconds: + var seconds = Math.round(Number.parseInt(timeStrArray[2])); + var minutes = Math.round(Number.parseInt(timeStrArray[1])); + var hours = Math.round(Number.parseInt(timeStrArray[0])); + resultStr = this.getCombinedTimeString(hours, minutes, seconds); + } + return resultStr; + } + static getCombinedTimeString(hours, minutes, seconds) { + let timeStr = ""; + timeStr += this.getTimeUnitString(hours, "h"); + timeStr += this.getTimeUnitString(minutes, "m"); + timeStr += this.getTimeUnitString(seconds, "s"); + timeStr = timeStr.trim(); + return (timeStr == "" ? "0s" : timeStr); + } + static getTimeUnitString(timeUnit, suffix) { + return timeUnit < 1 ? "" : timeUnit + suffix + " "; + } +} +exports.TimeFormatter = TimeFormatter; +//# sourceMappingURL=TimeFormatter.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js.map new file mode 100644 index 00000000..f96973ac --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeFormatter.js","sourceRoot":"","sources":["TimeFormatter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/TimeFormatter.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/helpers/TimeFormatter.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.d.ts new file mode 100644 index 00000000..c2dbc46e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.d.ts @@ -0,0 +1,7 @@ +export declare enum TestOutcomeForPriority { + Failed = 0, + Inconclusive = 1, + NotExecuted = 2, + Passed = 3, + Other = 4 +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js new file mode 100644 index 00000000..5677cc8c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestOutcomeForPriority = void 0; +var TestOutcomeForPriority; +(function (TestOutcomeForPriority) { + TestOutcomeForPriority[TestOutcomeForPriority["Failed"] = 0] = "Failed"; + TestOutcomeForPriority[TestOutcomeForPriority["Inconclusive"] = 1] = "Inconclusive"; + TestOutcomeForPriority[TestOutcomeForPriority["NotExecuted"] = 2] = "NotExecuted"; + TestOutcomeForPriority[TestOutcomeForPriority["Passed"] = 3] = "Passed"; + TestOutcomeForPriority[TestOutcomeForPriority["Other"] = 4] = "Other"; +})(TestOutcomeForPriority = exports.TestOutcomeForPriority || (exports.TestOutcomeForPriority = {})); +//# sourceMappingURL=TestOutcomeForPriority.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js.map new file mode 100644 index 00000000..d6f1e5c2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestOutcomeForPriority.js","sourceRoot":"","sources":["TestOutcomeForPriority.ts"],"names":[],"mappings":";;;AAAA,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,uEAAM,CAAA;IACN,mFAAY,CAAA;IACZ,iFAAW,CAAA;IACX,uEAAM,CAAA;IACN,qEAAK,CAAA;AACP,CAAC,EANW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAMjC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.d.ts new file mode 100644 index 00000000..097ec84b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.d.ts @@ -0,0 +1,6 @@ +import { TestResultModel } from "./TestResultModel"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultsGroupModel { + groupName: string; + testResults: Map; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js new file mode 100644 index 00000000..9625859d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsGroupModel = void 0; +class TestResultsGroupModel { + constructor() { + this.testResults = new Map(); + } +} +exports.TestResultsGroupModel = TestResultsGroupModel; +//# sourceMappingURL=TestResultGroupModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js.map new file mode 100644 index 00000000..f04389a5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultGroupModel.js","sourceRoot":"","sources":["TestResultGroupModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAAlC;QAGS,gBAAW,GAAwC,IAAI,GAAG,EAAkC,CAAC;IACtG,CAAC;CAAA;AAJD,sDAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestResultGroupModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestResultGroupModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.d.ts new file mode 100644 index 00000000..ed658c8d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.d.ts @@ -0,0 +1,7 @@ +import { TestCaseResult, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +export declare class TestResultModel { + testResult: TestCaseResult; + associatedBugRefs: WorkItemReference[]; + associatedBugs: WorkItem[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js new file mode 100644 index 00000000..4062bcef --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultModel = void 0; +class TestResultModel { + constructor() { + this.associatedBugRefs = []; + this.associatedBugs = []; + } +} +exports.TestResultModel = TestResultModel; +//# sourceMappingURL=TestResultModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js.map new file mode 100644 index 00000000..2131536d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultModel.js","sourceRoot":"","sources":["TestResultModel.ts"],"names":[],"mappings":";;;AAIA,MAAa,eAAe;IAA5B;QAES,sBAAiB,GAAwB,EAAE,CAAC;QAC5C,mBAAc,GAAe,EAAE,CAAC;IACzC,CAAC;CAAA;AAJD,0CAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestResultModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestResultModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.d.ts new file mode 100644 index 00000000..d75cd7ec --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.d.ts @@ -0,0 +1,6 @@ +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +import { TestSummaryItemModel } from "./TestSummaryItemModel"; +export declare class TestSummaryGroupModel { + groupedBy: GroupTestResultsBy; + runs: TestSummaryItemModel[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js new file mode 100644 index 00000000..957749b7 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryGroupModel = void 0; +class TestSummaryGroupModel { + constructor() { + this.runs = []; + } +} +exports.TestSummaryGroupModel = TestSummaryGroupModel; +//# sourceMappingURL=TestSummaryGroupModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js.map new file mode 100644 index 00000000..4b893cd0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryGroupModel.js","sourceRoot":"","sources":["TestSummaryGroupModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAAlC;QAIS,SAAI,GAA2B,EAAE,CAAC;IAC3C,CAAC;CAAA;AALD,sDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.d.ts new file mode 100644 index 00000000..d9a886e1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.d.ts @@ -0,0 +1,55 @@ +import { TestOutcomeForPriority } from "./TestOutcomeForPriority"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestSummaryItemModel { + private name; + private id; + private totalTestCount; + private testCountByOutcome; + private testCountForOutcomeByPriority; + private duration; + constructor($name: string, $id: string); + /** + * Getter $name + * @return {string} + */ + get $name(): string; + /** + * Getter $id + * @return {string} + */ + get $id(): string; + /** + * Getter $totalTestCount + * @return {number} + */ + get $totalTestCount(): number; + /** + * Getter $testCountByOutcome + * @return {Map} + */ + get $testCountByOutcome(): Map; + /** + * Getter $testCountForOutcomeByPriority + * @return {Map} + */ + get $testCountForOutcomeByPriority(): Map>; + /** + * Getter $duration + * @return {any} + */ + get $duration(): number; + /** + * Setter $totalTestCount + * @param {number} value + */ + set $totalTestCount(value: number); + /** + * Setter $duration + * @param {any} value + */ + set $duration(value: number); + getFailedTestsCount(): number; + getOtherTestsCount(): number; + getPassedTestsCount(): number; + private getTestOutcomeCount; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js new file mode 100644 index 00000000..6fc6b60f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js @@ -0,0 +1,91 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryItemModel = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +class TestSummaryItemModel { + constructor($name, $id) { + this.name = $name; + this.id = $id; + this.testCountByOutcome = new Map(); + this.testCountForOutcomeByPriority = new Map(); + } + /** + * Getter $name + * @return {string} + */ + get $name() { + return this.name; + } + /** + * Getter $id + * @return {string} + */ + get $id() { + return this.id; + } + /** + * Getter $totalTestCount + * @return {number} + */ + get $totalTestCount() { + return this.totalTestCount; + } + /** + * Getter $testCountByOutcome + * @return {Map} + */ + get $testCountByOutcome() { + return this.testCountByOutcome; + } + /** + * Getter $testCountForOutcomeByPriority + * @return {Map} + */ + get $testCountForOutcomeByPriority() { + return this.testCountForOutcomeByPriority; + } + /** + * Getter $duration + * @return {any} + */ + get $duration() { + return this.duration; + } + /** + * Setter $totalTestCount + * @param {number} value + */ + set $totalTestCount(value) { + this.totalTestCount = value; + } + /** + * Setter $duration + * @param {any} value + */ + set $duration(value) { + this.duration = value; + } + getFailedTestsCount() { + return this.getTestOutcomeCount(TestInterfaces_1.TestOutcome.Failed); + } + getOtherTestsCount() { + let totalCount = 0; + this.testCountByOutcome.forEach((value, key) => { + if (key != TestInterfaces_1.TestOutcome.Passed && key != TestInterfaces_1.TestOutcome.Failed) { + totalCount += value; + } + }); + return totalCount; + } + getPassedTestsCount() { + return this.getTestOutcomeCount(TestInterfaces_1.TestOutcome.Passed); + } + getTestOutcomeCount(testOutcome) { + if (this.testCountByOutcome.has(testOutcome)) { + return this.testCountByOutcome.get(testOutcome); + } + return 0; + } +} +exports.TestSummaryItemModel = TestSummaryItemModel; +//# sourceMappingURL=TestSummaryItemModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js.map new file mode 100644 index 00000000..a7c29bfd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryItemModel.js","sourceRoot":"","sources":["TestSummaryItemModel.ts"],"names":[],"mappings":";;;AACA,oFAA8E;AAE9E,MAAa,oBAAoB;IAQ/B,YAAY,KAAa,EAAE,GAAW;QACpC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;QACzD,IAAI,CAAC,6BAA6B,GAAG,IAAI,GAAG,EAA+C,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,8BAA8B;QACvC,OAAO,IAAI,CAAC,6BAA6B,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAGD;;;OAGG;IACH,IAAW,eAAe,CAAC,KAAa;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS,CAAC,KAAa;QAChC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEM,kBAAkB;QACvB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,GAAgB,EAAE,EAAE;YAClE,IAAI,GAAG,IAAI,4BAAW,CAAC,MAAM,IAAI,GAAG,IAAI,4BAAW,CAAC,MAAM,EAAE;gBAC1D,UAAU,IAAI,KAAK,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEO,mBAAmB,CAAC,WAAwB;QAClD,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;SACjD;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAxGD,oDAwGC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.d.ts new file mode 100644 index 00000000..54340d1d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.d.ts @@ -0,0 +1,15 @@ +import { Artifact } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export declare class ArtifactViewModelWrapper { + ArtifactViewModel: ArtifactViewModel[]; +} +export declare class ArtifactViewModel { + ArtifactDefinitionUrl: string; + BranchName: string; + BuildSummaryUrl: string; + Name: string; + Version: string; + IsPrimary: boolean; + constructor(artifact: Artifact, config: PipelineConfiguration); + private getArtifactInfo; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js new file mode 100644 index 00000000..999dcd2a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ArtifactViewModel = exports.ArtifactViewModelWrapper = void 0; +const util_1 = require("util"); +class ArtifactViewModelWrapper { +} +exports.ArtifactViewModelWrapper = ArtifactViewModelWrapper; +class ArtifactViewModel { + constructor(artifact, config) { + this.Version = this.getArtifactInfo(artifact, "version"); + this.BranchName = this.getArtifactInfo(artifact, "branch"); + this.Name = artifact.alias; + this.IsPrimary = artifact.isPrimary; + if (!util_1.isNullOrUndefined(artifact.definitionReference)) { + if (!util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl) && + !util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl.id)) { + this.ArtifactDefinitionUrl = artifact.definitionReference.artifactSourceDefinitionUrl.id; + } + if (!util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl) && + !util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl.id)) { + this.BuildSummaryUrl = artifact.definitionReference.artifactSourceVersionUrl.id; + } + } + } + getArtifactInfo(artifact, key) { + const sourceRef = artifact.definitionReference[key]; + return util_1.isNullOrUndefined(sourceRef) ? null : sourceRef.name; + } +} +exports.ArtifactViewModel = ArtifactViewModel; +//# sourceMappingURL=ArtifactViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js.map new file mode 100644 index 00000000..d26a37f4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ArtifactViewModel.js","sourceRoot":"","sources":["ArtifactViewModel.ts"],"names":[],"mappings":";;;AAEA,+BAAyC;AAGzC,MAAa,wBAAwB;CAEpC;AAFD,4DAEC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,QAAkB,EAAE,MAA6B;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;YACpD,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC;gBAC9E,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,CAAC,EAAE;gBACjF,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,CAAC;aAC1F;YAED,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC;gBAC3E,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE;gBAC9E,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,CAAC;aACjF;SACF;IACH,CAAC;IAEO,eAAe,CAAC,QAAkB,EAAE,GAAW;QACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,wBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IAC9D,CAAC;CACF;AA/BD,8CA+BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.d.ts new file mode 100644 index 00000000..ec082909 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.d.ts @@ -0,0 +1,11 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { BuildReference, Build } from "azure-devops-node-api/interfaces/BuildInterfaces"; +export declare class BuildReferenceViewModel { + Id: string; + Number: string; + Branch: string; + Url: string; + DefinitionUrl: string; + DefinitionName: string; + constructor(config: PipelineConfiguration, buildReference: BuildReference, build: Build); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js new file mode 100644 index 00000000..68ee5557 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildReferenceViewModel = void 0; +const LinkHelper_1 = require("../helpers/LinkHelper"); +const util_1 = require("util"); +class BuildReferenceViewModel { + constructor(config, buildReference, build) { + if (buildReference != null) { + this.Id = buildReference.id.toString(); + this.Number = buildReference.buildNumber; + if (!util_1.isNullOrUndefined(buildReference._links) && !util_1.isNullOrUndefined(buildReference._links.web) && !util_1.isNullOrUndefined(buildReference._links.web.href)) { + this.Url = buildReference._links.web.href; + } + } + else if (build != null) { + this.Id = build.id.toString(); + this.Number = build.buildNumber; + this.Branch = build.sourceBranch; + if (!util_1.isNullOrUndefined(build._links) && !util_1.isNullOrUndefined(build._links.web) && !util_1.isNullOrUndefined(build._links.web.href)) { + this.Url = build._links.web.href; + } + this.DefinitionUrl = LinkHelper_1.LinkHelper.getBuildDefinitionLinkById(build.definition.id, config); + this.DefinitionName = build.definition.name; + } + } +} +exports.BuildReferenceViewModel = BuildReferenceViewModel; +//# sourceMappingURL=BuildReferenceViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js.map new file mode 100644 index 00000000..88ab2f9d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildReferenceViewModel.js","sourceRoot":"","sources":["BuildReferenceViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,+BAAyC;AAEzC,MAAa,uBAAuB;IAQlC,YAAY,MAA6B,EAAE,cAA8B,EAAE,KAAY;QACrF,IAAG,cAAc,IAAI,IAAI,EAAE;YACzB,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC;YACzC,IAAG,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnJ,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAC3C;SACF;aAAM,IAAI,KAAK,IAAI,IAAI,EAAE;YACxB,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YACjC,IAAG,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACxH,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAClC;YACD,IAAI,CAAC,aAAa,GAAG,uBAAU,CAAC,0BAA0B,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACxF,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;SAC7C;IACH,CAAC;CACF;AA1BD,0DA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.d.ts new file mode 100644 index 00000000..af5beb94 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.d.ts @@ -0,0 +1,15 @@ +import { ChangeModel } from "../ChangeModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export declare class ChangeViewModelWrapper { + ChangeViewModel: ChangeViewModel[]; +} +export declare class ChangeViewModel { + readonly ConstHashLength = 8; + AuthorName: string; + Id: string; + Message: string; + TimeStamp: string; + Url: string; + ShortId: string; + constructor(change: ChangeModel, config: PipelineConfiguration); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js new file mode 100644 index 00000000..e3e7c956 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ChangeViewModel = exports.ChangeViewModelWrapper = void 0; +const StringUtils_1 = require("../../utils/StringUtils"); +const LinkHelper_1 = require("../helpers/LinkHelper"); +class ChangeViewModelWrapper { +} +exports.ChangeViewModelWrapper = ChangeViewModelWrapper; +class ChangeViewModel { + constructor(change, config) { + this.ConstHashLength = 8; + this.Id = change.$id; + this.ShortId = isNaN(Number.parseInt(this.Id)) ? this.Id : this.Id.substring(0, this.ConstHashLength); + this.Message = StringUtils_1.StringUtils.CompressNewLines(change.$message); + this.AuthorName = change.$author == null ? null : change.$author.displayName; + this.TimeStamp = change.$timeStamp.toDateString(); + this.Url = LinkHelper_1.LinkHelper.getCommitLink(change.$id, change.$location, config); + } +} +exports.ChangeViewModel = ChangeViewModel; +//# sourceMappingURL=ChangeViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js.map new file mode 100644 index 00000000..f4fc902c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ChangeViewModel.js","sourceRoot":"","sources":["ChangeViewModel.ts"],"names":[],"mappings":";;;AAEA,yDAAsD;AACtD,sDAAmD;AAEnD,MAAa,sBAAsB;CAElC;AAFD,wDAEC;AAED,MAAa,eAAe;IAS1B,YAAY,MAAmB,EAAE,MAA6B;QAR9C,oBAAe,GAAG,CAAC,CAAC;QASlC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACtG,IAAI,CAAC,OAAO,GAAG,yBAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7E,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAElD,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;CACF;AAlBD,0CAkBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.d.ts new file mode 100644 index 00000000..9ef5f238 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.d.ts @@ -0,0 +1,10 @@ +import { JobModel } from "../JobModel"; +import { TaskResultViewModelWrapper } from "./TaskResultViewModel"; +export declare class DeploymentJobViewModel { + Tasks: TaskResultViewModelWrapper; + MinTaskStartTime: Date; + MaxTaskFinishTime: Date; + constructor(jobs: JobModel[]); + private getMinTime; + private getMaxTime; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js new file mode 100644 index 00000000..b723545f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DeploymentJobViewModel = void 0; +const TaskResultViewModel_1 = require("./TaskResultViewModel"); +class DeploymentJobViewModel { + constructor(jobs) { + this.Tasks = new TaskResultViewModel_1.TaskResultViewModelWrapper(); + this.Tasks.TaskResultViewModel = []; + if (jobs.length > 0) { + let taskIndex = 0; + let releaseTasks = []; + do { + releaseTasks = []; + jobs.forEach(job => { + // Not all jobs have same set of tasks + if (taskIndex < job.$tasks.length) { + releaseTasks.push(job.$tasks[taskIndex]); + this.MinTaskStartTime = this.getMinTime(this.MinTaskStartTime, job.$tasks[taskIndex].$startTime); + this.MaxTaskFinishTime = this.getMaxTime(this.MaxTaskFinishTime, job.$tasks[taskIndex].$finishTime); + } + }); + if (releaseTasks != null && releaseTasks.length > 0) { + this.Tasks.TaskResultViewModel.push(new TaskResultViewModel_1.TaskResultViewModel(releaseTasks)); + } + taskIndex++; + } while (releaseTasks.length > 0); + } + } + getMinTime(time1, time2) { + if (time1 == null) { + return time2; + } + else if (time2 != null && time2 < time1) { + return time2; + } + return time1; + } + getMaxTime(time1, time2) { + if (time1 == null) { + return time2; + } + else if (time2 != null && time2 > time1) { + return time2; + } + return time1; + } +} +exports.DeploymentJobViewModel = DeploymentJobViewModel; +//# sourceMappingURL=DeploymentJobViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js.map new file mode 100644 index 00000000..bece72f8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DeploymentJobViewModel.js","sourceRoot":"","sources":["DeploymentJobViewModel.ts"],"names":[],"mappings":";;;AAEA,+DAAwF;AAExF,MAAa,sBAAsB;IAKjC,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,gDAA0B,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,YAAY,GAAgB,EAAE,CAAC;YACnC,GAAG;gBACD,YAAY,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBACjB,sCAAsC;oBACtC,IAAI,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;wBACjC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;wBACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC;wBACjG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;qBACrG;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;iBAC5E;gBAED,SAAS,EAAE,CAAC;aAEb,QAAQ,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;SACnC;IACH,CAAC;IAEO,UAAU,CAAC,KAAW,EAAE,KAAW;QACzC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;aACI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,KAAW,EAAE,KAAW;QACzC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;aACI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAtDD,wDAsDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.d.ts new file mode 100644 index 00000000..bf616383 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.d.ts @@ -0,0 +1,38 @@ +import { Report } from "../Report"; +import { ReportConfiguration } from "../../config/ReportConfiguration"; +import { ReleaseViewModel } from "./ReleaseViewModel"; +import { PhaseViewModelWrapper } from "./PhaseViewModel"; +import { PhaseIssuesViewModel } from "./PhaseIssuesViewModel"; +import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; +import { ArtifactViewModelWrapper } from "./ArtifactViewModel"; +import { ChangeViewModelWrapper } from "./ChangeViewModel"; +import { TestSummaryGroupViewModelWrapper } from "./TestSummaryGroupViewModel"; +import { TestResultsGroupViewModelWrapper } from "./TestResultsGroupViewModel"; +export declare class EmailReportViewModel { + DataMissing: boolean; + HasTestResultsToShow: boolean; + HasFailedTests: boolean; + HasFilteredTests: boolean; + HasTaskFailures: boolean; + HasCanceledPhases: boolean; + MaxTestResultsToShow: number; + ProjectName: string; + Release: ReleaseViewModel; + Build: any; + Phases: PhaseViewModelWrapper; + PhaseIssuesSummary: PhaseIssuesViewModel; + AllTests: TestResultSummaryViewModel; + Artifacts: ArtifactViewModelWrapper; + AssociatedChanges: ChangeViewModelWrapper; + SummaryGroups: TestSummaryGroupViewModelWrapper; + TestResultsGroups: TestResultsGroupViewModelWrapper; + TestTabLink: string; + ShowAssociatedChanges: boolean; + constructor(report: Report, reportConfiguration: ReportConfiguration); + private InitializePhases; + private SetMailSubject; + private InitializeAssociatedChanges; + private InitializeSummaryGroupViewModel; + private InitializeTestResultGroups; + private GetPassPercentage; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js new file mode 100644 index 00000000..88dac581 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js @@ -0,0 +1,132 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EmailReportViewModel = void 0; +const util_1 = require("util"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const LinkHelper_1 = require("../helpers/LinkHelper"); +const PhaseViewModel_1 = require("./PhaseViewModel"); +const PhaseIssuesViewModel_1 = require("./PhaseIssuesViewModel"); +const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); +const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); +const ArtifactViewModel_1 = require("./ArtifactViewModel"); +const ChangeViewModel_1 = require("./ChangeViewModel"); +const TestSummaryGroupViewModel_1 = require("./TestSummaryGroupViewModel"); +const TestResultsGroupViewModel_1 = require("./TestResultsGroupViewModel"); +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +class EmailReportViewModel { + constructor(report, reportConfiguration) { + this.ProjectName = reportConfiguration.$pipelineConfiguration.$projectName; + this.HasTaskFailures = report.hasFailedTasks(); + if (reportConfiguration.$pipelineConfiguration.$pipelineType == PipelineType_1.PipelineType.Build) { + this.Build = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration); + } + else { + this.Release = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration); + } + this.Artifacts = new ArtifactViewModel_1.ArtifactViewModelWrapper(); + this.Artifacts.ArtifactViewModel = report.getArtifactViewModels(reportConfiguration.$pipelineConfiguration); + this.HasCanceledPhases = report.hasCanceledPhases(); + this.InitializePhases(report); + this.SetMailSubject(report, reportConfiguration); + this.HasFailedTests = report.hasFailedTests(reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); + if (report.testResultSummary != null) { + this.AllTests = new TestResultSummaryViewModel_1.TestResultSummaryViewModel(null, report.testResultSummary, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); + } + this.InitializeSummaryGroupViewModel(report, reportConfiguration); + this.ShowAssociatedChanges = reportConfiguration.$reportDataConfiguration.$includeCommits; + if (this.ShowAssociatedChanges) { + this.InitializeAssociatedChanges(report, reportConfiguration.$pipelineConfiguration); + } + this.InitializeTestResultGroups(report, reportConfiguration); + this.TestTabLink = LinkHelper_1.LinkHelper.getTestTabLink(reportConfiguration.$pipelineConfiguration); + this.DataMissing = report.$dataMissing; + } + InitializePhases(report) { + const phases = []; + if (util_1.isNullOrUndefined(report.$phases) || report.$phases.length < 1) { + return; + } + report.$phases.forEach(phase => { + phases.push(new PhaseViewModel_1.PhaseViewModel(phase)); + }); + this.Phases = new PhaseViewModel_1.PhaseViewModelWrapper(); + this.Phases.PhaseViewModel = phases; + if (this.HasCanceledPhases) { + this.PhaseIssuesSummary = new PhaseIssuesViewModel_1.PhaseIssuesViewModel(report.$phases); + } + } + SetMailSubject(report, reportConfig) { + var subject = reportConfig.$mailConfiguration.$mailSubject; + if (subject.includes("{passPercentage}")) { + var passPercentage = this.GetPassPercentage(report, reportConfig.$reportDataConfiguration.$includeOthersInTotal); + subject = subject.replace("{passPercentage}", passPercentage); + } + if (subject.includes("{environmentStatus}")) { + subject = subject.replace("{environmentStatus}", report.getEnvironmentStatus()); + } + reportConfig.$mailConfiguration.$mailSubject = subject; + } + InitializeAssociatedChanges(report, pipelineConfig) { + if (!util_1.isNullOrUndefined(report.$associatedChanges) && report.$associatedChanges.length > 0) { + this.AssociatedChanges = new ChangeViewModel_1.ChangeViewModelWrapper(); + this.AssociatedChanges.ChangeViewModel = []; + report.$associatedChanges.forEach(associatedChange => { + this.AssociatedChanges.ChangeViewModel.push(new ChangeViewModel_1.ChangeViewModel(associatedChange, pipelineConfig)); + }); + } + } + InitializeSummaryGroupViewModel(report, reportConfiguration) { + this.SummaryGroups = new TestSummaryGroupViewModel_1.TestSummaryGroupViewModelWrapper(); + this.SummaryGroups.TestSummaryGroupViewModel = []; + if (!util_1.isNullOrUndefined(report.$testSummaryGroups)) { + report.$testSummaryGroups.forEach(summaryGroup => { + reportConfiguration.$reportDataConfiguration.$groupTestSummaryBy.forEach(group => { + if (summaryGroup.groupedBy == group) { + console.log(`Creating summary group viewmodel for ${summaryGroup.groupedBy}`); + this.SummaryGroups.TestSummaryGroupViewModel.push(new TestSummaryGroupViewModel_1.TestSummaryGroupViewModel(summaryGroup, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal)); + } + }); + }); + } + } + InitializeTestResultGroups(report, reportConfig) { + this.TestResultsGroups = new TestResultsGroupViewModel_1.TestResultsGroupViewModelWrapper(); + this.TestResultsGroups.TestResultsGroupViewModel = []; + if (report.filteredResults != null) { + report.filteredResults.forEach(testResultGroupModel => { + var testResultsGroupViewModel = new TestResultsGroupViewModel_1.TestResultsGroupViewModel(testResultGroupModel, reportConfig); + this.TestResultsGroups.TestResultsGroupViewModel.push(testResultsGroupViewModel); + }); + } + this.HasFilteredTests = report.hasFilteredTests; + if (this.TestResultsGroups.TestResultsGroupViewModel.length > 0) { + const testResultsConfig = reportConfig.$reportDataConfiguration.$testResultsConfig; + if (testResultsConfig.$includePassedTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.PassedTests.TestResultViewModel.length > 0).length > 0; + } + if (testResultsConfig.$includeFailedTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.FailedTests.TestResultViewModel.length > 0).length > 0; + } + if (testResultsConfig.$includeOtherTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.OtherTests.TestResultViewModel.length > 0).length > 0; + } + } + } + GetPassPercentage(report, includeOthersInTotal) { + var summary = report.testResultSummary; + let passedTests = 0, totalTests = 0; + if (summary != null) { + const passedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Passed]; + passedTests = util_1.isNullOrUndefined(passedTestsAggregation) ? 0 : passedTestsAggregation.count; + const failedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; + const failedTests = util_1.isNullOrUndefined(failedTestsAggregation) ? 0 : failedTestsAggregation.count; + totalTests = summary.aggregatedResultsAnalysis.totalTests; + if (!includeOthersInTotal) { + totalTests = passedTests + failedTests; + } + } + return TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(passedTests, totalTests); + } +} +exports.EmailReportViewModel = EmailReportViewModel; +//# sourceMappingURL=EmailReportViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js.map new file mode 100644 index 00000000..88e2c7cb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EmailReportViewModel.js","sourceRoot":"","sources":["EmailReportViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.d.ts new file mode 100644 index 00000000..def8692e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.d.ts @@ -0,0 +1,18 @@ +import { MailConfiguration } from "../../config/mail/MailConfiguration"; +import { Report } from "../Report"; +export declare class MailAddressViewModel { + cc: string[]; + from: string; + to: string[]; + private defaultDomain; + constructor(report: Report, mailConfig: MailConfiguration); + private getMailAddresses; + private getFailedTestOwners; + private getActiveBugOwnersForFailedTests; + private getChangesetOwners; + private filterValidMailAddresses; + private getValidEmailAddress; + private isValidEmail; + private getMailAddressFromIdentityRef; + private getUniqueName; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js new file mode 100644 index 00000000..f6cf22ed --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js @@ -0,0 +1,128 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MailAddressViewModel = void 0; +const util_1 = require("util"); +const StringUtils_1 = require("../../utils/StringUtils"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +class MailAddressViewModel { + constructor(report, mailConfig) { + this.cc = []; + this.to = []; + this.from = mailConfig.$smtpConfig.$userName; + this.defaultDomain = mailConfig.$defaultDomain; + console.log("computing email addresses for to section"); + this.to = this.getMailAddresses(report, mailConfig.$toRecipientsConfig); + console.log("computing email addresses for Cc section"); + this.cc = this.getMailAddresses(report, mailConfig.$ccRecipientsConfig); + } + getMailAddresses(report, recipientsConfiguration) { + var addressHashSet = new Set(); + if (recipientsConfiguration.$includeTestOwners) { + const owners = this.getFailedTestOwners(report); + owners.forEach(o => addressHashSet.add(o)); + } + if (recipientsConfiguration.$includeActiveBugOwners) { + const bugOwners = this.getActiveBugOwnersForFailedTests(report); + bugOwners.forEach(o => addressHashSet.add(o)); + } + if (recipientsConfiguration.$includeChangesetOwners) { + const changesetOwners = this.getChangesetOwners(report.$associatedChanges); + changesetOwners.forEach(o => addressHashSet.add(o)); + } + if (recipientsConfiguration.$includeCreatedBy) { + if (!util_1.isNullOrUndefined(report.createdBy)) { + addressHashSet.add(report.createdBy.uniqueName); + } + } + if (!util_1.isNullOrUndefined(recipientsConfiguration.$defaultRecipients)) { + recipientsConfiguration.$defaultRecipients.split(";").forEach(a => addressHashSet.add(a)); + } + return this.filterValidMailAddresses(addressHashSet); + } + getFailedTestOwners(report) { + var mailAddresses = []; + if (!util_1.isNullOrUndefined(report.$failedTestOwners)) { + report.$failedTestOwners.forEach(identity => { + var mailAddress = this.getMailAddressFromIdentityRef(identity); + if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(mailAddress)) { + mailAddresses.push(mailAddress); + } + }); + } + console.log(`Failed Test owners - ${mailAddresses.join(",")}`); + return mailAddresses; + } + getActiveBugOwnersForFailedTests(report) { + if (report.filteredResults == null) { + return []; + } + const bugOwners = []; + report.filteredResults.forEach(group => { + if (group.testResults.has(TestInterfaces_1.TestOutcome.Failed)) { + group.testResults.forEach(tr => { + tr.forEach(tr => { + tr.associatedBugs.forEach(bug => { + const bugState = bug.fields["System.State"]; + if (!util_1.isNullOrUndefined(bugState) && bugState.toLowerCase() == "Active".toLowerCase()) { + bugOwners.push(bug.fields["System.AssignedTo"]); + } + }); + }); + }); + } + }); + console.log(`Failed Test owners - ${bugOwners.join(",")}`); + return bugOwners; + } + getChangesetOwners(associatedChanges) { + var mailAddresses = []; + if (!util_1.isNullOrUndefined(associatedChanges) && associatedChanges.length < 1) { + console.log("No changeset owner mail addresses"); + return mailAddresses; + } + associatedChanges.forEach(associatedChange => { + var mailAddress = associatedChange.$author.uniqueName; + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(mailAddress)) { + console.log(`Unable to get mail address for associated change - ${associatedChange.$id}`); + } + else { + mailAddresses.push(mailAddress); + } + }); + console.log(`Changeset owner mail addresses - ${mailAddresses.join(",")}`); + return mailAddresses; + } + filterValidMailAddresses(addressHashSet) { + var mailAddresses = []; + addressHashSet.forEach(address => { + var validAddress = this.getValidEmailAddress(address); + if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(validAddress)) { + mailAddresses.push(validAddress); + } + }); + return mailAddresses; + } + getValidEmailAddress(address) { + if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(address) && !this.isValidEmail(address)) { + console.log(`Address ${address} is not a valid email address. Adding domain: ${this.defaultDomain}`); + address = `${address}@${this.defaultDomain}`; + } + return address; + } + isValidEmail(email) { + var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(String(email)); + } + getMailAddressFromIdentityRef(identity) { + if (!identity.isContainer) { + return this.getUniqueName(identity); + } + console.log(`Not fetching email address for container - ${identity.displayName}`); + return null; + } + getUniqueName(identity) { + return identity.uniqueName == null ? identity.displayName : identity.uniqueName; + } +} +exports.MailAddressViewModel = MailAddressViewModel; +//# sourceMappingURL=MailAddressViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js.map new file mode 100644 index 00000000..af2439d7 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MailAddressViewModel.js","sourceRoot":"","sources":["MailAddressViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.d.ts new file mode 100644 index 00000000..351ef469 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.d.ts @@ -0,0 +1,7 @@ +import { TaskResultViewModelWrapper } from "./TaskResultViewModel"; +import { PhaseModel } from "../PhaseModel"; +export declare class PhaseIssuesViewModel { + Tasks: TaskResultViewModelWrapper; + Name: string; + constructor(phases: PhaseModel[]); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js new file mode 100644 index 00000000..110679ef --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PhaseIssuesViewModel = void 0; +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const TaskResultViewModel_1 = require("./TaskResultViewModel"); +const TaskModel_1 = require("../TaskModel"); +class PhaseIssuesViewModel { + constructor(phases) { + ///

+ /// Use TaskResultViewModel as Phase level issue as the viewmodel is same + /// + this.Tasks = new TaskResultViewModel_1.TaskResultViewModelWrapper(); + this.Name = "Phase Issues"; + this.Tasks.TaskResultViewModel = []; + phases.forEach(phase => { + if (phase != null && phase.$jobs != null) { + const canceledJobs = phase.$jobs.filter(job => job.$jobStatus == ReleaseInterfaces_1.TaskStatus.Canceled); + if (canceledJobs.length > 0) { + var failedJobsAsTasks = canceledJobs.map(job => { + return new TaskModel_1.TaskModel(job.$jobName, job.$jobStatus, job.$issues, null, null, null); + }); + var taskResViewModel = new TaskResultViewModel_1.TaskResultViewModel(failedJobsAsTasks); + taskResViewModel.IssuesSummary.ErrorMessage = `Failed on ${canceledJobs.length}/${phase.$jobs.length} Agents`; + this.Tasks.TaskResultViewModel.push(taskResViewModel); + } + } + }); + } +} +exports.PhaseIssuesViewModel = PhaseIssuesViewModel; +//# sourceMappingURL=PhaseIssuesViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js.map new file mode 100644 index 00000000..b351c0f9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PhaseIssuesViewModel.js","sourceRoot":"","sources":["PhaseIssuesViewModel.ts"],"names":[],"mappings":";;;AAAA,0FAAgF;AAChF,+DAAwF;AAExF,4CAAyC;AAEzC,MAAa,oBAAoB;IAO/B,YAAY,MAAoB;QANhC,aAAa;QACb,yEAAyE;QACzE,cAAc;QACP,UAAK,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAI1E,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;gBACxC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,8BAAU,CAAC,QAAQ,CAAC,CAAC;gBACtF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3B,IAAI,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBAC7C,OAAO,IAAI,qBAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBACpF,CAAC,CAAC,CAAC;oBACH,IAAI,gBAAgB,GAAG,IAAI,yCAAmB,CAAC,iBAAiB,CAAC,CAAC;oBAClE,gBAAgB,CAAC,aAAa,CAAC,YAAY,GAAG,aAAa,YAAY,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;oBAC9G,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;iBACvD;aACF;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAxBD,oDAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.d.ts new file mode 100644 index 00000000..af1b7f7f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.d.ts @@ -0,0 +1,15 @@ +import { DeploymentJobViewModel } from "./DeploymentJobViewModel"; +import { PhaseModel } from "../PhaseModel"; +export declare class PhaseViewModelWrapper { + PhaseViewModel: PhaseViewModel[]; +} +export declare class PhaseViewModel { + DeploymentJob: DeploymentJobViewModel; + TasksDuration: string; + Status: string; + Rank: number; + Name: string; + constructor(phase: PhaseModel); + private InitializeDeploymentJobs; + private InitializeTasksDuration; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js new file mode 100644 index 00000000..51d18967 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PhaseViewModel = exports.PhaseViewModelWrapper = void 0; +const DeploymentJobViewModel_1 = require("./DeploymentJobViewModel"); +const TimeFormatter_1 = require("../helpers/TimeFormatter"); +class PhaseViewModelWrapper { +} +exports.PhaseViewModelWrapper = PhaseViewModelWrapper; +class PhaseViewModel { + constructor(phase) { + this.Status = phase.$status; + this.Rank = phase.$rank; + this.Name = phase.$name; + this.InitializeDeploymentJobs(phase); + } + InitializeDeploymentJobs(phase) { + const deploymentJobs = phase.$jobs; + if (deploymentJobs.length > 0) { + this.DeploymentJob = new DeploymentJobViewModel_1.DeploymentJobViewModel(deploymentJobs); + this.InitializeTasksDuration(); + } + else { + // This can happen if we have an empty phase or a phase with only disabled steps + console.warn(`No deployment jobs found in phase ${this.Name}`); + } + } + InitializeTasksDuration() { + // Evaluate job duration and format it + if (this.DeploymentJob.MaxTaskFinishTime != null && this.DeploymentJob.MinTaskStartTime != null) { + this.TasksDuration = `${TimeFormatter_1.TimeFormatter.FormatDuration(this.DeploymentJob.MaxTaskFinishTime.getTime() - this.DeploymentJob.MinTaskStartTime.getTime())}`; + } + } +} +exports.PhaseViewModel = PhaseViewModel; +//# sourceMappingURL=PhaseViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js.map new file mode 100644 index 00000000..9126235d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PhaseViewModel.js","sourceRoot":"","sources":["PhaseViewModel.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAElE,4DAAyD;AAEzD,MAAa,qBAAqB;CAEjC;AAFD,sDAEC;AAED,MAAa,cAAc;IAOzB,YAAY,KAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,wBAAwB,CAAC,KAAiB;QAChD,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC;QAEnC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,+CAAsB,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAChC;aACI;YACH,gFAAgF;YAChF,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SAChE;IACH,CAAC;IAEO,uBAAuB;QAC7B,sCAAsC;QACtC,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,gBAAgB,IAAI,IAAI,EAAE;YAC/F,IAAI,CAAC,aAAa,GAAG,GAAG,6BAAa,CAAC,cAAc,CAClD,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;SACrG;IACH,CAAC;CACF;AAlCD,wCAkCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.d.ts new file mode 100644 index 00000000..2124209c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.d.ts @@ -0,0 +1,6 @@ +import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +export declare class ReleaseEnvironmentViewModel { + EnvironmentName: string; + EnvironmentOwnerEmail: string; + constructor(environment: ReleaseEnvironment); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js new file mode 100644 index 00000000..6669729c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseEnvironmentViewModel = void 0; +class ReleaseEnvironmentViewModel { + constructor(environment) { + this.EnvironmentName = environment == null ? null : environment.name; + this.EnvironmentOwnerEmail = environment != null && environment.owner != null ? environment.owner.uniqueName : null; + } +} +exports.ReleaseEnvironmentViewModel = ReleaseEnvironmentViewModel; +//# sourceMappingURL=ReleaseEnvironmentViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js.map new file mode 100644 index 00000000..d13d67d3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseEnvironmentViewModel.js","sourceRoot":"","sources":["ReleaseEnvironmentViewModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,2BAA2B;IAItC,YAAY,WAA+B;QACzC,IAAI,CAAC,eAAe,GAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QACrE,IAAI,CAAC,qBAAqB,GAAG,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IACtH,CAAC;CACF;AARD,kEAQC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.d.ts new file mode 100644 index 00000000..b777d56d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.d.ts @@ -0,0 +1,8 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReleaseReference } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +export declare class ReleaseReferenceViewModel { + Id: number; + Name: string; + Url: string; + constructor(config: PipelineConfiguration, releaseReference: ReleaseReference); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js new file mode 100644 index 00000000..552b3b6e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseReferenceViewModel = void 0; +const LinkHelper_1 = require("../helpers/LinkHelper"); +class ReleaseReferenceViewModel { + constructor(config, releaseReference) { + this.Id = releaseReference.id; + this.Name = releaseReference.name; + this.Url = LinkHelper_1.LinkHelper.getReleaseSummaryLink(config); + } +} +exports.ReleaseReferenceViewModel = ReleaseReferenceViewModel; +//# sourceMappingURL=ReleaseReferenceViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js.map new file mode 100644 index 00000000..d4f2c9ad --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseReferenceViewModel.js","sourceRoot":"","sources":["ReleaseReferenceViewModel.ts"],"names":[],"mappings":";;;AAAA,sDAAmD;AAInD,MAAa,yBAAyB;IAKpC,YAAY,MAA6B,EAAE,gBAAkC;QAC3E,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;CACF;AAVD,8DAUC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.d.ts new file mode 100644 index 00000000..a17f897f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.d.ts @@ -0,0 +1,13 @@ +import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReleaseEnvironmentViewModel } from "./ReleaseEnvironmentViewModel"; +export declare class ReleaseViewModel { + CurrentEnvironment: ReleaseEnvironmentViewModel; + ReleaseDefinitionName: string; + ReleaseDefinitionUrl: string; + ReleaseId: number; + ReleaseName: string; + ReleaseSummaryUrl: string; + ReleaseLogsLink: string; + constructor(currentEnvironment: ReleaseEnvironment, releaseConfig: PipelineConfiguration); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js new file mode 100644 index 00000000..54e00f22 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseViewModel = void 0; +const LinkHelper_1 = require("../helpers/LinkHelper"); +const ReleaseEnvironmentViewModel_1 = require("./ReleaseEnvironmentViewModel"); +const util_1 = require("util"); +class ReleaseViewModel { + constructor(currentEnvironment, releaseConfig) { + if (currentEnvironment != null) { + this.CurrentEnvironment = new ReleaseEnvironmentViewModel_1.ReleaseEnvironmentViewModel(currentEnvironment); + this.ReleaseDefinitionName = currentEnvironment.releaseDefinition == null ? null : currentEnvironment.releaseDefinition.name; + if (currentEnvironment.releaseDefinition != null) { + this.ReleaseDefinitionUrl = LinkHelper_1.LinkHelper.getReleaseDefinitionLink(releaseConfig, currentEnvironment.releaseDefinition.id); + } + this.ReleaseName = currentEnvironment.release == null ? null : currentEnvironment.release.name; + } + this.ReleaseId = releaseConfig.$pipelineId; + if (!util_1.isNullOrUndefined(currentEnvironment.release) && !util_1.isNullOrUndefined(currentEnvironment.release._links) && !util_1.isNullOrUndefined(currentEnvironment.release._links.web)) { + this.ReleaseSummaryUrl = currentEnvironment.release._links.web.href; + } + this.ReleaseLogsLink = LinkHelper_1.LinkHelper.getReleaseLogsTabLink(releaseConfig); + } +} +exports.ReleaseViewModel = ReleaseViewModel; +//# sourceMappingURL=ReleaseViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js.map new file mode 100644 index 00000000..e1966291 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseViewModel.js","sourceRoot":"","sources":["ReleaseViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,+EAA4E;AAC5E,+BAAyC;AAEzC,MAAa,gBAAgB;IAS3B,YAAY,kBAAsC,EAAE,aAAoC;QACtF,IAAI,kBAAkB,IAAI,IAAI,EAAE;YAC9B,IAAI,CAAC,kBAAkB,GAAG,IAAI,yDAA2B,CAAC,kBAAkB,CAAC,CAAC;YAC9E,IAAI,CAAC,qBAAqB,GAAG,kBAAkB,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAE7H,IAAI,kBAAkB,CAAC,iBAAiB,IAAI,IAAI,EAAE;gBAChD,IAAI,CAAC,oBAAoB,GAAG,uBAAU,CAAC,wBAAwB,CAAC,aAAa,EAC3E,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;aAC5C;YAED,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC;SAChG;QAED,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC;QAC3C,IAAG,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACvK,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;SACrE;QACD,IAAI,CAAC,eAAe,GAAG,uBAAU,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACzE,CAAC;CACF;AA5BD,4CA4BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.d.ts new file mode 100644 index 00000000..76748801 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.d.ts @@ -0,0 +1,14 @@ +import { TaskIssueViewModel, TaskIssueViewModelWrapper } from "./TaskIssueViewModel"; +import { TaskModel } from "../TaskModel"; +export declare class TaskIssueSummaryViewModel { + Issues: TaskIssueViewModelWrapper; + ErrorMessage: string; + ErrorCount: number; + WarningCount: number; + constructor(tasks: TaskModel[]); + TruncateIssues(issues: TaskIssueViewModel[], characterLimit?: number): TaskIssueViewModel[]; +} +export declare class IssueTypeConstants { + static readonly Error = "error"; + static readonly Warning = "warning"; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js new file mode 100644 index 00000000..d2ac789c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js @@ -0,0 +1,58 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IssueTypeConstants = exports.TaskIssueSummaryViewModel = void 0; +const TaskIssueViewModel_1 = require("./TaskIssueViewModel"); +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const StringUtils_1 = require("../../utils/StringUtils"); +class TaskIssueSummaryViewModel { + constructor(tasks) { + this.ErrorMessage = ""; + this.ErrorCount = 0; + this.WarningCount = 0; + var allIssues = []; + this.ErrorMessage = `Failed on ${tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Failed || t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length}/${tasks.length} Agents`; + tasks.forEach(task => { + if (task.$issues != null && task.$issues.length > 0) { + task.$issues.forEach(issue => { + if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(issue.$message)) { + if (issue.$issueType.toLowerCase() == IssueTypeConstants.Error) { + this.ErrorCount++; + } + else if (issue.$issueType.toLowerCase() == IssueTypeConstants.Warning) { + this.WarningCount++; + } + allIssues.push(new TaskIssueViewModel_1.TaskIssueViewModel(issue.$message, issue.$issueType, task.$agentName)); + } + }); + } + }); + this.Issues = new TaskIssueViewModel_1.TaskIssueViewModelWrapper(); + this.Issues.TaskIssueViewModel = this.TruncateIssues(allIssues); + } + TruncateIssues(issues, characterLimit = 1000) { + const truncatedIssues = []; + var warningIssues = issues.filter(t => t.IssueType.toLowerCase() != IssueTypeConstants.Error); + var errorIssues = issues.filter(t => t.IssueType.toLowerCase() == IssueTypeConstants.Error); + const sortedIssues = []; + sortedIssues.push(...warningIssues); + sortedIssues.push(...errorIssues); + let currentCharCount = 0; + for (var i = 0; i < sortedIssues.length; i++) { + const issue = sortedIssues[i]; + if (currentCharCount >= characterLimit) { + return truncatedIssues; + } + issue.Message = issue.Message.substring(0, characterLimit - currentCharCount); + currentCharCount += issue.Message.length; + truncatedIssues.push(issue); + } + return truncatedIssues; + } +} +exports.TaskIssueSummaryViewModel = TaskIssueSummaryViewModel; +class IssueTypeConstants { +} +exports.IssueTypeConstants = IssueTypeConstants; +IssueTypeConstants.Error = "error"; +IssueTypeConstants.Warning = "warning"; +//# sourceMappingURL=TaskIssueSummaryViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js.map new file mode 100644 index 00000000..18f293c1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskIssueSummaryViewModel.js","sourceRoot":"","sources":["TaskIssueSummaryViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.d.ts new file mode 100644 index 00000000..4818465a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.d.ts @@ -0,0 +1,9 @@ +export declare class TaskIssueViewModelWrapper { + TaskIssueViewModel: TaskIssueViewModel[]; +} +export declare class TaskIssueViewModel { + Message: string; + IssueType: string; + AgentName: string; + constructor(issueMessage: string, issueType: string, agentName: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js new file mode 100644 index 00000000..6b55d0f3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskIssueViewModel = exports.TaskIssueViewModelWrapper = void 0; +class TaskIssueViewModelWrapper { +} +exports.TaskIssueViewModelWrapper = TaskIssueViewModelWrapper; +class TaskIssueViewModel { + constructor(issueMessage, issueType, agentName) { + this.Message = `(${agentName}) ${issueMessage.trim()}`; + this.IssueType = issueType; + this.AgentName = agentName; + } +} +exports.TaskIssueViewModel = TaskIssueViewModel; +//# sourceMappingURL=TaskIssueViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js.map new file mode 100644 index 00000000..c68bb95a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskIssueViewModel.js","sourceRoot":"","sources":["TaskIssueViewModel.ts"],"names":[],"mappings":";;;AAAA,MAAa,yBAAyB;CAErC;AAFD,8DAEC;AAED,MAAa,kBAAkB;IAM7B,YAAY,YAAoB,EAAE,SAAiB,EAAE,SAAiB;QACpE,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,KAAK,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAXD,gDAWC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.d.ts new file mode 100644 index 00000000..7342ec72 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.d.ts @@ -0,0 +1,24 @@ +import { TaskIssueSummaryViewModel } from "./TaskIssueSummaryViewModel"; +import { TaskModel } from "../TaskModel"; +export declare class TaskResultViewModelWrapper { + TaskResultViewModel: TaskResultViewModel[]; +} +export declare class TaskResultViewModel { + Duration: string; + HasFailed: boolean; + HasSkipped: boolean; + NotYetRun: boolean; + HasPartiallySucceeded: boolean; + HasNotRunOnSomeAgents: boolean; + GotCancelled: boolean; + NotRunMessage: string; + IssuesSummary: TaskIssueSummaryViewModel; + Name: string; + StartTime: string; + Status: string; + constructor(tasks: TaskModel[]); + private InitializeDuration; + private getMinTime; + private getMaxTime; + private getTimeDiff; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js new file mode 100644 index 00000000..5a7b0e2f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js @@ -0,0 +1,82 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskResultViewModel = exports.TaskResultViewModelWrapper = void 0; +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const TaskIssueSummaryViewModel_1 = require("./TaskIssueSummaryViewModel"); +const TimeFormatter_1 = require("../helpers/TimeFormatter"); +class TaskResultViewModelWrapper { +} +exports.TaskResultViewModelWrapper = TaskResultViewModelWrapper; +class TaskResultViewModel { + constructor(tasks) { + this.Name = tasks.length > 0 ? tasks[0].$name : ""; + this.HasFailed = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Failed || t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length > 0; + this.HasSkipped = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length == tasks.length; + this.NotYetRun = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.InProgress || t.$status == ReleaseInterfaces_1.TaskStatus.Unknown || t.$status == ReleaseInterfaces_1.TaskStatus.Pending).length > 0; + this.HasPartiallySucceeded = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.PartiallySucceeded).length > 0; + this.GotCancelled = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length > 0; + const inProgressTasks = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.InProgress); + if (inProgressTasks.length == 1) { + // Must be this task - Mark it as completed assuming we will pass + // If we don't, then the email report won't be sent with this data + this.NotYetRun = false; + } + if (tasks.length > 1) { + this.HasNotRunOnSomeAgents = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length > 0; + this.NotRunMessage = `Not run on ${tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length}/${tasks.length} agents`; + } + this.IssuesSummary = new TaskIssueSummaryViewModel_1.TaskIssueSummaryViewModel(tasks); + // No point in calculating duration for skipped/cancelled/not-yet-run tasks + if (!this.HasSkipped && !this.NotYetRun && !this.GotCancelled) { + this.InitializeDuration(tasks.filter(t => t.$status != ReleaseInterfaces_1.TaskStatus.Skipped)); + } + else { + this.Duration = ""; + } + } + InitializeDuration(tasks) { + if (tasks.length == 1) { + var firstTask = tasks[0]; + if (firstTask.$finishTime != null && firstTask.$startTime != null) { + this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(this.getTimeDiff(firstTask)); + } + } + else { + const nonNullTasks = tasks.filter(t => t.$finishTime != null && t.$startTime != null); + if (nonNullTasks.length > 0) { + var minTime = this.getMinTime(nonNullTasks); + var maxTime = this.getMaxTime(nonNullTasks); + if (minTime != null && maxTime != null) { + const minTimeStr = TimeFormatter_1.TimeFormatter.FormatDuration(minTime); + const maxTimeStr = TimeFormatter_1.TimeFormatter.FormatDuration(maxTime); + this.Duration = minTimeStr == maxTimeStr ? minTimeStr : `${minTimeStr} - ${maxTimeStr}`; + } + } + } + } + getMinTime(tasks) { + let minTime = this.getTimeDiff(tasks[0]); + for (var i = 1; i < tasks.length; i++) { + const diffTime = this.getTimeDiff(tasks[i]); + if (diffTime < minTime) { + minTime = diffTime; + } + } + return minTime; + } + getMaxTime(tasks) { + let maxTime = this.getTimeDiff(tasks[0]); + for (var i = 1; i < tasks.length; i++) { + const diffTime = this.getTimeDiff(tasks[i]); + if (diffTime > maxTime) { + maxTime = diffTime; + } + } + return maxTime; + } + getTimeDiff(task) { + return task.$finishTime.getTime() - task.$startTime.getTime(); + } +} +exports.TaskResultViewModel = TaskResultViewModel; +//# sourceMappingURL=TaskResultViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js.map new file mode 100644 index 00000000..95a2c073 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskResultViewModel.js","sourceRoot":"","sources":["TaskResultViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.d.ts new file mode 100644 index 00000000..3e1c85ea --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.d.ts @@ -0,0 +1,11 @@ +import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; +export declare class TestInfoByPriorityViewModelWrapper { + TestInfoByPriorityViewModel: TestInfoByPriorityViewModel[]; +} +export declare class TestInfoByPriorityViewModel { + Priority: number; + PassingRate: string; + TestCount: number; + constructor(priority: number, testCountByOutcome: Map, includeOthersInTotal: boolean); + private getPassingTestCountByOutcome; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js new file mode 100644 index 00000000..5d78c3bc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestInfoByPriorityViewModel = exports.TestInfoByPriorityViewModelWrapper = void 0; +const TestOutcomeForPriority_1 = require("../testresults/TestOutcomeForPriority"); +const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); +class TestInfoByPriorityViewModelWrapper { +} +exports.TestInfoByPriorityViewModelWrapper = TestInfoByPriorityViewModelWrapper; +class TestInfoByPriorityViewModel { + constructor(priority, testCountByOutcome, includeOthersInTotal) { + this.Priority = priority; + this.TestCount = TestResultsHelper_1.TestResultsHelper.getTotalTestCountBasedOnUserConfigurationPriority(testCountByOutcome, includeOthersInTotal); + if (this.TestCount > 0) { + var passingTests = this.getPassingTestCountByOutcome(testCountByOutcome); + this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(passingTests, this.TestCount); + } + } + getPassingTestCountByOutcome(testCountByOutcome) { + return testCountByOutcome.has(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed) + ? testCountByOutcome.get(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed) + : 0; + } +} +exports.TestInfoByPriorityViewModel = TestInfoByPriorityViewModel; +//# sourceMappingURL=TestInfoByPriorityViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js.map new file mode 100644 index 00000000..be888529 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestInfoByPriorityViewModel.js","sourceRoot":"","sources":["TestInfoByPriorityViewModel.ts"],"names":[],"mappings":";;;AAAA,kFAA+E;AAC/E,oEAAiE;AAEjE,MAAa,kCAAkC;CAE9C;AAFD,gFAEC;AAED,MAAa,2BAA2B;IAKtC,YAAY,QAAgB,EAC1B,kBAAuD,EACvD,oBAA6B;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,qCAAiB,CAAC,iDAAiD,CAClF,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;YACtB,IAAI,YAAY,GAAG,IAAI,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;YACzE,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;SACnG;IACH,CAAC;IAEO,4BAA4B,CAAC,kBAAuD;QAC1F,OAAO,kBAAkB,CAAC,GAAG,CAAC,+CAAsB,CAAC,MAAM,CAAC;YAC1D,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,+CAAsB,CAAC,MAAM,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;CACF;AAtBD,kEAsBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.d.ts new file mode 100644 index 00000000..0743b369 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.d.ts @@ -0,0 +1,14 @@ +import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultSummaryViewModel { + static readonly MaxSupportedPriority = 2; + Duration: string; + FailedTests: number; + OtherTests: number; + PassedTests: number; + PassingRate: string; + TotalTests: number; + Url: string; + constructor(summaryItemModel: TestSummaryItemModel, summary: TestResultSummary, pipelineConfiguration: PipelineConfiguration, includeOthersInTotal: boolean); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js new file mode 100644 index 00000000..91a1d6c0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultSummaryViewModel = void 0; +const TimeFormatter_1 = require("../helpers/TimeFormatter"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); +const util_1 = require("util"); +class TestResultSummaryViewModel { + constructor(summaryItemModel, summary, pipelineConfiguration, includeOthersInTotal) { + if (summaryItemModel != null) { + this.PassedTests = summaryItemModel.getPassedTestsCount(); + this.FailedTests = summaryItemModel.getFailedTestsCount(); + this.OtherTests = summaryItemModel.getOtherTestsCount(); + this.TotalTests = TestResultsHelper_1.TestResultsHelper.getTotalTestCountBasedOnUserConfiguration(summaryItemModel.$testCountByOutcome, includeOthersInTotal); + this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); + this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(summaryItemModel.$duration); + this.Url = pipelineConfiguration.getTestTabLink(); + } + else if (summary != null) { + const passedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Passed]; + const failedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; + this.PassedTests = util_1.isNullOrUndefined(passedAnalysis) ? 0 : passedAnalysis.count; + this.FailedTests = util_1.isNullOrUndefined(failedAnalysis) ? 0 : failedAnalysis.count; + this.TotalTests = summary.aggregatedResultsAnalysis.totalTests; + this.OtherTests = this.TotalTests - this.PassedTests - this.FailedTests; + if (!includeOthersInTotal) { + this.TotalTests -= this.OtherTests; + } + this.Duration = TimeFormatter_1.TimeFormatter.FormatDurationStr(summary.aggregatedResultsAnalysis.duration); + this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); + this.Url = pipelineConfiguration.getTestTabLink(); + } + } +} +exports.TestResultSummaryViewModel = TestResultSummaryViewModel; +TestResultSummaryViewModel.MaxSupportedPriority = 2; +//# sourceMappingURL=TestResultSummaryViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js.map new file mode 100644 index 00000000..bc2bc776 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultSummaryViewModel.js","sourceRoot":"","sources":["TestResultSummaryViewModel.ts"],"names":[],"mappings":";;;AAEA,4DAAyD;AACzD,oFAAiG;AACjG,oEAAiE;AACjE,+BAAyC;AAEzC,MAAa,0BAA0B;IAUrC,YAAY,gBAAsC,EAAE,OAA0B,EAAE,qBAA4C,EAAE,oBAA6B;QACzJ,IAAI,gBAAgB,IAAI,IAAI,EAAE;YAC5B,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;YAExD,IAAI,CAAC,UAAU,GAAG,qCAAiB,CAAC,yCAAyC,CAAC,gBAAgB,CAAC,mBAAmB,EAChH,oBAAoB,CAAC,CAAC;YAExB,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvG,IAAI,CAAC,QAAQ,GAAG,6BAAa,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAEzE,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;SACnD;aACI,IAAI,OAAO,IAAI,IAAI,EAAE;YACxB,MAAM,cAAc,GAAG,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;YAC9F,MAAM,cAAc,GAAG,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;YAC9F,IAAI,CAAC,WAAW,GAAG,wBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAChF,IAAI,CAAC,WAAW,GAAG,wBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAChF,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,yBAAyB,CAAC,UAAU,CAAC;YAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAExE,IAAI,CAAC,oBAAoB,EAAE;gBACzB,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;aACpC;YAED,IAAI,CAAC,QAAQ,GAAG,6BAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;YAC5F,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACvG,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;SACnD;IACH,CAAC;;AAzCH,gEA0CC;AAzCwB,+CAAoB,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.d.ts new file mode 100644 index 00000000..a6fc2fbd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.d.ts @@ -0,0 +1,26 @@ +import { WorkItemViewModelWrapper } from "./WorkItemViewModel"; +import { TestResultModel } from "../testresults/TestResultModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReleaseReferenceViewModel } from "./ReleaseReferenceViewModel"; +export declare class TestResultViewModelWrapper { + TestResultViewModel: TestResultViewModel[]; +} +export declare class TestResultViewModel { + private readonly StackTraceLineCount; + AssociatedBugs: WorkItemViewModelWrapper; + CreateBugLink: string; + Duration: string; + ErrorMessage: string; + FailingSinceBuild: any; + FailingSinceRelease: ReleaseReferenceViewModel; + FailingSinceTime: string; + Id: number; + Owner: string; + Priority: string; + StackTrace: string; + TestCaseTitle: string; + TestOutcome: string; + Url: string; + constructor(testResultModel: TestResultModel, config: PipelineConfiguration); + private InitializeAssociatedBugs; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js new file mode 100644 index 00000000..1d8005b1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js @@ -0,0 +1,70 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultViewModel = exports.TestResultViewModelWrapper = void 0; +const WorkItemViewModel_1 = require("./WorkItemViewModel"); +const StringUtils_1 = require("../../utils/StringUtils"); +const LinkHelper_1 = require("../helpers/LinkHelper"); +const TimeFormatter_1 = require("../helpers/TimeFormatter"); +const DisplayNameHelper_1 = require("../../utils/DisplayNameHelper"); +const ReleaseReferenceViewModel_1 = require("./ReleaseReferenceViewModel"); +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +const BuildReferenceViewModel_1 = require("./BuildReferenceViewModel"); +const util_1 = require("util"); +class TestResultViewModelWrapper { +} +exports.TestResultViewModelWrapper = TestResultViewModelWrapper; +class TestResultViewModel { + constructor(testResultModel, config) { + this.StackTraceLineCount = 5; + const result = testResultModel.testResult; + this.Id = result.id; + this.TestCaseTitle = result.testCaseTitle; + this.ErrorMessage = ""; + this.TestOutcome = result.outcome; + this.StackTrace = ""; + if (result.priority != 255) { + this.Priority = DisplayNameHelper_1.DisplayNameHelper.getPriorityDisplayName(result.priority == null ? "" : result.priority.toString()); + } + this.InitializeAssociatedBugs(config, testResultModel.associatedBugs); + this.Url = LinkHelper_1.LinkHelper.getTestResultLink(config, result.testRun.id, this.Id); + this.Owner = result.owner == null ? null : result.owner.displayName; + if (result.failingSince != null) { + const failingSincePipeline = config.$pipelineType == PipelineType_1.PipelineType.Build ? result.failingSince.release : result.failingSince.build; + const failingSinceNotCurrent = failingSincePipeline == null ? false : failingSincePipeline.id != config.$pipelineId; + if (failingSinceNotCurrent) { + this.FailingSinceTime = result.failingSince.date.toDateString(); + if (result.failingSince.release != null && result.failingSince.release.id > 0) { + this.FailingSinceRelease = new ReleaseReferenceViewModel_1.ReleaseReferenceViewModel(config, result.failingSince.release); + } + if (result.failingSince.build != null && result.failingSince.build.id > 0) { + this.FailingSinceBuild = new BuildReferenceViewModel_1.BuildReferenceViewModel(config, null, result.failingSince.build); + } + } + } + if (util_1.isNullOrUndefined(result.durationInMs)) { + if (!util_1.isNullOrUndefined(result.startedDate) && !util_1.isNullOrUndefined(result.completedDate)) { + result.durationInMs = result.completedDate.getTime() - result.startedDate.getTime(); + } + if (util_1.isNullOrUndefined(result.durationInMs) || result.durationInMs < 0) { + // unknown duration - assume test didn't run instead of displaying "Undefined/NaN" in email + result.durationInMs = 0; + } + } + this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(result.durationInMs); + this.CreateBugLink = LinkHelper_1.LinkHelper.getCreateBugLinkForTest(config, testResultModel.testResult); + } + InitializeAssociatedBugs(config, associatedBugs) { + this.AssociatedBugs = new WorkItemViewModel_1.WorkItemViewModelWrapper(); + this.AssociatedBugs.WorkItemViewModel = []; + if (associatedBugs == null) { + return; + } + associatedBugs.forEach(workItem => { + if (workItem.id != null) { + this.AssociatedBugs.WorkItemViewModel.push(new WorkItemViewModel_1.WorkItemViewModel(config, workItem)); + } + }); + } +} +exports.TestResultViewModel = TestResultViewModel; +//# sourceMappingURL=TestResultViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js.map new file mode 100644 index 00000000..f87e77ba --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultViewModel.js","sourceRoot":"","sources":["TestResultViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.d.ts new file mode 100644 index 00000000..cee07a69 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.d.ts @@ -0,0 +1,18 @@ +import { TestResultViewModelWrapper } from "./TestResultViewModel"; +import { ReportConfiguration } from "../../config/ReportConfiguration"; +import { TestResultsGroupModel } from "../testresults/TestResultGroupModel"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestResultModel } from "../testresults/TestResultModel"; +export declare class TestResultsGroupViewModelWrapper { + TestResultsGroupViewModel: TestResultsGroupViewModel[]; +} +export declare class TestResultsGroupViewModel { + FailedTests: TestResultViewModelWrapper; + GroupName: string; + OtherTests: TestResultViewModelWrapper; + PassedTests: TestResultViewModelWrapper; + constructor(resultsGroupModel: TestResultsGroupModel, reportConfig: ReportConfiguration); + private setGroupName; + private getTestResultViewModels; + getTestResultsByOutcomes(source: TestResultsGroupModel, outcomes: TestOutcome[]): TestResultModel[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js new file mode 100644 index 00000000..9d67303e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsGroupViewModel = exports.TestResultsGroupViewModelWrapper = void 0; +const TestResultViewModel_1 = require("./TestResultViewModel"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +const DisplayNameHelper_1 = require("../../utils/DisplayNameHelper"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TcmHelper_1 = require("../../providers/tcmproviders/TcmHelper"); +class TestResultsGroupViewModelWrapper { +} +exports.TestResultsGroupViewModelWrapper = TestResultsGroupViewModelWrapper; +class TestResultsGroupViewModel { + constructor(resultsGroupModel, reportConfig) { + this.FailedTests = new TestResultViewModel_1.TestResultViewModelWrapper(); + this.OtherTests = new TestResultViewModel_1.TestResultViewModelWrapper(); + this.PassedTests = new TestResultViewModel_1.TestResultViewModelWrapper(); + this.setGroupName(resultsGroupModel, reportConfig); + this.FailedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestInterfaces_1.TestOutcome.Failed]); + this.PassedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestInterfaces_1.TestOutcome.Passed]); + this.OtherTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed])); + } + setGroupName(resultsGroupModel, reportConfig) { + var groupTestResultsBy = reportConfig.$reportDataConfiguration.$testResultsConfig.$groupTestResultsBy; + this.GroupName = groupTestResultsBy == GroupTestResultsBy_1.GroupTestResultsBy.Priority ? + DisplayNameHelper_1.DisplayNameHelper.getPriorityDisplayName(resultsGroupModel.groupName) : + resultsGroupModel.groupName; + } + getTestResultViewModels(resultsGroupModel, config, testOutcomes) { + return this.getTestResultsByOutcomes(resultsGroupModel, testOutcomes) + .map(result => new TestResultViewModel_1.TestResultViewModel(result, config)); + } + getTestResultsByOutcomes(source, outcomes) { + const testResults = []; + outcomes.forEach(outcome => { + if (source.testResults.has(outcome)) { + testResults.push(...source.testResults.get(outcome)); + } + }); + return testResults; + } +} +exports.TestResultsGroupViewModel = TestResultsGroupViewModel; +//# sourceMappingURL=TestResultsGroupViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js.map new file mode 100644 index 00000000..96653582 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultsGroupViewModel.js","sourceRoot":"","sources":["TestResultsGroupViewModel.ts"],"names":[],"mappings":";;;AAAA,+DAAwF;AAGxF,+EAA4E;AAC5E,qEAAkE;AAElE,oFAA8E;AAE9E,sEAAmE;AAEnE,MAAa,gCAAgC;CAE5C;AAFD,4EAEC;AAED,MAAa,yBAAyB;IAMpC,YAAY,iBAAwC,EAAE,YAAiC;QALhF,gBAAW,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAE3E,eAAU,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAC1E,gBAAW,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAGhF,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClJ,IAAI,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClJ,IAAI,CAAC,UAAU,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EACvH,qBAAS,CAAC,cAAc,CAAC,CAAC,4BAAW,CAAC,MAAM,EAAE,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,YAAY,CAAC,iBAAwC,EAAE,YAAiC;QAC9F,IAAI,kBAAkB,GAAG,YAAY,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;QACtG,IAAI,CAAC,SAAS,GAAG,kBAAkB,IAAI,uCAAkB,CAAC,QAAQ,CAAC,CAAC;YAClE,qCAAiB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;YACvE,iBAAiB,CAAC,SAAS,CAAC;IAChC,CAAC;IAEO,uBAAuB,CAC7B,iBAAwC,EACxC,MAA6B,EAC7B,YAA2B;QAC3B,OAAO,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,YAAY,CAAC;aAClE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,yCAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEM,wBAAwB,CAC7B,MAA6B,EAC7B,QAAuB;QACvB,MAAM,WAAW,GAAsB,EAAE,CAAC;QAE1C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBACnC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtD;QACH,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAzCD,8DAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.d.ts new file mode 100644 index 00000000..1883ea5b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.d.ts @@ -0,0 +1,15 @@ +import { TestSummaryGroupModel } from "../testresults/TestSummaryGroupModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestSummaryItemViewModelWrapper } from "./TestSummaryItemViewModel"; +export declare class TestSummaryGroupViewModelWrapper { + TestSummaryGroupViewModel: TestSummaryGroupViewModel[]; +} +export declare class TestSummaryGroupViewModel { + GroupName: string; + SummaryItems: TestSummaryItemViewModelWrapper; + private SupportedPriorityColumns; + constructor(testSummaryGroup: TestSummaryGroupModel, config: PipelineConfiguration, includeOthersInTotal: boolean); + private InitializeSummaryItems; + private InitializeSupportedPriorityColumns; + private getDescription; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js new file mode 100644 index 00000000..2c67732d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryGroupViewModel = exports.TestSummaryGroupViewModelWrapper = void 0; +const TestSummaryItemViewModel_1 = require("./TestSummaryItemViewModel"); +const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +class TestSummaryGroupViewModelWrapper { +} +exports.TestSummaryGroupViewModelWrapper = TestSummaryGroupViewModelWrapper; +class TestSummaryGroupViewModel { + constructor(testSummaryGroup, config, includeOthersInTotal) { + this.GroupName = this.getDescription(testSummaryGroup.groupedBy); + this.InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal); + this.InitializeSupportedPriorityColumns(); + } + InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal) { + this.SummaryItems = new TestSummaryItemViewModel_1.TestSummaryItemViewModelWrapper(); + this.SummaryItems.TestSummaryItemViewModel = []; + testSummaryGroup.runs.forEach(testSummaryItem => { + this.SummaryItems.TestSummaryItemViewModel.push(new TestSummaryItemViewModel_1.TestSummaryItemViewModel(testSummaryGroup.groupedBy, testSummaryItem, config, includeOthersInTotal)); + }); + } + InitializeSupportedPriorityColumns() { + this.SupportedPriorityColumns = new Set(); + this.SummaryItems.TestSummaryItemViewModel.forEach(item => item.TestsByPriority.TestInfoByPriorityViewModel.forEach(testsByPriorityVm => { + if (testsByPriorityVm.Priority <= TestResultSummaryViewModel_1.TestResultSummaryViewModel.MaxSupportedPriority) { + this.SupportedPriorityColumns.add(testsByPriorityVm.Priority); + } + })); + } + getDescription(groupedBy) { + switch (groupedBy) { + case GroupTestResultsBy_1.GroupTestResultsBy.Priority: return "Priority"; + case GroupTestResultsBy_1.GroupTestResultsBy.Run: return "Test Run"; + default: return "Team"; + } + } +} +exports.TestSummaryGroupViewModel = TestSummaryGroupViewModel; +//# sourceMappingURL=TestSummaryGroupViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js.map new file mode 100644 index 00000000..320e62a9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryGroupViewModel.js","sourceRoot":"","sources":["TestSummaryGroupViewModel.ts"],"names":[],"mappings":";;;AAEA,yEAAuG;AACvG,6EAA0E;AAC1E,+EAA4E;AAE5E,MAAa,gCAAgC;CAE5C;AAFD,4EAEC;AAED,MAAa,yBAAyB;IAKpC,YAAY,gBAAuC,EACjD,MAA6B,EAC7B,oBAA6B;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAE5E,IAAI,CAAC,kCAAkC,EAAE,CAAC;IAC5C,CAAC;IAEO,sBAAsB,CAC5B,gBAAuC,EACvC,MAA6B,EAC7B,oBAA6B;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,0DAA+B,EAAE,CAAC;QAC1D,IAAI,CAAC,YAAY,CAAC,wBAAwB,GAAG,EAAE,CAAC;QAChD,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;YAC9C,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,mDAAwB,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3J,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,kCAAkC;QACxC,IAAI,CAAC,wBAAwB,GAAG,IAAI,GAAG,EAAU,CAAC;QAElD,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CACxD,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;YAC3E,IAAI,iBAAiB,CAAC,QAAQ,IAAI,uDAA0B,CAAC,oBAAoB,EAAE;gBACjF,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;aAC/D;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,SAA6B;QAClD,QAAQ,SAAS,EAAE;YACjB,KAAK,uCAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,UAAU,CAAC;YACpD,KAAK,uCAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,UAAU,CAAC;YAC/C,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;SACxB;IACH,CAAC;CACF;AA5CD,8DA4CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.d.ts new file mode 100644 index 00000000..b1d8c132 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.d.ts @@ -0,0 +1,15 @@ +import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; +import { TestInfoByPriorityViewModelWrapper } from "./TestInfoByPriorityViewModel"; +import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +export declare class TestSummaryItemViewModelWrapper { + TestSummaryItemViewModel: TestSummaryItemViewModel[]; +} +export declare class TestSummaryItemViewModel extends TestResultSummaryViewModel { + Name: string; + TestsByPriority: TestInfoByPriorityViewModelWrapper; + constructor(groupedBy: GroupTestResultsBy, summaryItem: TestSummaryItemModel, config: PipelineConfiguration, includeOthersInTotal: boolean); + private setupPriorityData; + getDisplayName(priority: string): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js new file mode 100644 index 00000000..78194d33 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryItemViewModel = exports.TestSummaryItemViewModelWrapper = void 0; +const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); +const TestInfoByPriorityViewModel_1 = require("./TestInfoByPriorityViewModel"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +class TestSummaryItemViewModelWrapper { +} +exports.TestSummaryItemViewModelWrapper = TestSummaryItemViewModelWrapper; +class TestSummaryItemViewModel extends TestResultSummaryViewModel_1.TestResultSummaryViewModel { + constructor(groupedBy, summaryItem, config, includeOthersInTotal) { + super(summaryItem, null, config, includeOthersInTotal); + this.TestsByPriority = new TestInfoByPriorityViewModel_1.TestInfoByPriorityViewModelWrapper(); + this.Name = (groupedBy == GroupTestResultsBy_1.GroupTestResultsBy.Priority) ? + this.getDisplayName(summaryItem.$name) : + summaryItem.$name; + this.setupPriorityData(summaryItem, includeOthersInTotal); + } + setupPriorityData(summaryItem, includeOthersInTotal) { + this.TestsByPriority.TestInfoByPriorityViewModel = []; + const testCountForOutcomeByPriority = summaryItem.$testCountForOutcomeByPriority; + testCountForOutcomeByPriority.forEach((value, priority) => { + if (priority <= TestResultSummaryViewModel_1.TestResultSummaryViewModel.MaxSupportedPriority) { + this.TestsByPriority.TestInfoByPriorityViewModel.push(new TestInfoByPriorityViewModel_1.TestInfoByPriorityViewModel(priority, value, includeOthersInTotal)); + } + }); + } + getDisplayName(priority) { + const priorityInt = Number.parseInt(priority); + if (!isNaN(priorityInt) && priorityInt == 255) { + return "Priority unspecified"; + } + return `Priority: ${priority}`; + } +} +exports.TestSummaryItemViewModel = TestSummaryItemViewModel; +//# sourceMappingURL=TestSummaryItemViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js.map new file mode 100644 index 00000000..19641149 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryItemViewModel.js","sourceRoot":"","sources":["TestSummaryItemViewModel.ts"],"names":[],"mappings":";;;AAAA,6EAA0E;AAC1E,+EAAgH;AAGhH,+EAA4E;AAG5E,MAAa,+BAA+B;CAE3C;AAFD,0EAEC;AAED,MAAa,wBAAyB,SAAQ,uDAA0B;IAItE,YACE,SAA6B,EAC7B,WAAiC,EACjC,MAA6B,EAC7B,oBAA6B;QAC7B,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAPlD,oBAAe,GAAuC,IAAI,gEAAkC,EAAE,CAAC;QAQpG,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,IAAI,uCAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,WAAW,CAAC,KAAK,CAAC;QAEpB,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IAC5D,CAAC;IAEO,iBAAiB,CAAC,WAAiC,EAAE,oBAA6B;QACxF,IAAI,CAAC,eAAe,CAAC,2BAA2B,GAAG,EAAE,CAAC;QAEtD,MAAM,6BAA6B,GACjC,WAAW,CAAC,8BAA8B,CAAC;QAE7C,6BAA6B,CAAC,OAAO,CAAC,CAAC,KAA0C,EAAE,QAAgB,EAAE,EAAE;YACrG,IAAI,QAAQ,IAAI,uDAA0B,CAAC,oBAAoB,EAAE;gBAC/D,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,yDAA2B,CAAC,QAAQ,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC;aAC/H;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,QAAgB;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE;YAC7C,OAAO,sBAAsB,CAAC;SAC/B;QACD,OAAO,aAAa,QAAQ,EAAE,CAAC;IACjC,CAAC;CACF;AArCD,4DAqCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.d.ts new file mode 100644 index 00000000..d4d1babd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.d.ts @@ -0,0 +1,14 @@ +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export declare class WorkItemViewModelWrapper { + WorkItemViewModel: WorkItemViewModel[]; +} +export declare class WorkItemViewModel { + AssignedTo: string; + ChangedDate: string; + Id: number; + State: string; + Title: string; + Url: string; + constructor(config: PipelineConfiguration, workItem: WorkItem); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js new file mode 100644 index 00000000..acde0aad --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkItemViewModel = exports.WorkItemViewModelWrapper = void 0; +const LinkHelper_1 = require("../helpers/LinkHelper"); +const StringUtils_1 = require("../../utils/StringUtils"); +const util_1 = require("util"); +class WorkItemViewModelWrapper { +} +exports.WorkItemViewModelWrapper = WorkItemViewModelWrapper; +class WorkItemViewModel { + constructor(config, workItem) { + if (workItem.id != null) { + this.Id = workItem.id; + this.Url = LinkHelper_1.LinkHelper.getWorkItemLink(config, workItem.id); + } + this.Title = workItem.fields["System.Title"]; + // This is for display in email report only + var assignToRef = workItem.fields["System.AssignedTo"]; + // Prefer Display name to Unique Name in report + this.AssignedTo = util_1.isNullOrUndefined(assignToRef) ? "" : (StringUtils_1.StringUtils.isNullOrWhiteSpace(assignToRef.displayName) ? assignToRef.uniqueName : assignToRef.displayName); + // Unassigned workitem + this.AssignedTo = util_1.isNullOrUndefined(this.AssignedTo) ? "" : this.AssignedTo; + this.State = workItem.fields["System.State"]; + this.ChangedDate = workItem.fields["System.ChangedDate"]; + } +} +exports.WorkItemViewModel = WorkItemViewModel; +//# sourceMappingURL=WorkItemViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js.map new file mode 100644 index 00000000..5324f5b6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"WorkItemViewModel.js","sourceRoot":"","sources":["WorkItemViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,yDAAsD;AACtD,+BAAyC;AAEzC,MAAa,wBAAwB;CAEpC;AAFD,4DAEC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,MAA6B,EAAE,QAAkB;QAC3D,IAAI,QAAQ,CAAC,EAAE,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC5D;QAED,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE7C,2CAA2C;QAC3C,IAAI,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACvD,+CAA+C;QAC/C,IAAI,CAAC,UAAU,GAAG,wBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACrK,sBAAsB;QACtB,IAAI,CAAC,UAAU,GAAG,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAE5E,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC;CACF;AA1BD,8CA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/package-lock.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/package-lock.json similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/package-lock.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/package-lock.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/package.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/package.json similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/package.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/package.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.d.ts new file mode 100644 index 00000000..cefac9c4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.d.ts @@ -0,0 +1,14 @@ +import { IDataProviderFactory } from "./IDataProviderFactory"; +import { IDataProvider } from "./IDataProvider"; +import { IPostProcessor } from "./IPostProcessor"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +export declare class DataProviderFactory implements IDataProviderFactory { + private pipelineConfig; + private dataProviders; + private postProcessors; + private testResultsClient; + constructor($pipelineConfig: PipelineConfiguration); + getDataProviders(): IDataProvider[]; + getPostProcessors(): IPostProcessor[]; + private getTestResultsClient; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js new file mode 100644 index 00000000..3bcb7b68 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DataProviderFactory = void 0; +const PipelineType_1 = require("../config/pipeline/PipelineType"); +const ReleaseDataProvider_1 = require("./pipeline/ReleaseDataProvider"); +const ReleaseClient_1 = require("./restclients/ReleaseClient"); +const TestOwnersDataProvider_1 = require("./tcmproviders/TestOwnersDataProvider"); +const TestSummaryDataProvider_1 = require("./tcmproviders/TestSummaryDataProvider"); +const TestResultsDataProvider_1 = require("./tcmproviders/TestResultsDataProvider"); +const WorkItemClient_1 = require("./restclients/WorkItemClient"); +const SendMailConditionProcessor_1 = require("./SendMailConditionProcessor"); +const BuildClient_1 = require("./restclients/BuildClient"); +const BuildDataProvider_1 = require("./pipeline/BuildDataProvider"); +const BuildTestResultsClient_1 = require("./restclients/BuildTestResultsClient"); +const ReleaseTestResultsClient_1 = require("./restclients/ReleaseTestResultsClient"); +class DataProviderFactory { + constructor($pipelineConfig) { + this.dataProviders = []; + this.postProcessors = []; + this.pipelineConfig = $pipelineConfig; + } + getDataProviders() { + if (this.dataProviders.length < 1) { + if (this.pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Release) { + const pipelineRestClient = new ReleaseClient_1.ReleaseRestClient(this.pipelineConfig); + this.dataProviders.push(new ReleaseDataProvider_1.ReleaseDataProvider(pipelineRestClient)); + } + else { + const pipelineRestClient = new BuildClient_1.BuildRestClient(this.pipelineConfig); + this.dataProviders.push(new BuildDataProvider_1.BuildDataProvider(pipelineRestClient)); + } + const testResultsClient = this.getTestResultsClient(); + const workItemClient = new WorkItemClient_1.WorkItemClient(this.pipelineConfig); + this.dataProviders.push(new TestOwnersDataProvider_1.TestOwnersDataProvider(testResultsClient)); + this.dataProviders.push(new TestSummaryDataProvider_1.TestSummaryDataProvider(testResultsClient)); + this.dataProviders.push(new TestResultsDataProvider_1.TestResultsDataProvider(testResultsClient, workItemClient)); + } + return this.dataProviders; + } + getPostProcessors() { + if (this.postProcessors.length < 1) { + this.postProcessors.push(new SendMailConditionProcessor_1.SendMailConditionProcessor(this.getTestResultsClient())); + } + return this.postProcessors; + } + getTestResultsClient() { + if (this.testResultsClient == null) { + this.testResultsClient = this.pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build ? + new BuildTestResultsClient_1.BuildTestResultsClient(this.pipelineConfig) : + new ReleaseTestResultsClient_1.ReleaseTestResultsClient(this.pipelineConfig); + } + return this.testResultsClient; + } +} +exports.DataProviderFactory = DataProviderFactory; +//# sourceMappingURL=DataProviderFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js.map new file mode 100644 index 00000000..8c21bdb2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DataProviderFactory.js","sourceRoot":"","sources":["DataProviderFactory.ts"],"names":[],"mappings":";;;AAIA,kEAA+D;AAC/D,wEAAqE;AACrE,+DAAgE;AAChE,kFAA+E;AAC/E,oFAAiF;AACjF,oFAAiF;AACjF,iEAA8D;AAC9D,6EAA0E;AAC1E,2DAA4D;AAC5D,oEAAiE;AAEjE,iFAA8E;AAC9E,qFAAkF;AAElF,MAAa,mBAAmB;IAQ9B,YAAY,eAAsC;QAL1C,kBAAa,GAAoB,EAAE,CAAC;QACpC,mBAAc,GAAqB,EAAE,CAAC;QAK5C,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;IACxC,CAAC;IAEM,gBAAgB;QACrB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,OAAO,EAAE;gBAC7D,MAAM,kBAAkB,GAAG,IAAI,iCAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACtE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC;aACtE;iBAAM;gBACL,MAAM,kBAAkB,GAAG,IAAI,6BAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACpE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,qCAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC;aACpE;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE/D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,+CAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iDAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iDAAuB,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;SACzF;QAED,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEM,iBAAiB;QACtB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,uDAA0B,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;SACvF;QAED,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,oBAAoB;QAC1B,IAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE;YACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC;gBAChF,IAAI,+CAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACjD,IAAI,mDAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACrD;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AAhDD,kDAgDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/DataProviderFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/DataProviderFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.d.ts new file mode 100644 index 00000000..bb18722d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.d.ts @@ -0,0 +1,6 @@ +import { Report } from "../model/Report"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ReportDataConfiguration } from "../config/report/ReportDataConfiguration"; +export interface IDataProvider { + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js new file mode 100644 index 00000000..b8225b61 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js.map new file mode 100644 index 00000000..48b33d63 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IDataProvider.js","sourceRoot":"","sources":["IDataProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.d.ts new file mode 100644 index 00000000..a22567be --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.d.ts @@ -0,0 +1,6 @@ +import { IDataProvider } from "./IDataProvider"; +import { IPostProcessor } from "./IPostProcessor"; +export interface IDataProviderFactory { + getDataProviders(): IDataProvider[]; + getPostProcessors(): IPostProcessor[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js new file mode 100644 index 00000000..1653e44f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IDataProviderFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js.map new file mode 100644 index 00000000..ee835e22 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IDataProviderFactory.js","sourceRoot":"","sources":["IDataProviderFactory.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IDataProviderFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IDataProviderFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.d.ts new file mode 100644 index 00000000..0c1f4301 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.d.ts @@ -0,0 +1,5 @@ +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { Report } from "../model/Report"; +export interface IPostProcessor { + processReportAsync(reportConfig: ReportConfiguration, finalReport: Report): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js new file mode 100644 index 00000000..b119f9a9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IPostProcessor.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js.map new file mode 100644 index 00000000..64da73b0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IPostProcessor.js","sourceRoot":"","sources":["IPostProcessor.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IPostProcessor.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IPostProcessor.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.d.ts new file mode 100644 index 00000000..3a18e882 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.d.ts @@ -0,0 +1,5 @@ +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +export interface IReportProvider { + createReportAsync(reportConfig: ReportConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js new file mode 100644 index 00000000..462734a9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IReportProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js.map new file mode 100644 index 00000000..141696fa --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IReportProvider.js","sourceRoot":"","sources":["IReportProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IReportProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/IReportProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.d.ts new file mode 100644 index 00000000..4707ea61 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.d.ts @@ -0,0 +1,12 @@ +import { IReportProvider } from "./IReportProvider"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { Report } from "../model/Report"; +import { IDataProviderFactory } from "./IDataProviderFactory"; +export declare class ReportProvider implements IReportProvider { + private dataProviders; + private postProcessors; + constructor(dataProviderFactory: IDataProviderFactory); + createReportAsync(reportConfig: ReportConfiguration): Promise; + private callDataProvider; + private callPostProcessor; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js new file mode 100644 index 00000000..a4eb6732 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js @@ -0,0 +1,86 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportProvider = void 0; +const ReportFactory_1 = require("../model/ReportFactory"); +const ReportError_1 = require("../exceptions/ReportError"); +const DataProviderError_1 = require("../exceptions/DataProviderError"); +const PostProcessorError_1 = require("../exceptions/PostProcessorError"); +const TelemetryLogger_1 = require("../telemetry/TelemetryLogger"); +class ReportProvider { + constructor(dataProviderFactory) { + this.dataProviders = []; + this.postProcessors = []; + this.dataProviders.push(...dataProviderFactory.getDataProviders()); + this.postProcessors.push(...dataProviderFactory.getPostProcessors()); + } + createReportAsync(reportConfig) { + return __awaiter(this, void 0, void 0, function* () { + let finalReport; + try { + const reportTaskArray = this.dataProviders.map(dataProvider => TelemetryLogger_1.TelemetryLogger.InvokeWithPerfLogger(() => __awaiter(this, void 0, void 0, function* () { return this.callDataProvider(dataProvider, reportConfig); }), dataProvider.constructor.name)); + const reports = yield Promise.all(reportTaskArray); + finalReport = ReportFactory_1.ReportFactory.mergeReports(reports); + // Post Process data collected + const processorTasks = this.postProcessors.map(processor => TelemetryLogger_1.TelemetryLogger.InvokeWithPerfLogger(() => __awaiter(this, void 0, void 0, function* () { return this.callPostProcessor(processor, reportConfig, finalReport); }), processor.constructor.name)); + // Wait for all processors + yield Promise.all(processorTasks); + } + catch (err) { + ReportError_1.ReportError.HandleError(err); + if (finalReport == null) + finalReport = ReportFactory_1.ReportFactory.createNewReport(reportConfig.$pipelineConfiguration); + finalReport.$dataMissing = true; + } + return finalReport; + }); + } + callDataProvider(dataProvider, reportConfig) { + return __awaiter(this, void 0, void 0, function* () { + let report = null; + try { + report = yield dataProvider.getReportDataAsync(reportConfig.$pipelineConfiguration, reportConfig.$reportDataConfiguration); + } + catch (err) { + // Do not error out until all data providers are done + console.log(err); + if (!(err instanceof ReportError_1.ReportError)) { + const reportError = new DataProviderError_1.DataProviderError(`Error fetching data using ${dataProvider.constructor.name}: ${err.message}`); + reportError.innerError = err; + throw reportError; + } + throw err; + } + return report; + }); + } + callPostProcessor(postProcessor, reportConfig, report) { + return __awaiter(this, void 0, void 0, function* () { + let retVal = false; + try { + retVal = yield postProcessor.processReportAsync(reportConfig, report); + } + catch (err) { + // Do not error out until all post processors are done + console.log(err); + if (!(err instanceof ReportError_1.ReportError)) { + const reportError = new PostProcessorError_1.PostProcessorError(`Error fetching data using ${postProcessor.constructor.name}: ${err.message}`); + reportError.innerError = err; + throw reportError; + } + throw err; + } + return retVal; + }); + } +} +exports.ReportProvider = ReportProvider; +//# sourceMappingURL=ReportProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js.map new file mode 100644 index 00000000..71491088 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportProvider.js","sourceRoot":"","sources":["ReportProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/ReportProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/ReportProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.d.ts new file mode 100644 index 00000000..a1317cb3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.d.ts @@ -0,0 +1,14 @@ +import { IPostProcessor } from "./IPostProcessor"; +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ITestResultsClient } from "./restclients/ITestResultsClient"; +export declare class SendMailConditionProcessor implements IPostProcessor { + private testResultsClient; + private readonly TestResultFieldsToQuery; + constructor(testResultsClient: ITestResultsClient); + processReportAsync(reportConfig: ReportConfiguration, report: Report): Promise; + hasPreviousReleaseGotSameFailuresAsync(report: Report, config: PipelineConfiguration, hasTestFailures: boolean, hasFailedTasks: boolean): Promise; + private getFailureCountFromSummary; + private fetchFailedTestCaseIdsAsync; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js new file mode 100644 index 00000000..992128e1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js @@ -0,0 +1,140 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SendMailConditionProcessor = void 0; +const SendMailCondition_1 = require("../config/report/SendMailCondition"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const util_1 = require("util"); +const TcmHelper_1 = require("./tcmproviders/TcmHelper"); +const AbstractTestResultsClient_1 = require("./restclients/AbstractTestResultsClient"); +const EnumUtils_1 = require("../utils/EnumUtils"); +class SendMailConditionProcessor { + constructor(testResultsClient) { + this.TestResultFieldsToQuery = ["TestCaseReferenceId", "OutcomeConfidence"]; + this.testResultsClient = testResultsClient; + } + processReportAsync(reportConfig, report) { + return __awaiter(this, void 0, void 0, function* () { + var shouldSendMail = false; + if (!report.$dataMissing) { + const sendMailCondition = reportConfig.$sendMailCondition; + shouldSendMail = sendMailCondition == SendMailCondition_1.SendMailCondition.Always; + if (!shouldSendMail) { + var hasTestFailures = report.hasFailedTests(reportConfig.$reportDataConfiguration.$includeOthersInTotal); + var hasFailedTasks = report.hasFailedTasks(); + var hasCanceledPhases = report.hasCanceledPhases(); + var hasFailure = hasTestFailures || hasFailedTasks || hasCanceledPhases; + if ((sendMailCondition == SendMailCondition_1.SendMailCondition.OnFailure && hasFailure) + || (sendMailCondition == SendMailCondition_1.SendMailCondition.OnSuccess && !hasFailure)) { + shouldSendMail = true; + } + else if (sendMailCondition == SendMailCondition_1.SendMailCondition.OnNewFailuresOnly && hasFailure) { + // Always treat phase cancellation issues as new failure as we cannot distinguish/compare phase level issues + // Still compare failed tests and failed tasks where possible to reduce noise + if (hasCanceledPhases && !hasTestFailures && !hasFailedTasks) { + shouldSendMail = true; + console.log(`Has Phase cancellation(s) issues. Treating as new failure.`); + } + else { + console.log(`Looking for new failures, as the user send mail condition is '${EnumUtils_1.EnumUtils.GetMailConditionString(sendMailCondition)}'.`); + shouldSendMail = !(yield this.hasPreviousReleaseGotSameFailuresAsync(report, reportConfig.$pipelineConfiguration, hasTestFailures, hasFailedTasks)); + } + } + } + } + report.$sendMailConditionSatisfied = shouldSendMail; + return shouldSendMail; + }); + } + hasPreviousReleaseGotSameFailuresAsync(report, config, hasTestFailures, hasFailedTasks) { + return __awaiter(this, void 0, void 0, function* () { + var hasPrevGotSameFailures = report.hasPrevGotSameFailures(); + if (!util_1.isNullOrUndefined(hasPrevGotSameFailures) && hasPrevGotSameFailures) { + return hasPrevGotSameFailures; + } + const hasPrevFailedTasks = report.hasPrevFailedTasks(); + if (report.testResultSummary == null) { + return false; + } + if (hasTestFailures) { + var prevConfig = report.getPrevConfig(config); + if (util_1.isNullOrUndefined(prevConfig)) { + // we don't know anything about prev pipeline failures if we have no info - assume they are not same + return false; + } + var lastCompletedTestResultSummary = yield this.testResultsClient.queryTestResultsReportAsync(prevConfig); + var failedInCurrent = this.getFailureCountFromSummary(report.testResultSummary); + var failedinPrev = this.getFailureCountFromSummary(lastCompletedTestResultSummary); + // Threshold is 10 to decide whether they are same failures + console.log(`Current Failures Found: '${failedInCurrent}'.`); + console.log(`Previous Failures Found: '${failedinPrev}'.`); + var hasSameFailures = failedInCurrent == failedinPrev; + // No point in moving ahead if number of failures is different + if (hasSameFailures) { + var currFailedTestCaseRefIds = yield this.fetchFailedTestCaseIdsAsync(config); + var prevFailedTestCaseRefIds = yield this.fetchFailedTestCaseIdsAsync(prevConfig); + const leftJoin = currFailedTestCaseRefIds.filter(c => !prevFailedTestCaseRefIds.includes(c)); + if (leftJoin.length > 0) { + console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); + hasSameFailures = false; + } + else { + const rightJoin = prevFailedTestCaseRefIds.filter(p => !currFailedTestCaseRefIds.includes(p)); + if (rightJoin.length > 0) { + console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); + hasSameFailures = false; + } + else { + console.log(`Failed Test Reference Ids match. No new failures found.`); + hasSameFailures = true; + } + } + } + return hasSameFailures; + } + else if (hasFailedTasks && hasPrevFailedTasks) { + return report.arePrevFailedTasksSame(); + } + return false; + }); + } + getFailureCountFromSummary(testResultSummary) { + const failedOutcome = testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; + return !util_1.isNullOrUndefined(failedOutcome) ? failedOutcome.count : 0; + } + fetchFailedTestCaseIdsAsync(pipelineConfig) { + return __awaiter(this, void 0, void 0, function* () { + var testSummary = yield this.testResultsClient.getTestResultsDetailsAsync(null, [TestInterfaces_1.TestOutcome.Failed], pipelineConfig); + var resultsToQuery = []; + testSummary.resultsForGroup.forEach(r => resultsToQuery.push(...r.results)); + var testCaseIds = []; + if (resultsToQuery.length > 0) { + // API supports only 100 results at a time + const tasks = []; + for (let i = 0, j = resultsToQuery.length; i < j; i += 100) { + const tempArray = resultsToQuery.slice(i, i + 100); + let query = new AbstractTestResultsClient_1.TestResultsQueryImpl(); + query.fields = this.TestResultFieldsToQuery; + query.results = tempArray; + tasks.push(this.testResultsClient.getTestResultsByQueryAsync(query)); + } + const resultQueries = yield Promise.all(tasks); + resultQueries.forEach(rq => { + let tempIds = rq.results.filter(r => TcmHelper_1.TcmHelper.isTestFlaky(r)).map(r1 => r1.testCaseReferenceId); + testCaseIds.push(...tempIds); + }); + } + return testCaseIds; + }); + } +} +exports.SendMailConditionProcessor = SendMailConditionProcessor; +//# sourceMappingURL=SendMailConditionProcessor.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js.map new file mode 100644 index 00000000..113e7bc5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SendMailConditionProcessor.js","sourceRoot":"","sources":["SendMailConditionProcessor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/SendMailConditionProcessor.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/SendMailConditionProcessor.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.d.ts new file mode 100644 index 00000000..7e4dc619 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.d.ts @@ -0,0 +1,9 @@ +import { TestResultsDetails, TestResultsDetailsForGroup } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +export declare abstract class AbstractTestResultsDetailsParser { + protected testResultDetails: TestResultsDetails; + constructor(testResultDetails: TestResultsDetails); + abstract getSummaryItems(): Array; + abstract getGroupByValue(group: TestResultsDetailsForGroup): string; + protected parseBaseData(resultsForGroup: TestResultsDetailsForGroup, summaryItem: TestSummaryItemModel): void; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js new file mode 100644 index 00000000..1e57f6fe --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AbstractTestResultsDetailsParser = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const util_1 = require("util"); +const TimeFormatter_1 = require("../../model/helpers/TimeFormatter"); +class AbstractTestResultsDetailsParser { + constructor(testResultDetails) { + this.testResultDetails = testResultDetails; + } + /// + /// Get Duration, TotalTests & test count by outcome + /// Calculating total duration, as the tcm data has duration by test outcome only. + /// + parseBaseData(resultsForGroup, summaryItem) { + let duration = 0; + for (let item in TestInterfaces_1.TestOutcome) { + if (!isNaN(Number(item))) { + const resultsByOutCome = resultsForGroup.resultsCountByOutcome[Number(item)]; + if (!util_1.isNullOrUndefined(resultsByOutCome)) { + summaryItem.$testCountByOutcome.set(resultsByOutCome.outcome, resultsByOutCome.count); + duration += TimeFormatter_1.TimeFormatter.ConvertTimeStringToMilliSeconds(resultsByOutCome.duration); + } + } + } + // // HACK - SHould get data directly from resultsGroup.resultsCountByOutcome - but that data is coming wrong + // resultsForGroup.results.forEach(r => { + // duration += isNaN(r.durationInMs) ? 0 : r.durationInMs; + // }); + summaryItem.$duration = duration; + summaryItem.$totalTestCount = resultsForGroup.results.length; + } +} +exports.AbstractTestResultsDetailsParser = AbstractTestResultsDetailsParser; +//# sourceMappingURL=AbstractTestResultsDetailsParser.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js.map new file mode 100644 index 00000000..d2aa53e6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbstractTestResultsDetailsParser.js","sourceRoot":"","sources":["AbstractTestResultsDetailsParser.ts"],"names":[],"mappings":";;;AAAA,oFAA0K;AAE1K,+BAAyC;AACzC,qEAAkE;AAElE,MAAsB,gCAAgC;IAIpD,YAAY,iBAAqC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAMD,aAAa;IACb,oDAAoD;IACpD,kFAAkF;IAClF,cAAc;IACJ,aAAa,CAAC,eAA2C,EAAE,WAAiC;QACpG,IAAI,QAAQ,GAAW,CAAC,CAAC;QACzB,KAAK,IAAI,IAAI,IAAI,4BAAW,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;gBACxB,MAAM,gBAAgB,GAAG,eAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7E,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,EAAE;oBACxC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACtF,QAAQ,IAAI,6BAAa,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;iBACtF;aACF;SACF;QAED,6GAA6G;QAC7G,yCAAyC;QACzC,4DAA4D;QAC5D,MAAM;QAEN,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC;QACjC,WAAW,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/D,CAAC;CAMF;AAzCD,4EAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.d.ts new file mode 100644 index 00000000..78c07e95 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.d.ts @@ -0,0 +1,5 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultDetailsParserFactory { + static getParser(resultDetails: TestResultsDetails): AbstractTestResultsDetailsParser; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js new file mode 100644 index 00000000..28109614 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultDetailsParserFactory = void 0; +const TestResultDetailsParserForRun_1 = require("./TestResultDetailsParserForRun"); +const TestResultDetailsParserForPriority_1 = require("./TestResultDetailsParserForPriority"); +const DataProviderError_1 = require("../../exceptions/DataProviderError"); +class TestResultDetailsParserFactory { + static getParser(resultDetails) { + var groupByField = resultDetails.groupByField; + if (groupByField.toLowerCase() == "TestRun".toLowerCase()) { + return new TestResultDetailsParserForRun_1.TestResultDetailsParserForRun(resultDetails); + } + if (groupByField.toLowerCase() == "Priority".toLowerCase()) { + return new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(resultDetails); + } + throw new DataProviderError_1.DataProviderError(`TestResultsDetails by group ${groupByField} not supported`); + } +} +exports.TestResultDetailsParserFactory = TestResultDetailsParserFactory; +//# sourceMappingURL=TestResultDetailsParserFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js.map new file mode 100644 index 00000000..391d7fbc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultDetailsParserFactory.js","sourceRoot":"","sources":["TestResultDetailsParserFactory.ts"],"names":[],"mappings":";;;AAEA,mFAAgF;AAChF,6FAA0F;AAC1F,0EAAuE;AAEvE,MAAa,8BAA8B;IAClC,MAAM,CAAC,SAAS,CAAC,aAAiC;QACvD,IAAI,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAC9C,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YACzD,OAAO,IAAI,6DAA6B,CAAC,aAAa,CAAC,CAAC;SACzD;QAED,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE;YAC1D,OAAO,IAAI,uEAAkC,CAAC,aAAa,CAAC,CAAC;SAC9D;QAED,MAAM,IAAI,qCAAiB,CAAC,+BAA+B,YAAY,gBAAgB,CAAC,CAAC;IAC3F,CAAC;CACF;AAbD,wEAaC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.d.ts new file mode 100644 index 00000000..9844cd01 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.d.ts @@ -0,0 +1,11 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser { + constructor(testResultDetails: TestResultsDetails); + getSummaryItems(): TestSummaryItemModel[]; + getGroupByValue(group: TestResultsDetailsForGroup): string; + getTestResultsForRun(runId: number): Map; + private getPriority; + private getTestCountByPriorityInTestRun; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js new file mode 100644 index 00000000..24e313c8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js @@ -0,0 +1,64 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultDetailsParserForPriority = void 0; +const AbstractTestResultsDetailsParser_1 = require("./AbstractTestResultsDetailsParser"); +const TestSummaryItemModel_1 = require("../../model/testresults/TestSummaryItemModel"); +const InvalidTestResultDataError_1 = require("../../exceptions/InvalidTestResultDataError"); +class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser_1.AbstractTestResultsDetailsParser { + constructor(testResultDetails) { + super(testResultDetails); + if (testResultDetails.groupByField.toUpperCase() != "Priority".toUpperCase()) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); + } + } + getSummaryItems() { + const resultsForGroup = this.testResultDetails.resultsForGroup; + if (resultsForGroup != null && resultsForGroup.length > 0) { + return resultsForGroup.map(group => { + var priority = this.getPriority(group.groupByValue); + var summaryItem = new TestSummaryItemModel_1.TestSummaryItemModel(priority.toString(), priority.toString()); + this.parseBaseData(group, summaryItem); + return summaryItem; + }); + } + return []; + } + getGroupByValue(group) { + return this.getPriority(group.groupByValue).toString(); + } + getTestResultsForRun(runId) { + const testResultsByPriority = this.getTestCountByPriorityInTestRun(); + return testResultsByPriority.has(runId) ? testResultsByPriority.get(runId) : new Map(); + } + getPriority(groupByValue) { + let priority = Number.parseInt(groupByValue); + if (priority == null || Number.isNaN(priority)) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected priority value to be integer in ${groupByValue}`); + } + return priority; + } + getTestCountByPriorityInTestRun() { + var testResultsByPriority = new Map(); + this.testResultDetails.resultsForGroup.forEach(testResultsByGroup => { + var priority = this.getPriority(testResultsByGroup.groupByValue); + testResultsByGroup.results.forEach(result => { + if (result.testRun == null) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Test run field is null in Test result object with test id - ${result.id}`); + } + const testRunId = Number.parseInt(result.testRun.id); + if (testRunId == null || Number.isNaN(testRunId)) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Unable to parse test run id to integer in ${result.testRun.id}`); + } + if (!testResultsByPriority.has(testRunId)) { + testResultsByPriority.set(testRunId, new Map()); + } + const resultsByPriorityForRun = testResultsByPriority.get(testRunId); + var testCountByPriority = resultsByPriorityForRun.has(priority) ? resultsByPriorityForRun.get(priority) : 0; + resultsByPriorityForRun.set(priority, testCountByPriority + 1); + }); + }); + return testResultsByPriority; + } +} +exports.TestResultDetailsParserForPriority = TestResultDetailsParserForPriority; +//# sourceMappingURL=TestResultDetailsParserForPriority.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js.map new file mode 100644 index 00000000..3fa90f2c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultDetailsParserForPriority.js","sourceRoot":"","sources":["TestResultDetailsParserForPriority.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.d.ts new file mode 100644 index 00000000..db1b8ead --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.d.ts @@ -0,0 +1,14 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser { + constructor(testResultDetails: TestResultsDetails); + getSummaryItems(): TestSummaryItemModel[]; + getGroupByValue(group: TestResultsDetailsForGroup): string; + private getTestRunSummaryInfo; + private readGroupByValue; +} +export declare class TestRunInfo { + id: number; + name: string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js new file mode 100644 index 00000000..100ed24f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestRunInfo = exports.TestResultDetailsParserForRun = void 0; +const AbstractTestResultsDetailsParser_1 = require("./AbstractTestResultsDetailsParser"); +const TestSummaryItemModel_1 = require("../../model/testresults/TestSummaryItemModel"); +const InvalidTestResultDataError_1 = require("../../exceptions/InvalidTestResultDataError"); +class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser_1.AbstractTestResultsDetailsParser { + constructor(testResultDetails) { + super(testResultDetails); + if (testResultDetails.groupByField.toUpperCase() != "TestRun".toUpperCase()) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); + } + } + getSummaryItems() { + return this.testResultDetails.resultsForGroup.map(r => this.getTestRunSummaryInfo(r)); + } + getGroupByValue(group) { + const runinfo = this.readGroupByValue(group); + return runinfo.name; + } + getTestRunSummaryInfo(resultsForGroup) { + console.log(`Getting Test summary data for test run - ${resultsForGroup.groupByValue.name}`); + const runinfo = this.readGroupByValue(resultsForGroup); + var summaryItem = new TestSummaryItemModel_1.TestSummaryItemModel(runinfo.name == null ? runinfo.id.toString() : runinfo.name, runinfo.id.toString()); + this.parseBaseData(resultsForGroup, summaryItem); + return summaryItem; + } + readGroupByValue(resultsForGroup) { + const runinfo = new TestRunInfo(); + runinfo.id = resultsForGroup.groupByValue.id; + runinfo.name = resultsForGroup.groupByValue.name; + return runinfo; + } +} +exports.TestResultDetailsParserForRun = TestResultDetailsParserForRun; +class TestRunInfo { +} +exports.TestRunInfo = TestRunInfo; +//# sourceMappingURL=TestResultDetailsParserForRun.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js.map new file mode 100644 index 00000000..3e9c3db0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultDetailsParserForRun.js","sourceRoot":"","sources":["TestResultDetailsParserForRun.ts"],"names":[],"mappings":";;;AAAA,yFAAsF;AACtF,uFAAoF;AAEpF,4FAAyF;AAEzF,MAAa,6BAA8B,SAAQ,mEAAgC;IAEjF,YAAY,iBAAqC;QAC/C,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzB,IAAI,iBAAiB,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YAC3E,MAAM,IAAI,uDAA0B,CAAC,6DAA6D,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC;SACrI;IACH,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IAEM,eAAe,CAAC,KAAiC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAEO,qBAAqB,CAAC,eAA2C;QACvE,OAAO,CAAC,GAAG,CAAC,4CAA4C,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAEvD,IAAI,WAAW,GAAG,IAAI,2CAAoB,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE/H,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAEjD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,gBAAgB,CAAC,eAA2C;QAClE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAnCD,sEAmCC;AAED,MAAa,WAAW;CAIvB;AAJD,kCAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.d.ts new file mode 100644 index 00000000..eaf08ab5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.d.ts @@ -0,0 +1,14 @@ +import { IDataProvider } from "../IDataProvider"; +import { Report } from "../../model/Report"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; +export declare class BuildDataProvider implements IDataProvider { + private pipelineRestClient; + constructor(pipelineRestClient: IPipelineRestClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; + private getBuildAsync; + private getPhases; + private getTaskState; + private getOrder; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js new file mode 100644 index 00000000..a5a4f067 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js @@ -0,0 +1,101 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildDataProvider = void 0; +const PipelineNotFoundError_1 = require("../../exceptions/PipelineNotFoundError"); +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const PhaseModel_1 = require("../../model/PhaseModel"); +const JobModel_1 = require("../../model/JobModel"); +const TaskModel_1 = require("../../model/TaskModel"); +const IssueModel_1 = require("../../model/IssueModel"); +const ReportFactory_1 = require("../../model/ReportFactory"); +const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); +const util_1 = require("util"); +const RetryablePromise_1 = require("../restclients/RetryablePromise"); +const DataProviderError_1 = require("../../exceptions/DataProviderError"); +class BuildDataProvider { + constructor(pipelineRestClient) { + this.pipelineRestClient = pipelineRestClient; + } + getReportDataAsync(pipelineConfig, reportDataConfiguration) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + const build = yield this.getBuildAsync(pipelineConfig); + if (build == null) { + throw new PipelineNotFoundError_1.PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); + } + const timeline = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineTimelineAsync(build.id); }), "GetBuildTimeline"); + const changes = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineChangesAsync(build.id); }), "GetPipelineChanges"); + const phases = this.getPhases(timeline); + const lastCompletedBuild = yield this.pipelineRestClient.getLastPipelineAsync(build.definition.id, null, build.sourceBranch); + const lastCompletedTimeline = lastCompletedBuild != null ? yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineTimelineAsync(lastCompletedBuild.id); }), "GetLastCompletedTimeline") : null; + console.log("Fetched release data"); + report.setBuildData(build, timeline, lastCompletedBuild, lastCompletedTimeline, phases, changes); + return report; + }); + } + getBuildAsync(pipelineConfig) { + return __awaiter(this, void 0, void 0, function* () { + var build = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineAsync(); }), "GetPipeline"); + if (util_1.isNullOrUndefined(build)) { + throw new DataProviderError_1.DataProviderError(`Unable to find build with id: ${pipelineConfig.$pipelineId}`); + } + return build; + }); + } + getPhases(timeline) { + const records = timeline.records.sort((a, b) => this.getOrder(a) - this.getOrder(b)); + const phases = records.filter(r => r.type == "Phase"); + if (phases.length > 0) { + const jobs = records.filter(r => r.type == "Job"); + if (jobs.length > 0) { + const tasks = records.filter(r => r.type == "Task"); + const phaseModels = phases.map(phase => { + const jobModels = jobs + .filter(j => j.parentId == phase.id) + .map(j => { + const tasksForThisJob = tasks.filter(t => t.parentId == j.id); + const taskModels = tasksForThisJob.map(task => { + const issues = util_1.isNullOrUndefined(task.issues) || task.issues.length < 1 ? [] : + task.issues.map(i => new IssueModel_1.IssueModel(i.type == BuildInterfaces_1.IssueType.Error ? "Error" : "Warning", i.message)); + return new TaskModel_1.TaskModel(task.name, this.getTaskState(task.result), issues, task.workerName, task.finishTime, task.startTime); + }); + return new JobModel_1.JobModel(j.name, this.getTaskState(j.result), [], taskModels); + }); + return new PhaseModel_1.PhaseModel(phase.name, jobModels, util_1.isNullOrUndefined(phase.result) ? "Unknown" : phase.result.toString(), this.getOrder(phase)); + }); + return phaseModels; + } + } + return []; + } + getTaskState(result) { + switch (result) { + case BuildInterfaces_1.TaskResult.Succeeded: + return ReleaseInterfaces_1.TaskStatus.Succeeded; + case BuildInterfaces_1.TaskResult.SucceededWithIssues: + return ReleaseInterfaces_1.TaskStatus.PartiallySucceeded; + case BuildInterfaces_1.TaskResult.Failed: + return ReleaseInterfaces_1.TaskStatus.Failed; + case BuildInterfaces_1.TaskResult.Canceled: + return ReleaseInterfaces_1.TaskStatus.Canceled; + case BuildInterfaces_1.TaskResult.Skipped: + return ReleaseInterfaces_1.TaskStatus.Skipped; + default: + return ReleaseInterfaces_1.TaskStatus.Unknown; + } + } + getOrder(timelineRecord) { + return util_1.isNullOrUndefined(timelineRecord.order) ? 0 : timelineRecord.order; + } +} +exports.BuildDataProvider = BuildDataProvider; +//# sourceMappingURL=BuildDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js.map new file mode 100644 index 00000000..8f9239be --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildDataProvider.js","sourceRoot":"","sources":["BuildDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.d.ts new file mode 100644 index 00000000..6a0c5de3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.d.ts @@ -0,0 +1,15 @@ +import { IDataProvider } from "../IDataProvider"; +import { Report } from "../../model/Report"; +import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +export declare class ReleaseDataProvider implements IDataProvider { + private pipelineRestClient; + constructor(pipelineRestClient: IPipelineRestClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; + private getReleaseAsync; + private getEnvironment; + private getPhases; + private getJobModelsFromPhase; + private getReleaseByLastCompletedEnvironmentAsync; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js new file mode 100644 index 00000000..e6f2cf14 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js @@ -0,0 +1,116 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseDataProvider = void 0; +const PipelineNotFoundError_1 = require("../../exceptions/PipelineNotFoundError"); +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const DataProviderError_1 = require("../../exceptions/DataProviderError"); +const PhaseModel_1 = require("../../model/PhaseModel"); +const EnvironmentExtensions_1 = require("../../utils/EnvironmentExtensions"); +const JobModel_1 = require("../../model/JobModel"); +const TaskModel_1 = require("../../model/TaskModel"); +const IssueModel_1 = require("../../model/IssueModel"); +const ReportFactory_1 = require("../../model/ReportFactory"); +const RetryablePromise_1 = require("../restclients/RetryablePromise"); +const util_1 = require("util"); +class ReleaseDataProvider { + constructor(pipelineRestClient) { + this.pipelineRestClient = pipelineRestClient; + } + getReportDataAsync(pipelineConfig, reportDataConfiguration) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + const release = yield this.getReleaseAsync(pipelineConfig); + if (release == null) { + throw new PipelineNotFoundError_1.PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); + } + const environment = this.getEnvironment(release, pipelineConfig); + const phases = this.getPhases(environment); + const lastCompletedRelease = yield this.getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment); + let changes = []; + // check if last completed one isn't latter one, then changes don't make sense + if (lastCompletedRelease != null && lastCompletedRelease.id < release.id) { + console.log(`Getting changes between releases ${release.id} & ${lastCompletedRelease.id}`); + try { + changes = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineChangesAsync(lastCompletedRelease.id); }), "GetPipelineChanges"); + } + catch (err) { + // Changes happened in current release w.r.t previous one isn't strictly required to send mail - ignoring any errors + console.warn(`Error while comparing current release - '${release.id}' with previous one - '${lastCompletedRelease.id}': ${err}`); + } + } + else { + console.log("Unable to find any last completed release"); + } + console.log("Fetched release data"); + report.setReleaseData(release, environment, lastCompletedRelease, phases, changes); + return report; + }); + } + getReleaseAsync(pipelineConfig) { + return __awaiter(this, void 0, void 0, function* () { + var release = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineAsync(); }), "GetPipeline"); + if (util_1.isNullOrUndefined(release)) { + throw new DataProviderError_1.DataProviderError(`Unable to find release with release id: ${pipelineConfig.$pipelineId}`); + } + return release; + }); + } + getEnvironment(release, pipelineConfig) { + let environment; + const environments = release.environments; + for (var i = 0; i < environments.length; i++) { + if (environments[i].id == pipelineConfig.$environmentId) { + environment = environments[i]; + break; + } + } + if (pipelineConfig.$usePreviousEnvironment && environments.indexOf(environment) > 0) { + environment = environments[environments.indexOf(environment) - 1]; + } + if (environment != null) { + return environment; + } + throw new DataProviderError_1.DataProviderError(`Unable to find environment with environment id - ${pipelineConfig.$environmentId} in release - ${release.id}`); + } + getPhases(environment) { + var releaseDeployPhases = EnvironmentExtensions_1.EnvironmentExtensions.getPhases(environment); + return releaseDeployPhases.map(r => new PhaseModel_1.PhaseModel(r.name, this.getJobModelsFromPhase(r.deploymentJobs), ReleaseInterfaces_1.DeployPhaseStatus[r.status], r.rank)); + } + getJobModelsFromPhase(deploymentJobs) { + const jobModels = deploymentJobs.map(job => { + const issues = job.job.issues.map(i => new IssueModel_1.IssueModel(i.issueType, i.message)); + const tasks = job.tasks.map(t => { + const issues = t.issues.map(i => new IssueModel_1.IssueModel(i.issueType, i.message)); + return new TaskModel_1.TaskModel(t.name, t.status, issues, t.agentName, t.finishTime, t.startTime); + }); + return new JobModel_1.JobModel(job.job.name, job.job.status, issues, tasks); + }); + return jobModels; + } + getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment) { + return __awaiter(this, void 0, void 0, function* () { + let branchId = null; + if (release.artifacts != null && release.artifacts.length > 0) { + const primaryArtifact = release.artifacts.filter(a => a.isPrimary)[0]; + const defRef = primaryArtifact.definitionReference["branch"]; + branchId = defRef != null ? defRef.id : null; + } + console.log(`Fetching last release by completed environment id - ${pipelineConfig.$environmentId} and branch id ${branchId}`); + const lastRelease = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { + return this.pipelineRestClient.getLastPipelineAsync(release.releaseDefinition.id, environment.definitionEnvironmentId, branchId, null); + }), "GetLastCompletedPipeline"); //Bug in API - release.createdOn); + return lastRelease; + }); + } +} +exports.ReleaseDataProvider = ReleaseDataProvider; +//# sourceMappingURL=ReleaseDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js.map new file mode 100644 index 00000000..6ea3a56a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseDataProvider.js","sourceRoot":"","sources":["ReleaseDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.d.ts new file mode 100644 index 00000000..d47f0af1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.d.ts @@ -0,0 +1,13 @@ +import { WebApi } from "azure-devops-node-api"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export declare abstract class AbstractClient { + protected connection: WebApi; + protected pipelineConfig: PipelineConfiguration; + constructor(pipelineConfig: PipelineConfiguration); + /** + * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api + * @param uri Default URL + * @param accessToken token to get credentials with access to Api calls + */ + private createConnection; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js new file mode 100644 index 00000000..6b4925cb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AbstractClient = void 0; +const azure_devops_node_api_1 = require("azure-devops-node-api"); +class AbstractClient { + constructor(pipelineConfig) { + this.connection = this.createConnection(pipelineConfig.$teamUri, pipelineConfig.$accessKey); + this.pipelineConfig = pipelineConfig; + } + /** + * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api + * @param uri Default URL + * @param accessToken token to get credentials with access to Api calls + */ + createConnection(uri, accessToken) { + const creds = azure_devops_node_api_1.getPersonalAccessTokenHandler(accessToken); + return new azure_devops_node_api_1.WebApi(uri, creds); + } +} +exports.AbstractClient = AbstractClient; +//# sourceMappingURL=AbstractClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js.map new file mode 100644 index 00000000..4680d5a2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbstractClient.js","sourceRoot":"","sources":["AbstractClient.ts"],"names":[],"mappings":";;;AACA,iEAG+B;AAG/B,MAAsB,cAAc;IAKlC,YAAY,cAAqC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5F,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CAAC,GAAW,EAAE,WAAmB;QACvD,MAAM,KAAK,GAAG,qDAA6B,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,IAAI,8BAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;CACF;AAnBD,wCAmBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.d.ts new file mode 100644 index 00000000..60e99da5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.d.ts @@ -0,0 +1,28 @@ +import { AbstractClient } from "./AbstractClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ITestApi } from "azure-devops-node-api/TestApi"; +import { TestResultsDetails, TestResultSummary, TestOutcome, TestResultsQuery, TestCaseResult, ResultsFilter, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +export declare abstract class AbstractTestResultsClient extends AbstractClient implements ITestResultsClient { + private readonly MaxItemsSupported; + protected testApiPromise: Promise; + constructor(pipelineConfig: PipelineConfiguration); + queryTestResultBugs(automatedTestName: string, resultId: number): Promise; + getTestResultById(testRunId: number, resultId: number): Promise; + queryTestResultsReportAsync(parameterConfig?: PipelineConfiguration): Promise; + getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; + getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], parameterConfig?: PipelineConfiguration): Promise; + getTestResultSummaryAsync(includeFailures: boolean, parameterConfig?: PipelineConfiguration): Promise; + getTestResultsByQueryAsync(query: TestResultsQuery): Promise; + protected abstract getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; + protected abstract queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; + protected getOutcomeFilter(outcomes: TestOutcome[]): string; + private getUniqueName; + private isValid; +} +export declare class TestResultsQueryImpl implements TestResultsQuery { + fields: string[]; + results: TestCaseResult[]; + resultsFilter: ResultsFilter; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js new file mode 100644 index 00000000..710c8de9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js @@ -0,0 +1,104 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsQueryImpl = exports.AbstractTestResultsClient = void 0; +const AbstractClient_1 = require("./AbstractClient"); +const RetryablePromise_1 = require("./RetryablePromise"); +class AbstractTestResultsClient extends AbstractClient_1.AbstractClient { + constructor(pipelineConfig) { + super(pipelineConfig); + this.MaxItemsSupported = 100; + this.testApiPromise = this.connection.getTestApi(); + } + queryTestResultBugs(automatedTestName, resultId) { + return __awaiter(this, void 0, void 0, function* () { + const testApi = yield this.testApiPromise; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { + return testApi.queryTestResultWorkItems(this.pipelineConfig.$projectName, "Microsoft.BugCategory", automatedTestName, resultId); + }), "QueryTestResultBugs"); + }); + } + getTestResultById(testRunId, resultId) { + return __awaiter(this, void 0, void 0, function* () { + const testApi = yield this.testApiPromise; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return testApi.getTestResultById(this.pipelineConfig.$projectName, testRunId, resultId); }), "GetTestResultById"); + }); + } + queryTestResultsReportAsync(parameterConfig = null) { + return __awaiter(this, void 0, void 0, function* () { + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.queryTestResultsReportForPipelineAsync(config); }), "QueryTestResultsReport"); + }); + } + getTestResultOwnersAsync(resultsToFetch) { + return __awaiter(this, void 0, void 0, function* () { + var query = new TestResultsQueryImpl(); + query.fields = ["Owner"]; + const results = []; + const testApi = yield this.testApiPromise; + for (let i = 0, j = resultsToFetch.length; i < j; i += this.MaxItemsSupported) { + const tempArray = resultsToFetch.slice(i, i + this.MaxItemsSupported); + query.results = tempArray; + let queryResult = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return testApi.getTestResultsByQuery(query, this.pipelineConfig.$projectName); }), "GetTestResultOwners"); + results.push(...queryResult.results); + } + const ownerMap = new Map(); + results.forEach(r => { + if (this.isValid(r.owner)) { + const key = this.getUniqueName(r.owner); + if (!ownerMap.has(key)) { + ownerMap.set(key, r.owner); + } + } + }); + const identities = []; + ownerMap.forEach((value, key) => identities.push(value)); + return identities; + }); + } + getTestResultsDetailsAsync(groupBy, outcomeFilters, parameterConfig = null) { + return __awaiter(this, void 0, void 0, function* () { + const filter = this.getOutcomeFilter(outcomeFilters); + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.getTestResultsDetailsForPipelineAsync(config, groupBy, filter); }), "GetTestResultsDetails"); + }); + } + getTestResultSummaryAsync(includeFailures, parameterConfig = null) { + return __awaiter(this, void 0, void 0, function* () { + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.queryTestResultsReportForPipelineAsync(config, includeFailures); }), "GetTestResultSummary"); + }); + } + getTestResultsByQueryAsync(query) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).getTestResultsByQuery(query, this.pipelineConfig.$projectId); + }); + } + getOutcomeFilter(outcomes) { + let filter = null; + if (outcomes != null && outcomes.length > 0) { + const outComeString = Array.from(new Set(outcomes.map(o => Number(o)))).join(","); + filter = `Outcome eq ${outComeString}`; + } + return filter; + } + getUniqueName(identity) { + return identity.uniqueName == null ? identity.displayName : identity.uniqueName; + } + isValid(identity) { + return identity != null && (identity.displayName != null || identity.uniqueName != null); + } +} +exports.AbstractTestResultsClient = AbstractTestResultsClient; +class TestResultsQueryImpl { +} +exports.TestResultsQueryImpl = TestResultsQueryImpl; +//# sourceMappingURL=AbstractTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js.map new file mode 100644 index 00000000..5e8d40ff --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbstractTestResultsClient.js","sourceRoot":"","sources":["AbstractTestResultsClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.d.ts new file mode 100644 index 00000000..453a236e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.d.ts @@ -0,0 +1,13 @@ +import { IPipelineRestClient } from "./IPipelineRestClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Build, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { ChangeModel } from "../../model/ChangeModel"; +import { AbstractClient } from "./AbstractClient"; +export declare class BuildRestClient extends AbstractClient implements IPipelineRestClient { + private buildApi; + constructor(pipelineConfig: PipelineConfiguration); + getPipelineAsync(): Promise; + getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; + getPipelineChangesAsync(prevPipelineId: number): Promise; + getPipelineTimelineAsync(pipelineId: number): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js new file mode 100644 index 00000000..57849fc2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js @@ -0,0 +1,53 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildRestClient = void 0; +const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); +const ChangeModel_1 = require("../../model/ChangeModel"); +const AbstractClient_1 = require("./AbstractClient"); +class BuildRestClient extends AbstractClient_1.AbstractClient { + constructor(pipelineConfig) { + super(pipelineConfig); + this.buildApi = this.connection.getBuildApi(); + } + getPipelineAsync() { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.buildApi).getBuild(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); + }); + } + getLastPipelineAsync(pipelineDefId, envDefId, sourceBranchFilter, maxCreatedDate) { + return __awaiter(this, void 0, void 0, function* () { + const builds = yield (yield this.buildApi).getBuilds(this.pipelineConfig.$projectId, [pipelineDefId], null, null, null, maxCreatedDate, null, null, null, BuildInterfaces_1.BuildResult.Succeeded | BuildInterfaces_1.BuildResult.PartiallySucceeded | BuildInterfaces_1.BuildResult.Failed | BuildInterfaces_1.BuildResult.Canceled, null, null, 1, null, null, null, BuildInterfaces_1.BuildQueryOrder.FinishTimeDescending, sourceBranchFilter); + if (builds != null && builds.length > 0) { + return builds[0]; + } + console.log(`Unable to find any build for definition id - ${pipelineDefId}`); + return null; + }); + } + getPipelineChangesAsync(prevPipelineId) { + return __awaiter(this, void 0, void 0, function* () { + const changes = yield (yield this.buildApi).getBuildChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); + if (changes == null || changes.length < 1) { + console.log(`No changes found for pipelineId - ${this.pipelineConfig.$pipelineId}`); + return []; + } + return changes.map(item => new ChangeModel_1.ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); + }); + } + getPipelineTimelineAsync(pipelineId) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.buildApi).getBuildTimeline(this.pipelineConfig.$projectId, pipelineId); + }); + } +} +exports.BuildRestClient = BuildRestClient; +//# sourceMappingURL=BuildClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js.map new file mode 100644 index 00000000..ce1c3b65 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildClient.js","sourceRoot":"","sources":["BuildClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,sFAAiH;AACjH,yDAAsD;AACtD,qDAAkD;AAGlD,MAAa,eAAgB,SAAQ,+BAAc;IAIjD,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAEY,gBAAgB;;YAC3B,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC/G,CAAC;KAAA;IAEY,oBAAoB,CAAC,aAAqB,EAAE,QAAgB,EAAE,kBAA0B,EAAE,cAAqB;;YAC1H,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAClD,IAAI,CAAC,cAAc,CAAC,UAAU,EAC9B,CAAC,aAAa,CAAC,EACf,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,6BAAW,CAAC,SAAS,GAAG,6BAAW,CAAC,kBAAkB,GAAG,6BAAW,CAAC,MAAM,GAAG,6BAAW,CAAC,QAAQ,EAClG,IAAI,EACJ,IAAI,EACJ,CAAC,EACD,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,iCAAe,CAAC,oBAAoB,EACpC,kBAAkB,CAAC,CAAC;YACtB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;aAClB;YACD,OAAO,CAAC,GAAG,CAAC,gDAAgD,aAAa,EAAE,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEY,uBAAuB,CAAC,cAAsB;;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC7H,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpF,OAAO,EAAE,CAAC;aACX;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,yBAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjH,CAAC;KAAA;IAEY,wBAAwB,CAAC,UAAkB;;YACtD,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClG,CAAC;KAAA;CACF;AApDD,0CAoDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/BuildClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/BuildClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.d.ts new file mode 100644 index 00000000..f7811c61 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.d.ts @@ -0,0 +1,9 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; +export declare class BuildTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { + constructor(pipelineConfig: PipelineConfiguration); + queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; + getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js new file mode 100644 index 00000000..8bbc626c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js @@ -0,0 +1,30 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildTestResultsClient = void 0; +const AbstractTestResultsClient_1 = require("./AbstractTestResultsClient"); +class BuildTestResultsClient extends AbstractTestResultsClient_1.AbstractTestResultsClient { + constructor(pipelineConfig) { + super(pipelineConfig); + } + queryTestResultsReportForPipelineAsync(config, includeFailures) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).queryTestResultsReportForBuild(config.$projectName, config.$pipelineId, null, includeFailures); + }); + } + getTestResultsDetailsForPipelineAsync(config, groupBy, filter) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).getTestResultDetailsForBuild(config.$projectName, config.$pipelineId, null, groupBy, filter); + }); + } +} +exports.BuildTestResultsClient = BuildTestResultsClient; +//# sourceMappingURL=BuildTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js.map new file mode 100644 index 00000000..9d63a129 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildTestResultsClient.js","sourceRoot":"","sources":["BuildTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2EAAwE;AAExE,MAAa,sBAAuB,SAAQ,qDAAyB;IAEnE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAEY,sCAAsC,CAAC,MAA6B,EAAE,eAAyB;;YAC1G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,8BAA8B,CACrE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,IAAI,EACJ,eAAe,CAAC,CAAC;QACrB,CAAC;KAAA;IAEY,qCAAqC,CAAC,MAA6B,EAAE,OAAgB,EAAE,MAAe;;YACjH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,4BAA4B,CACnE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,IAAI,EACJ,OAAO,EACP,MAAM,CAAC,CAAC;QACZ,CAAC;KAAA;CACF;AAtBD,wDAsBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.d.ts new file mode 100644 index 00000000..ed7a5b4d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.d.ts @@ -0,0 +1,8 @@ +import { Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { ChangeModel } from "../../model/ChangeModel"; +export interface IPipelineRestClient { + getPipelineAsync(): Promise; + getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; + getPipelineChangesAsync(prevPipelineId: number): Promise; + getPipelineTimelineAsync(pipelineId: number): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js new file mode 100644 index 00000000..84a6db77 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IPipelineRestClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js.map new file mode 100644 index 00000000..cd6b91b4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IPipelineRestClient.js","sourceRoot":"","sources":["IPipelineRestClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.d.ts new file mode 100644 index 00000000..74404ca3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.d.ts @@ -0,0 +1,12 @@ +import { TestResultsDetails, TestResultSummary, TestOutcome, TestCaseResult, WorkItemReference, TestResultsQuery } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export interface ITestResultsClient { + queryTestResultBugs(automatedTestName: string, resultId: number): Promise; + getTestResultById(testRunId: number, resultId: number): Promise; + queryTestResultsReportAsync(config?: PipelineConfiguration): Promise; + getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; + getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], config?: PipelineConfiguration): Promise; + getTestResultSummaryAsync(includeFailures: boolean, config?: PipelineConfiguration): Promise; + getTestResultsByQueryAsync(query: TestResultsQuery): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js new file mode 100644 index 00000000..b07895ab --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=ITestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js.map new file mode 100644 index 00000000..79df6b69 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ITestResultsClient.js","sourceRoot":"","sources":["ITestResultsClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ITestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ITestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.d.ts new file mode 100644 index 00000000..28259330 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.d.ts @@ -0,0 +1,4 @@ +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +export interface IWorkItemClient { + getWorkItemsAsync(workItemIds: number[]): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js new file mode 100644 index 00000000..058bea92 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IWorkItemClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js.map new file mode 100644 index 00000000..37f3ef71 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IWorkItemClient.js","sourceRoot":"","sources":["IWorkItemClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/IWorkItemClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/IWorkItemClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.d.ts new file mode 100644 index 00000000..a40b9e67 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.d.ts @@ -0,0 +1,12 @@ +import { Release } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { AbstractClient } from "./AbstractClient"; +import { IPipelineRestClient } from "./IPipelineRestClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ChangeModel } from "../../model/ChangeModel"; +export declare class ReleaseRestClient extends AbstractClient implements IPipelineRestClient { + constructor(pipelineConfig: PipelineConfiguration); + getPipelineAsync(): Promise; + getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; + getPipelineChangesAsync(prevPipelineId: number): Promise; + getPipelineTimelineAsync(pipelineId: number): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js new file mode 100644 index 00000000..89c786bb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js @@ -0,0 +1,68 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseRestClient = void 0; +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const AbstractClient_1 = require("./AbstractClient"); +const ChangeModel_1 = require("../../model/ChangeModel"); +const util_1 = require("util"); +class ReleaseRestClient extends AbstractClient_1.AbstractClient { + constructor(pipelineConfig) { + super(pipelineConfig); + } + getPipelineAsync() { + return __awaiter(this, void 0, void 0, function* () { + return (yield this.connection.getReleaseApi()).getRelease(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); + }); + } + getLastPipelineAsync(pipelineDefId, envDefId, sourceBranchFilter, maxCreatedDate) { + return __awaiter(this, void 0, void 0, function* () { + const releaseApi = yield this.connection.getReleaseApi(); + let lastRelease = null; + const releaseStatusFilter = ReleaseInterfaces_1.ReleaseStatus.Active; + const envStatusFilter = ReleaseInterfaces_1.EnvironmentStatus.Succeeded | ReleaseInterfaces_1.EnvironmentStatus.PartiallySucceeded | ReleaseInterfaces_1.EnvironmentStatus.Rejected | ReleaseInterfaces_1.EnvironmentStatus.Canceled; + const releases = yield releaseApi.getReleases(this.pipelineConfig.$projectId, pipelineDefId, envDefId, null, null, releaseStatusFilter, envStatusFilter, null, maxCreatedDate, ReleaseInterfaces_1.ReleaseQueryOrder.Descending, null, null, ReleaseInterfaces_1.ReleaseExpands.Environments, null, null, null, sourceBranchFilter); + if (!util_1.isNullOrUndefined(releases) && releases.length > 0) { + // Ideally, first one should be last completed one. Unless someone's running the report after the release has completed for some reason. + console.log(`Considering one of [${releases.map(r => r.id).join(",")}] as previous completed release for ${this.pipelineConfig.$pipelineId}`); + for (let i = 0; i < releases.length; i++) { + if (releases[i].id < this.pipelineConfig.$pipelineId) { + lastRelease = releases[i]; + break; + } + } + } + if (util_1.isNullOrUndefined(lastRelease)) { + console.log(`Unable to fetch last completed release for release definition:${pipelineDefId} and environmentid: ${envDefId}`); + } + else if (lastRelease.id < this.pipelineConfig.$pipelineId) { + return yield releaseApi.getRelease(this.pipelineConfig.$projectId, lastRelease.id); + } + return lastRelease; + }); + } + getPipelineChangesAsync(prevPipelineId) { + return __awaiter(this, void 0, void 0, function* () { + console.log(`Fetching changes between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); + const changes = yield (yield this.connection.getReleaseApi()).getReleaseChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId, prevPipelineId); + if (changes == null || changes.length < 1) { + console.log(`No changes found between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); + return []; + } + return changes.map(item => new ChangeModel_1.ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); + }); + } + getPipelineTimelineAsync(pipelineId) { + throw new Error("Method not supported."); + } +} +exports.ReleaseRestClient = ReleaseRestClient; +//# sourceMappingURL=ReleaseClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js.map new file mode 100644 index 00000000..1c5d68f8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseClient.js","sourceRoot":"","sources":["ReleaseClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ReleaseClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ReleaseClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.d.ts new file mode 100644 index 00000000..4aa8b06e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.d.ts @@ -0,0 +1,9 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; +export declare class ReleaseTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { + constructor(pipelineConfig: PipelineConfiguration); + queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; + getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js new file mode 100644 index 00000000..0550db87 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js @@ -0,0 +1,30 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseTestResultsClient = void 0; +const AbstractTestResultsClient_1 = require("./AbstractTestResultsClient"); +class ReleaseTestResultsClient extends AbstractTestResultsClient_1.AbstractTestResultsClient { + constructor(pipelineConfig) { + super(pipelineConfig); + } + queryTestResultsReportForPipelineAsync(config, includeFailures) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).queryTestResultsReportForRelease(config.$projectName, config.$pipelineId, config.$environmentId, null, includeFailures); + }); + } + getTestResultsDetailsForPipelineAsync(config, groupBy, filter) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).getTestResultDetailsForRelease(config.$projectName, config.$pipelineId, config.$environmentId, null, groupBy, filter); + }); + } +} +exports.ReleaseTestResultsClient = ReleaseTestResultsClient; +//# sourceMappingURL=ReleaseTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js.map new file mode 100644 index 00000000..2ea0d33f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseTestResultsClient.js","sourceRoot":"","sources":["ReleaseTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2EAAwE;AAExE,MAAa,wBAAyB,SAAQ,qDAAyB;IAErE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAEY,sCAAsC,CAAC,MAA6B,EAAE,eAAyB;;YAC1G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,gCAAgC,CACvE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,eAAe,CAAC,CAAC;QACrB,CAAC;KAAA;IAEY,qCAAqC,CAAC,MAA6B,EAAE,OAAgB,EAAE,MAAe;;YACjH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,8BAA8B,CACrE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,OAAO,EACP,MAAM,CAAC,CAAC;QACZ,CAAC;KAAA;CACF;AAxBD,4DAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.d.ts new file mode 100644 index 00000000..2237a73c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.d.ts @@ -0,0 +1,4 @@ +export declare class RetryablePromise { + private static defaultRetryCount; + static RetryAsync(executor: () => Promise, executorName: string, times?: number): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js new file mode 100644 index 00000000..3f13ad1e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js @@ -0,0 +1,50 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RetryablePromise = void 0; +const TelemetryLogger_1 = require("../../telemetry/TelemetryLogger"); +const now = require('performance-now'); +class RetryablePromise { + static RetryAsync(executor, executorName, times = this.defaultRetryCount) { + return __awaiter(this, void 0, void 0, function* () { + const perfStart = now(); + let attemptNumber = 1; + let lastError; + try { + do { + try { + let returnVal = yield executor(); + if (attemptNumber > 1) { + console.log(`Completed on Retry attempt: ${attemptNumber}`); + } + return returnVal; + } + catch (err) { + lastError = err; + console.log(`Retry <${executorName}>: ${attemptNumber} : ${err}`); + } + attemptNumber++; + } while (attemptNumber <= times); + console.log(`All Retries exhausted. Throwing error: ${lastError}`); + throw lastError; + } + finally { + if (attemptNumber > 1) { + // Log time taken after all retries + TelemetryLogger_1.TelemetryLogger.LogModulePerf(executorName, now() - perfStart); + } + } + }); + } +} +exports.RetryablePromise = RetryablePromise; +RetryablePromise.defaultRetryCount = 3; +//# sourceMappingURL=RetryablePromise.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js.map new file mode 100644 index 00000000..fcc42ea8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RetryablePromise.js","sourceRoot":"","sources":["RetryablePromise.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qEAAkE;AAClE,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAa,gBAAgB;IAIlB,MAAM,CAAO,UAAU,CAAI,QAA0B,EAAE,YAAoB,EAAE,QAAgB,IAAI,CAAC,iBAAiB;;YACtH,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACxB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,SAAgB,CAAC;YACrB,IAAI;gBACA,GAAG;oBACC,IAAI;wBACA,IAAI,SAAS,GAAG,MAAM,QAAQ,EAAE,CAAC;wBACjC,IAAI,aAAa,GAAG,CAAC,EAAE;4BACnB,OAAO,CAAC,GAAG,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;yBAC/D;wBACD,OAAO,SAAS,CAAC;qBACpB;oBACD,OAAO,GAAG,EAAE;wBACR,SAAS,GAAG,GAAG,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,UAAU,YAAY,MAAM,aAAa,MAAM,GAAG,EAAE,CAAC,CAAC;qBACrE;oBACD,aAAa,EAAE,CAAC;iBACnB,QAAQ,aAAa,IAAI,KAAK,EAAE;gBAEjC,OAAO,CAAC,GAAG,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;gBACnE,MAAM,SAAS,CAAC;aACnB;oBACO;gBACJ,IAAI,aAAa,GAAG,CAAC,EAAE;oBACnB,mCAAmC;oBACnC,iCAAe,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;iBAClE;aACJ;QACL,CAAC;KAAA;;AAjCL,4CAkCC;AAhCkB,kCAAiB,GAAW,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/RetryablePromise.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/RetryablePromise.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.d.ts new file mode 100644 index 00000000..1283d408 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.d.ts @@ -0,0 +1,9 @@ +import { AbstractClient } from "./AbstractClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { IWorkItemClient } from "./IWorkItemClient"; +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +export declare class WorkItemClient extends AbstractClient implements IWorkItemClient { + private workApiPromise; + constructor(pipelineConfig: PipelineConfiguration); + getWorkItemsAsync(workItemIds: number[]): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js new file mode 100644 index 00000000..bcff8bf2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js @@ -0,0 +1,37 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkItemClient = void 0; +const AbstractClient_1 = require("./AbstractClient"); +class WorkItemClient extends AbstractClient_1.AbstractClient { + constructor(pipelineConfig) { + super(pipelineConfig); + this.workApiPromise = this.connection.getWorkItemTrackingApi(); + } + getWorkItemsAsync(workItemIds) { + return __awaiter(this, void 0, void 0, function* () { + const chunks = []; + var i, j, temparray, chunk = 100; + for (i = 0, j = workItemIds.length; i < j; i += chunk) { + temparray = workItemIds.slice(i, i + chunk); + chunks.push(temparray); + } + const workApi = yield this.workApiPromise; + const chunkResults = chunks.map(chunk => workApi.getWorkItems(chunk)); + const workItems = yield Promise.all(chunkResults); + const flatItemList = []; + workItems.forEach(wlist => flatItemList.push(...wlist)); + return flatItemList; + }); + } +} +exports.WorkItemClient = WorkItemClient; +//# sourceMappingURL=WorkItemClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js.map new file mode 100644 index 00000000..60fed502 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"WorkItemClient.js","sourceRoot":"","sources":["WorkItemClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkD;AAMlD,MAAa,cAAe,SAAQ,+BAAc;IAIhD,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC;IACjE,CAAC;IAEY,iBAAiB,CAAC,WAAqB;;YAElD,MAAM,MAAM,GAAe,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,GAAG,GAAG,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE;gBACrD,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aACxB;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,YAAY,GAAe,EAAE,CAAC;YACpC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACxD,OAAO,YAAY,CAAC;QACtB,CAAC;KAAA;CACF;AA1BD,wCA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/WorkItemClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/restclients/WorkItemClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.d.ts new file mode 100644 index 00000000..a7c5ae6c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.d.ts @@ -0,0 +1,9 @@ +import { TestOutcome, TestCaseResult, CustomTestField } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TcmHelper { + static readonly OutcomeConfidenceValue: Number; + static exceptOutcomes(outcomesToExclude: TestOutcome[]): TestOutcome[]; + static parseOutcome(outcomeString: string): TestOutcome; + static isTestFlaky(result: TestCaseResult): boolean; + static getCustomField(result: TestCaseResult, fieldName: string): CustomTestField; + static Merge(source: Array>): T[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js new file mode 100644 index 00000000..585e4aea --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js @@ -0,0 +1,67 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TcmHelper = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +class TcmHelper { + static exceptOutcomes(outcomesToExclude) { + const otherOutComes = []; + for (let outcome in TestInterfaces_1.TestOutcome) { + var outcomeNum = Number(outcome); + if (!isNaN(outcomeNum) && !outcomesToExclude.includes(outcomeNum)) { + otherOutComes.push(outcomeNum); + } + } + return otherOutComes; + } + static parseOutcome(outcomeString) { + let result; + switch (outcomeString) { + case "Passed": + result = TestInterfaces_1.TestOutcome.Passed; + break; + case "Failed": + result = TestInterfaces_1.TestOutcome.Failed; + break; + case "Inconclusive": + result = TestInterfaces_1.TestOutcome.Inconclusive; + break; + case "NotExecuted": + result = TestInterfaces_1.TestOutcome.NotExecuted; + break; + default: + result = TestInterfaces_1.TestOutcome.None; + break; + } + return result; + } + static isTestFlaky(result) { + var outcomeConfidenceField = TcmHelper.getCustomField(result, "OutcomeConfidence"); + if (outcomeConfidenceField != null + && outcomeConfidenceField.value != null) { + const outcomeFieldValue = Number.parseFloat(outcomeConfidenceField.value); + if (!isNaN(outcomeFieldValue)) { + return outcomeFieldValue == TcmHelper.OutcomeConfidenceValue; + } + } + return false; + } + static getCustomField(result, fieldName) { + if (result.customFields == null) { + return null; + } + var cf = result.customFields.filter(c => c.fieldName.toLowerCase() == fieldName.toLowerCase()); + return cf.length > 0 ? cf[0] : null; + } + static Merge(source) { + const mergedResults = []; + source.forEach(item => { + if (item != null) { + mergedResults.push(...item); + } + }); + return mergedResults; + } +} +exports.TcmHelper = TcmHelper; +TcmHelper.OutcomeConfidenceValue = 0.0; +//# sourceMappingURL=TcmHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js.map new file mode 100644 index 00000000..032d716d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TcmHelper.js","sourceRoot":"","sources":["TcmHelper.ts"],"names":[],"mappings":";;;AAAA,oFAA+G;AAE/G,MAAa,SAAS;IAIb,MAAM,CAAC,cAAc,CAAC,iBAAgC;QAC3D,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,KAAK,IAAI,OAAO,IAAI,4BAAW,EAAE;YAC/B,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBACjE,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAChC;SACF;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,aAAqB;QAC9C,IAAI,MAAmB,CAAC;QACxB,QAAQ,aAAa,EAAE;YACrB,KAAK,QAAQ;gBAAE,MAAM,GAAG,4BAAW,CAAC,MAAM,CAAC;gBAAC,MAAM;YAClD,KAAK,QAAQ;gBAAE,MAAM,GAAG,4BAAW,CAAC,MAAM,CAAC;gBAAC,MAAM;YAClD,KAAK,cAAc;gBAAE,MAAM,GAAG,4BAAW,CAAC,YAAY,CAAC;gBAAC,MAAM;YAC9D,KAAK,aAAa;gBAAE,MAAM,GAAG,4BAAW,CAAC,WAAW,CAAC;gBAAC,MAAM;YAC5D;gBAAS,MAAM,GAAG,4BAAW,CAAC,IAAI,CAAC;gBAAC,MAAM;SAC3C;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,MAAsB;QAC9C,IAAI,sBAAsB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACnF,IAAI,sBAAsB,IAAI,IAAI;eAC7B,sBAAsB,CAAC,KAAK,IAAI,IAAI,EAAE;YACzC,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE;gBAC7B,OAAO,iBAAiB,IAAI,SAAS,CAAC,sBAAsB,CAAC;aAC9D;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,MAAsB,EAAE,SAAiB;QACpE,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;QAED,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAI,MAAuB;QAC5C,MAAM,aAAa,GAAQ,EAAE,CAAC;QAE9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACpB,IAAI,IAAI,IAAI,IAAI,EAAE;gBAChB,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;aAC7B;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;;AA5DH,8BA8DC;AA5DwB,gCAAsB,GAAW,GAAG,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.d.ts new file mode 100644 index 00000000..46e1f987 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.d.ts @@ -0,0 +1,10 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +export declare class TestOwnersDataProvider implements IDataProvider { + private testResultsClient; + constructor(testResultsClient: ITestResultsClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js new file mode 100644 index 00000000..124e9e8b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js @@ -0,0 +1,35 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestOwnersDataProvider = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const ReportFactory_1 = require("../../model/ReportFactory"); +class TestOwnersDataProvider { + constructor(testResultsClient) { + this.testResultsClient = testResultsClient; + } + getReportDataAsync(pipelineConfig, reportDataConfig) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + const failedTestResultDetails = yield this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestInterfaces_1.TestOutcome.Failed]); + const resultsToFetch = []; + failedTestResultDetails.resultsForGroup.forEach(r => { + resultsToFetch.push(...r.results); + }); + const failedOwners = yield this.testResultsClient.getTestResultOwnersAsync(resultsToFetch); + report.$failedTestOwners.push(...failedOwners); + console.log("Fetched test owners data"); + return report; + }); + } +} +exports.TestOwnersDataProvider = TestOwnersDataProvider; +//# sourceMappingURL=TestOwnersDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js.map new file mode 100644 index 00000000..0cc5a285 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestOwnersDataProvider.js","sourceRoot":"","sources":["TestOwnersDataProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAKA,oFAA8F;AAC9F,6DAA0D;AAE1D,MAAa,sBAAsB;IAIjC,YAAY,iBAAqC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEY,kBAAkB,CAAC,cAAqC,EAAE,gBAAyC;;YAC9G,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAC7D,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,SAAS,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAEzH,MAAM,cAAc,GAAqB,EAAE,CAAC;YAC5C,uBAAuB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClD,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAC3F,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YAE/C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CACF;AAvBD,wDAuBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.d.ts new file mode 100644 index 00000000..daee1718 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.d.ts @@ -0,0 +1,19 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { IWorkItemClient } from "../restclients/IWorkItemClient"; +export declare class TestResultsDataProvider implements IDataProvider { + private testResultsClient; + private workItemClient; + constructor(testResultsClient: ITestResultsClient, workItemClient: IWorkItemClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise; + private setFilteredTestResults; + private getTestResultsWithWorkItems; + private getTestResultsForResultsGroupWithWorkItemsAsync; + private getWorkItemsAsync; + private getTestResultsWithBugRefs; + private filterTestResults; + private getIncludedOutcomes; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js new file mode 100644 index 00000000..e02bdc0c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js @@ -0,0 +1,177 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsDataProvider = void 0; +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TcmHelper_1 = require("./TcmHelper"); +const TestResultGroupModel_1 = require("../../model/testresults/TestResultGroupModel"); +const TestResultModel_1 = require("../../model/testresults/TestResultModel"); +const TestResultDetailsParserFactory_1 = require("../helpers/TestResultDetailsParserFactory"); +const ReportFactory_1 = require("../../model/ReportFactory"); +const util_1 = require("util"); +class TestResultsDataProvider { + constructor(testResultsClient, workItemClient) { + this.testResultsClient = testResultsClient; + this.workItemClient = workItemClient; + } + getReportDataAsync(pipelineConfig, reportDataConfig) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + // This is to make sure the failing since information is computed before we fetch test results + yield this.testResultsClient.queryTestResultsReportAsync(); + yield this.setFilteredTestResults(pipelineConfig, reportDataConfig.$testResultsConfig, report); + return report; + }); + } + setFilteredTestResults(config, testResultsConfiguration, report) { + return __awaiter(this, void 0, void 0, function* () { + if (testResultsConfiguration.$includeFailedTests || testResultsConfiguration.$includeOtherTests || testResultsConfiguration.$includePassedTests) { + const groupBy = testResultsConfiguration.$groupTestResultsBy == GroupTestResultsBy_1.GroupTestResultsBy.Run ? "TestRun" : "Priority"; + const includedOutcomes = this.getIncludedOutcomes(testResultsConfiguration); + const resultIdsToFetch = yield this.testResultsClient.getTestResultsDetailsAsync(groupBy, includedOutcomes); + report.hasFilteredTests = this.filterTestResults(resultIdsToFetch, testResultsConfiguration.$maxItemsToShow); + const filteredTestResultGroups = yield this.getTestResultsWithWorkItems(resultIdsToFetch); + report.filteredResults = filteredTestResultGroups; + } + }); + } + getTestResultsWithWorkItems(resultIdsToFetch) { + return __awaiter(this, void 0, void 0, function* () { + const testResultDetailsParser = TestResultDetailsParserFactory_1.TestResultDetailsParserFactory.getParser(resultIdsToFetch); + const filteredTestResultGroups = resultIdsToFetch.resultsForGroup + .map(resultsForGroup => this.getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, testResultDetailsParser)); + const results = yield Promise.all(filteredTestResultGroups); + return results; + }); + } + getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, parser) { + return __awaiter(this, void 0, void 0, function* () { + var resultGroup = new TestResultGroupModel_1.TestResultsGroupModel(); + resultGroup.groupName = parser.getGroupByValue(resultsForGroup); + const bugsRefs = []; + const results = yield this.getTestResultsWithBugRefs(resultsForGroup, bugsRefs); + try { + const workItemDictionary = yield this.getWorkItemsAsync(bugsRefs); + results.forEach(result => { + if (result.associatedBugRefs != null && result.associatedBugRefs.length > 0) { + result.associatedBugRefs.forEach(workItemReference => { + result.associatedBugs.push(workItemDictionary.get(Number.parseInt(workItemReference.id))); + }); + } + }); + } + catch (ex) { + // ignore + console.warn(`Error while fetching workitems for bugrefs: ${bugsRefs.map(b => b.id)}`); + } + results.forEach(result => { + if (result.testResult.outcome != null) { + const testOutcome = TcmHelper_1.TcmHelper.parseOutcome(result.testResult.outcome); + if (!resultGroup.testResults.has(testOutcome)) { + resultGroup.testResults.set(testOutcome, []); + } + resultGroup.testResults.get(testOutcome).push(result); + } + else { + console.log(`Found test with outcome as null. Test result id ${result.testResult.id} in Test run ${result.testResult.testRun.id}`); + } + }); + return resultGroup; + }); + } + getWorkItemsAsync(bugsRefs) { + return __awaiter(this, void 0, void 0, function* () { + const workItemDictionary = new Map(); + if (bugsRefs != null && bugsRefs.length > 0) { + const workItems = yield this.workItemClient.getWorkItemsAsync(bugsRefs.map(bugRef => Number.parseInt(bugRef.id))); + workItems.forEach(workItem => { + if (workItem.id != null) { + workItemDictionary.set(workItem.id, workItem); + } + else { + console.log(`Unable to get id for a work item`); + } + }); + } + return workItemDictionary; + }); + } + getTestResultsWithBugRefs(resultsForGroup, bugReferencesInGroup) { + return __awaiter(this, void 0, void 0, function* () { + const resultModels = []; + for (var i = 0; i < resultsForGroup.results.length; i++) { + const resultIdObj = resultsForGroup.results[i]; + const testResult = yield this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); + // Remove flaky tests + if (util_1.isNullOrUndefined(testResult) || TcmHelper_1.TcmHelper.isTestFlaky(testResult)) { + continue; + } + const associatedBugRefs = yield this.testResultsClient.queryTestResultBugs(testResult.automatedTestName, testResult.id); + const resultModel = new TestResultModel_1.TestResultModel(); + resultModel.testResult = testResult; + resultModel.associatedBugRefs = associatedBugRefs; + resultModels.push(resultModel); + } + // let results = resultsForGroup.results + // .map(async resultIdObj => + // { + // const resultModel = new TestResultModel(); + // resultModel.testResult = await this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); + // // Remove flaky tests + // if (TcmHelper.isTestFlaky(resultModel.testResult)) + // { + // return null; + // } + // resultModel.associatedBugRefs = await this.testResultsClient.queryTestResultBugs(resultModel.testResult.automatedTestName, resultModel.testResult.id); + // return resultModel; + // }); + //Remove all null values from array + //results = results.filter(r => r != null); + //results.forEach(async result => resultModels.push((await result))); + resultModels.forEach(result => bugReferencesInGroup.push(...result.associatedBugRefs)); + return resultModels; + }); + } + filterTestResults(resultIdsToFetch, maxItems) { + var hasFiltered = false; + var remainingItems = maxItems; + for (let i = 0; i < resultIdsToFetch.resultsForGroup.length; i++) { + const group = resultIdsToFetch.resultsForGroup[i]; + var currentItemsSize = group.results.length; + if (currentItemsSize > remainingItems) { + hasFiltered = true; + const results = []; + results.push(...group.results); + group.results = results.splice(0, remainingItems); + break; + } + remainingItems -= group.results.length; + } + resultIdsToFetch.resultsForGroup = resultIdsToFetch.resultsForGroup.filter(group => group.results.length > 0); + return hasFiltered; + } + getIncludedOutcomes(testResultsConfiguration) { + const includedOutcomes = []; + if (testResultsConfiguration.$includeFailedTests) { + includedOutcomes.push(TestInterfaces_1.TestOutcome.Failed); + } + if (testResultsConfiguration.$includeOtherTests) { + includedOutcomes.push(...TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed])); + } + if (testResultsConfiguration.$includePassedTests) { + includedOutcomes.push(TestInterfaces_1.TestOutcome.Passed); + } + return includedOutcomes; + } +} +exports.TestResultsDataProvider = TestResultsDataProvider; +//# sourceMappingURL=TestResultsDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js.map new file mode 100644 index 00000000..66c98667 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultsDataProvider.js","sourceRoot":"","sources":["TestResultsDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.d.ts new file mode 100644 index 00000000..9e3f97cc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.d.ts @@ -0,0 +1,14 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +export declare class TestSummaryDataProvider implements IDataProvider { + private testResultsClient; + constructor(testResultsClient: ITestResultsClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; + private getTestSummaryByPriorityAsync; + private getTestRunSummaryWithPriorityAsync; + private getSummaryByRun; + private getTestSummaryDataByPriorityAsync; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js new file mode 100644 index 00000000..985ef1d5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js @@ -0,0 +1,120 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryDataProvider = void 0; +const TestSummaryGroupModel_1 = require("../../model/testresults/TestSummaryGroupModel"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +const TestResultDetailsParserForRun_1 = require("../helpers/TestResultDetailsParserForRun"); +const TestOutcomeForPriority_1 = require("../../model/testresults/TestOutcomeForPriority"); +const TestResultDetailsParserForPriority_1 = require("../helpers/TestResultDetailsParserForPriority"); +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TcmHelper_1 = require("./TcmHelper"); +const ReportFactory_1 = require("../../model/ReportFactory"); +class TestSummaryDataProvider { + constructor(testResultsClient) { + this.testResultsClient = testResultsClient; + } + getReportDataAsync(pipelineConfig, reportDataConfiguration) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + const testSummaryGroups = []; + const testSummaryGroupModelForRun = yield this.getTestRunSummaryWithPriorityAsync(pipelineConfig); + testSummaryGroups.push(testSummaryGroupModelForRun); + report.testResultSummary = yield this.testResultsClient.getTestResultSummaryAsync(true); + // Hack - above testresultsummary is incomplete - bug filed + //const passedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Passed]); + //const failedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Failed]); + //this.setOutComeData(report, testSummaryGroups, TestOutcome.Passed, passedResults); + //this.setOutComeData(report, testSummaryGroups, TestOutcome.Failed, failedResults); + if (reportDataConfiguration.$groupTestSummaryBy.includes(GroupTestResultsBy_1.GroupTestResultsBy.Priority)) { + testSummaryGroups.push(yield this.getTestSummaryByPriorityAsync()); + } + report.$testSummaryGroups.push(...testSummaryGroups); + return report; + }); + } + getTestSummaryByPriorityAsync() { + return __awaiter(this, void 0, void 0, function* () { + const testSummaryItemsByRuns = yield this.testResultsClient.getTestResultsDetailsAsync("Priority"); + var testResultDetailsParserForPriority = new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(testSummaryItemsByRuns); + const testSummaryByPriority = new TestSummaryGroupModel_1.TestSummaryGroupModel(); + testSummaryByPriority.groupedBy = GroupTestResultsBy_1.GroupTestResultsBy.Priority; + const summaryItems = testResultDetailsParserForPriority.getSummaryItems(); + testSummaryByPriority.runs.push(...summaryItems); + return testSummaryByPriority; + }); + } + getTestRunSummaryWithPriorityAsync(config) { + return __awaiter(this, void 0, void 0, function* () { + const testSummaryByRun = new TestSummaryGroupModel_1.TestSummaryGroupModel(); + testSummaryByRun.groupedBy = GroupTestResultsBy_1.GroupTestResultsBy.Run; + if (config.$pipelineType == PipelineType_1.PipelineType.Release) { + const testResultsDetailsByTestRun = yield this.testResultsClient.getTestResultsDetailsAsync("TestRun"); + const summaryDataByPriority = yield this.getTestSummaryDataByPriorityAsync(); + const summaryByRun = new TestResultDetailsParserForRun_1.TestResultDetailsParserForRun(testResultsDetailsByTestRun); + const summaryItems = yield this.getSummaryByRun(summaryByRun, summaryDataByPriority); + testSummaryByRun.runs.push(...summaryItems); + } + return testSummaryByRun; + }); + } + getSummaryByRun(testResultByRun, testResultsForPriorityByOutcome) { + const summaryItemByRun = testResultByRun.getSummaryItems(); + summaryItemByRun.forEach(summaryItem => { + testResultsForPriorityByOutcome.forEach((value, supportedTestOutcome) => { + const resultCountByPriority = value.getTestResultsForRun(Number.parseInt(summaryItem.$id)); + resultCountByPriority.forEach((resultCount, priority) => { + if (!summaryItem.$testCountForOutcomeByPriority.has(priority)) { + summaryItem.$testCountForOutcomeByPriority.set(priority, new Map()); + } + const testCountByOutcome = summaryItem.$testCountForOutcomeByPriority.get(priority); + if (!testCountByOutcome.has(supportedTestOutcome)) { + testCountByOutcome.set(supportedTestOutcome, 0); + } + testCountByOutcome.set(supportedTestOutcome, testCountByOutcome.get(supportedTestOutcome) + resultCountByPriority.get(priority)); + }); + }); + }); + return summaryItemByRun; + } + getTestSummaryDataByPriorityAsync() { + return __awaiter(this, void 0, void 0, function* () { + var outcomeFilters = new Map(); + outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed, [TestInterfaces_1.TestOutcome.Passed]); + outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Inconclusive, [TestInterfaces_1.TestOutcome.Inconclusive]); + outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.NotExecuted, [TestInterfaces_1.TestOutcome.NotExecuted]); + outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Other, TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed, TestInterfaces_1.TestOutcome.Inconclusive, TestInterfaces_1.TestOutcome.NotExecuted])); + var testResultDetailsForOutcomes = new Map(); + const outcomeMap = new Map(); + const keys = Array.from(outcomeFilters.keys()); + for (var i = 0; i < keys.length; i++) { + const outcome = keys[i]; + const resultsForOutCome = yield this.testResultsClient.getTestResultsDetailsAsync("Priority", outcomeFilters.get(outcome)); + outcomeMap.set(outcome, resultsForOutCome); + } + outcomeMap.forEach((value, key) => { + testResultDetailsForOutcomes.set(key, new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(value)); + }); + return testResultDetailsForOutcomes; + }); + } +} +exports.TestSummaryDataProvider = TestSummaryDataProvider; +// export class AggregatedResultsByOutcomeImpl implements AggregatedResultsByOutcome { +// count?: number; +// duration?: any; +// groupByField?: string; +// groupByValue?: any; +// outcome?: TestOutcome; +// rerunResultCount?: number; +// } +//# sourceMappingURL=TestSummaryDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js.map new file mode 100644 index 00000000..c7f76611 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryDataProvider.js","sourceRoot":"","sources":["TestSummaryDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/task.dev.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/task.dev.json similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/task.dev.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/task.dev.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/task.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/task.json similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/task.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/task.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.d.ts new file mode 100644 index 00000000..103d2e9d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.d.ts @@ -0,0 +1,17 @@ +import { ReportConfiguration } from "../config/ReportConfiguration"; +export declare class TelemetryLogger { + static readonly TELEMETRY_LINE = "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; + private static instance; + private static reportConfig; + /** + * Formats and sends all telemetry collected to be published + */ + static LogTaskConfig(reportConfiguration: ReportConfiguration): void; + static LogModulePerf(moduleName: string, timeTaken: number, numRetries?: Number): void; + /** + * Publishes an object as a string as telemetry + * @param telemetryToLog Object to be logged as a string + */ + private static logTelemetry; + static InvokeWithPerfLogger(executor: () => Promise, executorName: string): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js new file mode 100644 index 00000000..44e8c5ad --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js @@ -0,0 +1,103 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TelemetryLogger = void 0; +const PipelineType_1 = require("../config/pipeline/PipelineType"); +const EnumUtils_1 = require("../utils/EnumUtils"); +const now = require("performance-now"); +class TelemetryLogger { + /** + * Formats and sends all telemetry collected to be published + */ + static LogTaskConfig(reportConfiguration) { + this.reportConfig = reportConfiguration; + const pipelineConfig = this.reportConfig.$pipelineConfiguration; + const mailConfig = this.reportConfig.$mailConfiguration; + const reportDataConfig = this.reportConfig.$reportDataConfiguration; + let pipelineTypeString = "Release"; + let environmentId = 0; + if (pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build) { + pipelineTypeString = "Build"; + } + else { + environmentId = pipelineConfig.$environmentId; + } + const groupTestSummary = reportDataConfig.$groupTestSummaryBy.map(g => EnumUtils_1.EnumUtils.GetGroupTestResultsByString(g)); + let groupTestSummaryString = groupTestSummary[0]; + if (groupTestSummary.length > 0) { + groupTestSummaryString = groupTestSummary.join(","); + } + this.logTelemetry({ + pipelineId: pipelineConfig.$pipelineId, + pipelineType: pipelineTypeString, + projectId: pipelineConfig.$projectId, + projectName: pipelineConfig.$projectName, + environmentId: environmentId, + taskConfiguration: { + sendMailCondition: EnumUtils_1.EnumUtils.GetMailConditionString(this.reportConfig.$sendMailCondition), + smtpHost: mailConfig.$smtpConfig.$smtpHost, + smtpUserName: mailConfig.$smtpConfig.$userName, + enableTLs: mailConfig.$smtpConfig.$enableTLS, + includeCommits: reportDataConfig.$includeCommits, + includeOthersInTotal: reportDataConfig.$includeOthersInTotal, + groupTestSummaryBy: groupTestSummaryString, + testResultsConfiguration: { + includeFailedTests: reportDataConfig.$testResultsConfig.$includeFailedTests, + includeInconclusiveTests: reportDataConfig.$testResultsConfig.$includeInconclusiveTests, + includeNotExecutedTests: reportDataConfig.$testResultsConfig.$includeNotExecutedTests, + includeOtherTests: reportDataConfig.$testResultsConfig.$includeOtherTests, + includePassedTests: reportDataConfig.$testResultsConfig.$includePassedTests, + maxItemsToShow: reportDataConfig.$testResultsConfig.$maxItemsToShow + } + } + }); + } + static LogModulePerf(moduleName, timeTaken, numRetries = 0) { + const timeTakenString = timeTaken.toFixed(2); + if (numRetries < 1) { + this.logTelemetry({ + "ModuleName": `${moduleName}`, + "PERF": `${timeTakenString}` + }); + } + else { + this.logTelemetry({ + "ModuleName": `${moduleName}`, + "PERF": `${timeTakenString}`, + "Retries": `${numRetries}` + }); + } + } + /** + * Publishes an object as a string as telemetry + * @param telemetryToLog Object to be logged as a string + */ + static logTelemetry(telemetryToLog) { + console.log(TelemetryLogger.TELEMETRY_LINE + JSON.stringify(telemetryToLog)); + } + static InvokeWithPerfLogger(executor, executorName) { + return __awaiter(this, void 0, void 0, function* () { + const perfStart = now(); + let returnVal; + try { + returnVal = yield executor(); + } + finally { + // Log time taken by the dataprovider + TelemetryLogger.LogModulePerf(executorName, now() - perfStart); + } + return returnVal; + }); + } +} +exports.TelemetryLogger = TelemetryLogger; +TelemetryLogger.TELEMETRY_LINE = "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; +//# sourceMappingURL=TelemetryLogger.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js.map new file mode 100644 index 00000000..80c01ab2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TelemetryLogger.js","sourceRoot":"","sources":["TelemetryLogger.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,kEAA+D;AAC/D,kDAA+C;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAEtC,MAAa,eAAe;IAO1B;;OAEG;IACI,MAAM,CAAC,aAAa,CAAC,mBAAwC;QAClE,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC;QAExC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;QACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC;QAEpE,IAAI,kBAAkB,GAAW,SAAS,CAAC;QAC3C,IAAI,aAAa,GAAW,CAAC,CAAC;QAC9B,IAAI,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,KAAK,EAAE;YACtD,kBAAkB,GAAG,OAAO,CAAC;SAC9B;aAAM;YACL,aAAa,GAAG,cAAc,CAAC,cAAc,CAAC;SAC/C;QAED,MAAM,gBAAgB,GAAa,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,qBAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3H,IAAI,sBAAsB,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,sBAAsB,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACrD;QAED,IAAI,CAAC,YAAY,CAAC;YAChB,UAAU,EAAE,cAAc,CAAC,WAAW;YACtC,YAAY,EAAE,kBAAkB;YAChC,SAAS,EAAE,cAAc,CAAC,UAAU;YACpC,WAAW,EAAE,cAAc,CAAC,YAAY;YACxC,aAAa,EAAE,aAAa;YAC5B,iBAAiB,EAAE;gBACjB,iBAAiB,EAAE,qBAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;gBACzF,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS;gBAC1C,YAAY,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS;gBAC9C,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,UAAU;gBAC5C,cAAc,EAAE,gBAAgB,CAAC,eAAe;gBAChD,oBAAoB,EAAE,gBAAgB,CAAC,qBAAqB;gBAC5D,kBAAkB,EAAE,sBAAsB;gBAC1C,wBAAwB,EAAE;oBACxB,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,mBAAmB;oBAC3E,wBAAwB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,yBAAyB;oBACvF,uBAAuB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,wBAAwB;oBACrF,iBAAiB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,kBAAkB;oBACzE,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,mBAAmB;oBAC3E,cAAc,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,eAAe;iBACpE;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,UAAkB,EAAE,SAAiB,EAAE,aAAqB,CAAC;QACvF,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,UAAU,GAAG,CAAC,EAAE;YAClB,IAAI,CAAC,YAAY,CAAC;gBAChB,YAAY,EAAE,GAAG,UAAU,EAAE;gBAC7B,MAAM,EAAE,GAAG,eAAe,EAAE;aAC7B,CAAC,CAAC;SACJ;aAAM;YACL,IAAI,CAAC,YAAY,CAAC;gBAChB,YAAY,EAAE,GAAG,UAAU,EAAE;gBAC7B,MAAM,EAAE,GAAG,eAAe,EAAE;gBAC5B,SAAS,EAAE,GAAG,UAAU,EAAE;aAC3B,CAAC,CAAC;SACJ;IACH,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,YAAY,CAAC,cAAkB;QAC5C,OAAO,CAAC,GAAG,CACT,eAAe,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAChE,CAAC;IACJ,CAAC;IAEM,MAAM,CAAO,oBAAoB,CAAI,QAA0B,EAAE,YAAoB;;YAC1F,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACxB,IAAI,SAAY,CAAC;YACjB,IAAI;gBACF,SAAS,GAAG,MAAM,QAAQ,EAAE,CAAC;aAC9B;oBACO;gBACN,qCAAqC;gBACrC,eAAe,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;aAChE;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;;AA9FH,0CA+FC;AA9FwB,8BAAc,GACnC,kEAAkE,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/telemetry/TelemetryLogger.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/telemetry/TelemetryLogger.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.d.ts new file mode 100644 index 00000000..a95ad04b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.d.ts @@ -0,0 +1,14 @@ +import { IConfigurationProvider } from "../../config/IConfigurationProvider"; +import { SendMailCondition } from "../../config/report/SendMailCondition"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { MailConfiguration } from "../../config/mail/MailConfiguration"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +export declare class FileWriter { + static writeToFile(content: string, fileName: string): void; +} +export declare class MockConfigProvider implements IConfigurationProvider { + getPipelineConfiguration(): PipelineConfiguration; + getMailConfiguration(): MailConfiguration; + getReportDataConfiguration(): ReportDataConfiguration; + getSendMailCondition(): SendMailCondition; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js new file mode 100644 index 00000000..895b94fd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js @@ -0,0 +1,80 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MockConfigProvider = exports.FileWriter = void 0; +const SendMailCondition_1 = require("../../config/report/SendMailCondition"); +const PipelineConfiguration_1 = require("../../config/pipeline/PipelineConfiguration"); +const MailConfiguration_1 = require("../../config/mail/MailConfiguration"); +const ReportDataConfiguration_1 = require("../../config/report/ReportDataConfiguration"); +const ReportConfiguration_1 = require("../../config/ReportConfiguration"); +const ReportManager_1 = require("../../ReportManager"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +const TestResultsConfiguration_1 = require("../../config/report/TestResultsConfiguration"); +const RecipientsConfiguration_1 = require("../../config/mail/RecipientsConfiguration"); +const SmtpConfiguration_1 = require("../../config/mail/SmtpConfiguration"); +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +const ReportProvider_1 = require("../../providers/ReportProvider"); +const DataProviderFactory_1 = require("../../providers/DataProviderFactory"); +const HTMLReportCreator_1 = require("../../htmlreport/HTMLReportCreator"); +const util_1 = require("util"); +const EmailSender_1 = require("../../EmailSender"); +const TelemetryLogger_1 = require("../../telemetry/TelemetryLogger"); +const fs = require("fs"); +const accessKey = process.env.AccessKey; +const smtpUser = process.env.SMTPUSER; +const smtpPassword = process.env.SMTPPASSWORD; +class FileWriter { + static writeToFile(content, fileName) { + const currDir = __dirname; + console.log(`CurrentDir: ${currDir}`); + var msgPath = `${currDir}\\${fileName}`; + fs.writeFile(msgPath, content, (err) => { + if (err) { + return console.log(err); + } + console.log("File saved successfully!"); + }); + } +} +exports.FileWriter = FileWriter; +class MockConfigProvider { + getPipelineConfiguration() { + return new PipelineConfiguration_1.PipelineConfiguration(PipelineType_1.PipelineType.Release, 13942411, "ProjectId", "ProjectName", 160977787, 9462, false, "https://dev.azure.com/{account}/", accessKey); + } + getMailConfiguration() { + return new MailConfiguration_1.MailConfiguration("[{environmentStatus}] {passPercentage} tests passed", new RecipientsConfiguration_1.RecipientsConfiguration("xyz@email.com", false, false, false, false), new RecipientsConfiguration_1.RecipientsConfiguration("", false, false, false, false), new SmtpConfiguration_1.SmtpConfiguration(smtpUser, smtpPassword, "smtp.live.com", true), "test.com"); + } + getReportDataConfiguration() { + const testResultsConfig = new TestResultsConfiguration_1.TestResultsConfiguration(true, false, false, false, false, GroupTestResultsBy_1.GroupTestResultsBy.Run, 10); + return new ReportDataConfiguration_1.ReportDataConfiguration(true, false, true, [GroupTestResultsBy_1.GroupTestResultsBy.Priority, GroupTestResultsBy_1.GroupTestResultsBy.Run], testResultsConfig); + } + getSendMailCondition() { + return SendMailCondition_1.SendMailCondition.Always; + } +} +exports.MockConfigProvider = MockConfigProvider; +function run() { + return __awaiter(this, void 0, void 0, function* () { + console.log('Node Version: ' + process.version); + const configProvider = new MockConfigProvider(); + const reportConfiguration = new ReportConfiguration_1.ReportConfiguration(configProvider); + TelemetryLogger_1.TelemetryLogger.LogTaskConfig(reportConfiguration); + const reportManager = new ReportManager_1.ReportManager(new ReportProvider_1.ReportProvider(new DataProviderFactory_1.DataProviderFactory(configProvider.getPipelineConfiguration())), new HTMLReportCreator_1.HTMLReportCreator(), new EmailSender_1.EmailSender()); + reportManager.sendReportAsync(reportConfiguration); + }); +} +if (util_1.isNullOrUndefined(accessKey)) { + console.error("Set Environment Vars for AccessKey."); +} +else { + run(); +} +//# sourceMappingURL=InvokeTest.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js.map new file mode 100644 index 00000000..626265a1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"InvokeTest.js","sourceRoot":"","sources":["InvokeTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js new file mode 100644 index 00000000..1627cca4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js @@ -0,0 +1,32 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const sinon_1 = __importDefault(require("sinon")); +const ReportFactory_1 = require("../../model/ReportFactory"); +const ReportProvider_1 = require("../../providers/ReportProvider"); +const ReportManager_1 = require("../../ReportManager"); +const MissingDataError_1 = require("../../exceptions/MissingDataError"); +describe("ReportManager Tests", () => { + let reportProvider = sinon_1.default.createStubInstance(ReportProvider_1.ReportProvider); + beforeEach(() => { + const report = ReportFactory_1.ReportFactory.createNewReport(null); + sinon_1.default.stub(reportProvider, "createReportAsync").returns(Promise.resolve(report)); + sinon_1.default.stub(report, "$dataMissing").returns(true); + }); + test("ReportManager throws error when datamissing from report", () => __awaiter(void 0, void 0, void 0, function* () { + let reportManager = new ReportManager_1.ReportManager(reportProvider, null, null); + expect(reportManager.sendReportAsync(null)).rejects.toThrow(MissingDataError_1.MissingDataError); + })); +}); +//# sourceMappingURL=ReportManagerTests.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js.map new file mode 100644 index 00000000..0e8a5585 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportManagerTests.js","sourceRoot":"","sources":["ReportManagerTests.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,6DAA0D;AAE1D,mEAAgE;AAChE,uDAAoD;AACpD,wEAAqE;AAErE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IAEnC,IAAI,cAAc,GAAoB,eAAK,CAAC,kBAAkB,CAAC,+BAAc,CAAC,CAAC;IAE/E,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACnD,eAAK,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,eAAK,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAS,EAAE;QACzE,IAAI,aAAa,GAAG,IAAI,6BAAa,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAgB,CAAC,CAAC;IAChF,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/tsconfig.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tsconfig.json similarity index 74% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/tsconfig.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tsconfig.json index f4659304..8e3b1062 100644 --- a/Extensions/emailReportTask/Tasks/emailReportTaskV1/tsconfig.json +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tsconfig.json @@ -12,7 +12,6 @@ "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ "moduleResolution": "node", "resolveJsonModule": true, - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - "outDir": "../../../dist/Tasks/emailReportTask/emailReportTaskV1" + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ } } \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.d.ts new file mode 100644 index 00000000..0199d3d5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.d.ts @@ -0,0 +1,3 @@ +export declare class DisplayNameHelper { + static getPriorityDisplayName(priority: string): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js new file mode 100644 index 00000000..76a207cc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DisplayNameHelper = void 0; +class DisplayNameHelper { + static getPriorityDisplayName(priority) { + const priorityInt = Number.parseInt(priority); + if (!isNaN(priorityInt) && priorityInt == 255) { + return "Priority unspecified"; + } + return `Priority: ${priority}`; + } +} +exports.DisplayNameHelper = DisplayNameHelper; +//# sourceMappingURL=DisplayNameHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js.map new file mode 100644 index 00000000..cd10b401 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DisplayNameHelper.js","sourceRoot":"","sources":["DisplayNameHelper.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAErB,MAAM,CAAC,sBAAsB,CAAC,QAAgB;QACnD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE;YAC7C,OAAO,sBAAsB,CAAC;SAC/B;QACD,OAAO,aAAa,QAAQ,EAAE,CAAC;IACjC,CAAC;CACF;AATD,8CASC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/DisplayNameHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/DisplayNameHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.d.ts new file mode 100644 index 00000000..c233622f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.d.ts @@ -0,0 +1,6 @@ +import { SendMailCondition } from "../config/report/SendMailCondition"; +import { GroupTestResultsBy } from "../config/report/GroupTestResultsBy"; +export declare class EnumUtils { + static GetMailConditionString(condition: SendMailCondition): string; + static GetGroupTestResultsByString(condition: GroupTestResultsBy): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js new file mode 100644 index 00000000..6f71fe91 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js @@ -0,0 +1,45 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EnumUtils = void 0; +const SendMailCondition_1 = require("../config/report/SendMailCondition"); +const GroupTestResultsBy_1 = require("../config/report/GroupTestResultsBy"); +class EnumUtils { + static GetMailConditionString(condition) { + let index = 0; + for (let val in SendMailCondition_1.SendMailCondition) { + if (!isNaN(Number(val)) && condition == Number(val)) { + break; + } + index++; + } + let index2 = 0; + for (let val in SendMailCondition_1.SendMailCondition) { + if (isNaN(Number(val))) { + if (index2 == index) + return val; + index2++; + } + } + return null; + } + static GetGroupTestResultsByString(condition) { + let index = 0; + for (let val in GroupTestResultsBy_1.GroupTestResultsBy) { + if (!isNaN(Number(val)) && condition == Number(val)) { + break; + } + index++; + } + let index2 = 0; + for (let val in GroupTestResultsBy_1.GroupTestResultsBy) { + if (isNaN(Number(val))) { + if (index2 == index) + return val; + index2++; + } + } + return null; + } +} +exports.EnumUtils = EnumUtils; +//# sourceMappingURL=EnumUtils.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js.map new file mode 100644 index 00000000..4777777b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EnumUtils.js","sourceRoot":"","sources":["EnumUtils.ts"],"names":[],"mappings":";;;AAAA,0EAAuE;AACvE,4EAAyE;AAEzE,MAAa,SAAS;IAEb,MAAM,CAAC,sBAAsB,CAAC,SAA4B;QAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAI,IAAI,GAAG,IAAI,qCAAiB,EAAE;YAChC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM;aACP;YACD,KAAK,EAAE,CAAC;SACT;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAI,IAAI,GAAG,IAAI,qCAAiB,EAAE;YAChC,IAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAG,MAAM,IAAI,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM,CAAC,2BAA2B,CAAC,SAA6B;QACrE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAI,IAAI,GAAG,IAAI,uCAAkB,EAAE;YACjC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM;aACP;YACD,KAAK,EAAE,CAAC;SACT;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAI,IAAI,GAAG,IAAI,uCAAkB,EAAE;YACjC,IAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAG,MAAM,IAAI,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAzCD,8BAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/EnumUtils.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/EnumUtils.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.d.ts new file mode 100644 index 00000000..6e9dd614 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.d.ts @@ -0,0 +1,4 @@ +import { ReleaseDeployPhase, ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +export declare class EnvironmentExtensions { + static getPhases(environment: ReleaseEnvironment): Array; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js new file mode 100644 index 00000000..0daa1050 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EnvironmentExtensions = void 0; +class EnvironmentExtensions { + static getPhases(environment) { + const phases = new Array(); + if (environment.deploySteps != null && environment.deploySteps.length > 0) { + let attempt = 0; + let latestDeploySteps = environment.deploySteps[0]; + for (var i = 0; i < environment.deploySteps.length; i++) { + if (environment.deploySteps[i].attempt > attempt) { + latestDeploySteps = environment.deploySteps[i]; + } + } + phases.push(...latestDeploySteps.releaseDeployPhases); + } + return phases; + } +} +exports.EnvironmentExtensions = EnvironmentExtensions; +//# sourceMappingURL=EnvironmentExtensions.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js.map new file mode 100644 index 00000000..d47af3f4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EnvironmentExtensions.js","sourceRoot":"","sources":["EnvironmentExtensions.ts"],"names":[],"mappings":";;;AAEA,MAAa,qBAAqB;IAChC,MAAM,CAAC,SAAS,CAAC,WAA+B;QAC9C,MAAM,MAAM,GAAG,IAAI,KAAK,EAAsB,CAAC;QAC/C,IAAI,WAAW,CAAC,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACzE,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,iBAAiB,GAAsB,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACtE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/D,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE;oBAChD,iBAAiB,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;iBAChD;aACF;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;SACvD;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAhBD,sDAgBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/EnvironmentExtensions.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/EnvironmentExtensions.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.d.ts new file mode 100644 index 00000000..ca46ba16 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.d.ts @@ -0,0 +1,7 @@ +export declare class StringUtils { + static isNullOrWhiteSpace(input: string): boolean; + static CompressNewLines(content: string): string; + private static getNonEmptyLines; + static ReplaceNewlineWithBrTag(content: string): string; + static getFirstNLines(content: string, lineCount: number): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js new file mode 100644 index 00000000..2593a00c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StringUtils = void 0; +class StringUtils { + static isNullOrWhiteSpace(input) { + if (typeof input === 'undefined' || input == null) + return true; + return input.replace("/\s/g", '').length < 1; + } + static CompressNewLines(content) { + if (content != null) { + const lines = this.getNonEmptyLines(content); + content = lines.join("\n"); + } + return content; + } + static getNonEmptyLines(s) { + s = s.replace("\r", ""); + return s.split('\n') + .filter(str => !this.isNullOrWhiteSpace(str)) + .map(str => str.trim()); + } + static ReplaceNewlineWithBrTag(content) { + if (content == null) { + return null; + } + const lines = this.getNonEmptyLines(content); + return lines.join("
"); + } + static getFirstNLines(content, lineCount) { + if (content != null) { + var lines = this.getNonEmptyLines(content); + return lines.slice(0, lineCount).join("\n"); + } + return null; + } +} +exports.StringUtils = StringUtils; +//# sourceMappingURL=StringUtils.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js.map new file mode 100644 index 00000000..b390e763 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"StringUtils.js","sourceRoot":"","sources":["StringUtils.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACf,MAAM,CAAC,kBAAkB,CAAC,KAAa;QAE5C,IAAI,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/D,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAAC,OAAe;QAC5C,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC7C,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5B;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,CAAS;QACvC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;aACjB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;aAC5C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,uBAAuB,CAAC,OAAe;QACnD,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,OAAe,EAAE,SAAiB;QAC7D,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7C;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAvCD,kCAuCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/StringUtils.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV1/utils/StringUtils.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.d.ts new file mode 100644 index 00000000..15ea15d1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.d.ts @@ -0,0 +1,7 @@ +import { IReportSender } from "./IReportSender"; +import { MailConfiguration } from "./config/mail/MailConfiguration"; +import { Report } from "./model/Report"; +export declare class EmailSender implements IReportSender { + sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; + private sendMailAsync; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js new file mode 100644 index 00000000..e3f84dab --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js @@ -0,0 +1,94 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EmailSender = void 0; +const MailAddressViewModel_1 = require("./model/viewmodel/MailAddressViewModel"); +const MailError_1 = require("./exceptions/MailError"); +const util_1 = require("util"); +const nodemailer = require("nodemailer"); +const url = require("url"); +class EmailSender { + sendReportAsync(report, htmlReportMessage, mailConfiguration) { + return __awaiter(this, void 0, void 0, function* () { + const mailAddressViewModel = new MailAddressViewModel_1.MailAddressViewModel(report, mailConfiguration); + let smtpUrlProvided = mailConfiguration.$smtpConfig.$smtpHost; + console.log(`Using SmtpHost URL: ${smtpUrlProvided}`); + smtpUrlProvided = smtpUrlProvided.includes("://") ? smtpUrlProvided : "smtp://" + smtpUrlProvided; + console.log(`Parsed Url: ${smtpUrlProvided}`); + let smtpUrl = url.parse(smtpUrlProvided, true); + console.log(`Host: ${smtpUrl.host}`); + console.log(`HostName: ${smtpUrl.hostname}`); + console.log(`Port: ${smtpUrl.port}`); + console.log(`Protocol: ${smtpUrl.protocol}`); + const smtpHost = smtpUrl.hostname; + let smtpPort = smtpUrl.port; + smtpPort = util_1.isNullOrUndefined(smtpUrl.port) ? 587 : smtpUrl.port; + console.log(`Using HostName: ${smtpHost} and port: ${smtpPort}`); + let transporter; + if (mailConfiguration.$smtpConfig.$enableTLS) { + transporter = nodemailer.createTransport({ + host: smtpHost, + port: smtpPort, + tls: { + maxVersion: 'TLSv1.2', + minVersion: 'TLSv1.2', + rejectUnauthorized: false + }, + requireTLS: true, + auth: { + user: mailConfiguration.$smtpConfig.$userName, + pass: mailConfiguration.$smtpConfig.$password + } + }); + } + else { + transporter = nodemailer.createTransport({ + host: smtpHost, + port: smtpPort, + auth: { + user: mailConfiguration.$smtpConfig.$userName, + pass: mailConfiguration.$smtpConfig.$password + } + }); + } + try { + const result = yield this.sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, htmlReportMessage); + console.log(`Mail Sent Successfully: ${result.response}`); + return true; + } + catch (err) { + throw new MailError_1.MailError(err); + } + }); + } + sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, message) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + yield transporter.sendMail({ + from: mailAddressViewModel.from, + to: mailAddressViewModel.to.join(","), + cc: util_1.isNullOrUndefined(mailAddressViewModel.cc) || mailAddressViewModel.cc.length < 1 ? null : mailAddressViewModel.cc.join(","), + subject: mailConfiguration.$mailSubject, + html: message + }, (err, response) => { + if (err) { + reject(err); + } + else { + resolve(response); + } + }); + })); + }); + } +} +exports.EmailSender = EmailSender; +//# sourceMappingURL=EmailSender.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js.map new file mode 100644 index 00000000..ae6f1e15 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EmailSender.js","sourceRoot":"","sources":["EmailSender.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/EmailSender.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/EmailSender.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.d.ts new file mode 100644 index 00000000..f5cd6ac2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.d.ts @@ -0,0 +1,5 @@ +import { Report } from "./model/Report"; +import { MailConfiguration } from "./config/mail/MailConfiguration"; +export interface IReportSender { + sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js new file mode 100644 index 00000000..71c2bb2b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IReportSender.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js.map new file mode 100644 index 00000000..8b73c789 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IReportSender.js","sourceRoot":"","sources":["IReportSender.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/IReportSender.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/IReportSender.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/README.md b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/README.md similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/README.md rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/README.md diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.d.ts new file mode 100644 index 00000000..7eca7eed --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.d.ts @@ -0,0 +1,11 @@ +import { IReportProvider } from "./providers/IReportProvider"; +import { ReportConfiguration } from "./config/ReportConfiguration"; +import { IReportSender } from "./IReportSender"; +import { IHTMLReportCreator } from "./htmlreport/IHTMLReportCreator"; +export declare class ReportManager { + private reportProvider; + private reportSender; + private htmlReportCreator; + constructor(reportProvider: IReportProvider, htmlReportCreator: IHTMLReportCreator, reportSender: IReportSender); + sendReportAsync(reportConfig: ReportConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js new file mode 100644 index 00000000..43d04bff --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js @@ -0,0 +1,50 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportManager = void 0; +const ReportError_1 = require("./exceptions/ReportError"); +const MissingDataError_1 = require("./exceptions/MissingDataError"); +const EnumUtils_1 = require("./utils/EnumUtils"); +class ReportManager { + constructor(reportProvider, htmlReportCreator, reportSender) { + this.reportProvider = reportProvider; + this.reportSender = reportSender; + this.htmlReportCreator = htmlReportCreator; + } + sendReportAsync(reportConfig) { + return __awaiter(this, void 0, void 0, function* () { + let mailSent = false; + try { + console.log("Fetching data for email report"); + const report = yield this.reportProvider.createReportAsync(reportConfig); + console.log("Created report view model"); + if (report.$dataMissing) { + throw new MissingDataError_1.MissingDataError("Unable to fetch all data for generating report. Not Sending report."); + } + else if (report.$sendMailConditionSatisfied && this.reportSender != null) { + console.log("Creating report message"); + const htmlMessage = this.htmlReportCreator.createHtmlReport(report, reportConfig); + mailSent = yield this.reportSender.sendReportAsync(report, htmlMessage, reportConfig.$mailConfiguration); + } + else { + console.log(`Not sending mail, as the user send mail condition - '${EnumUtils_1.EnumUtils.GetMailConditionString(reportConfig.$sendMailCondition)}' is not satisfied.`); + } + } + catch (err) { + // Exit Task with Error to fail the task + ReportError_1.ReportError.HandleError(err, true); + } + return mailSent; + }); + } +} +exports.ReportManager = ReportManager; +//# sourceMappingURL=ReportManager.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js.map new file mode 100644 index 00000000..d231f427 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportManager.js","sourceRoot":"","sources":["ReportManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,0DAAuD;AAGvD,oEAAiE;AACjE,iDAA8C;AAE9C,MAAa,aAAa;IAMxB,YAAY,cAA+B,EAAE,iBAAqC,EAAE,YAA2B;QAC7G,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEY,eAAe,CAAC,YAAiC;;YAC5D,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI;gBACF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBAEzC,IAAI,MAAM,CAAC,YAAY,EAAE;oBACvB,MAAM,IAAI,mCAAgB,CAAC,qEAAqE,CAAC,CAAC;iBACnG;qBACI,IAAI,MAAM,CAAC,2BAA2B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;oBACxE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACvC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;oBAClF,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;iBAC1G;qBAAM;oBACL,OAAO,CAAC,GAAG,CAAC,wDAAwD,qBAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;iBAC7J;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,wCAAwC;gBACxC,yBAAW,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;aACpC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;KAAA;CACF;AApCD,sCAoCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/ReportManager.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/ReportManager.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.d.ts new file mode 100644 index 00000000..8ca4269d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.d.ts @@ -0,0 +1,26 @@ +import { IConfigurationProvider } from "./IConfigurationProvider"; +import { SendMailCondition } from "./report/SendMailCondition"; +import { MailConfiguration } from "./mail/MailConfiguration"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +export declare class ConfigurationProvider implements IConfigurationProvider { + private pipelineConfiguration; + private mailConfiguration; + private reportDataConfiguration; + private sendMailCondition; + constructor(); + getPipelineConfiguration(): PipelineConfiguration; + getMailConfiguration(): MailConfiguration; + getReportDataConfiguration(): ReportDataConfiguration; + getSendMailCondition(): SendMailCondition; + /** + * Gets access token from system + */ + private getAccessKey; + private initPipelineConfiguration; + private initMailConfiguration; + private initReportDataConfiguration; + initSendMailCondition(): void; + private getRecipientConfiguration; + private getGroupTestResultsByEnumFromString; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js new file mode 100644 index 00000000..da9e522b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js @@ -0,0 +1,145 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ConfigurationProvider = void 0; +const tl = require("azure-pipelines-task-lib"); +const TaskConstants_1 = require("./TaskConstants"); +const SendMailCondition_1 = require("./report/SendMailCondition"); +const MailConfiguration_1 = require("./mail/MailConfiguration"); +const RecipientsConfiguration_1 = require("./mail/RecipientsConfiguration"); +const SmtpConfiguration_1 = require("./mail/SmtpConfiguration"); +const InputError_1 = require("../exceptions/InputError"); +const ReportDataConfiguration_1 = require("./report/ReportDataConfiguration"); +const TestResultsConfiguration_1 = require("./report/TestResultsConfiguration"); +const GroupTestResultsBy_1 = require("./report/GroupTestResultsBy"); +const PipelineConfiguration_1 = require("./pipeline/PipelineConfiguration"); +const PipelineType_1 = require("./pipeline/PipelineType"); +const StringUtils_1 = require("../utils/StringUtils"); +const util_1 = require("util"); +class ConfigurationProvider { + constructor() { + this.initPipelineConfiguration(); + this.initMailConfiguration(); + this.initReportDataConfiguration(); + this.initSendMailCondition(); + } + getPipelineConfiguration() { + return this.pipelineConfiguration; + } + getMailConfiguration() { + return this.mailConfiguration; + } + getReportDataConfiguration() { + return this.reportDataConfiguration; + } + getSendMailCondition() { + return this.sendMailCondition; + } + /** + * Gets access token from system + */ + getAccessKey() { + return tl.getEndpointAuthorizationParameter(TaskConstants_1.TaskConstants.VSS_CONNECTION_KEY, TaskConstants_1.TaskConstants.ACCESS_PARAMETER, false); + } + initPipelineConfiguration() { + const hostType = tl.getVariable(TaskConstants_1.TaskConstants.HOST_KEY); + const pipelineType = hostType == "build" ? PipelineType_1.PipelineType.Build : PipelineType_1.PipelineType.Release; + const pipelineIdKey = pipelineType == PipelineType_1.PipelineType.Build ? TaskConstants_1.TaskConstants.BUILD_ID_KEY : TaskConstants_1.TaskConstants.RELEASE_ID_KEY; + const pipelineId = Number(tl.getVariable(pipelineIdKey)); + const projectId = tl.getVariable(TaskConstants_1.TaskConstants.PROJECTID_KEY); + const projectName = tl.getVariable(TaskConstants_1.TaskConstants.PROJECTNAME_KEY); + const envId = Number(tl.getVariable(TaskConstants_1.TaskConstants.ENVIRONMENTID_KEY)); + const envDefId = Number(tl.getVariable(TaskConstants_1.TaskConstants.ENVIRONMENTDEFID_KEY)); + const usePrevEnvironment = tl.getBoolInput(TaskConstants_1.TaskConstants.USEPREVENV_INPUTKEY); + const teamUri = tl.getVariable(TaskConstants_1.TaskConstants.TEAM_FOUNDATION_KEY); + this.pipelineConfiguration = new PipelineConfiguration_1.PipelineConfiguration(pipelineType, pipelineId, projectId, projectName, envId, envDefId, usePrevEnvironment, teamUri, this.getAccessKey()); + } + initMailConfiguration() { + const smtpConnectionId = tl.getInput(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, true); + const endPointScheme = tl.getEndpointAuthorizationScheme(smtpConnectionId, true); + if (endPointScheme != "UsernamePassword") { + throw new InputError_1.InputError(`Incorrect EndPoint Scheme Provided - '${endPointScheme}'. Only UserName and Password type Endpoints allowed.`); + } + const smtpHost = tl.getEndpointUrl(smtpConnectionId, true).replace(/(^\w+:|^)\/\//, '').replace(/\/$/, ''); + const userName = tl.getEndpointAuthorizationParameter(smtpConnectionId, "UserName", true); + const password = tl.getEndpointAuthorizationParameter(smtpConnectionId, "Password", true); + const enableTLS = tl.getBoolInput(TaskConstants_1.TaskConstants.ENABLETLS_INPUTKEY, true); + const smtpConfig = new SmtpConfiguration_1.SmtpConfiguration(userName, password, smtpHost, enableTLS); + // Mail Subject + const mailSubject = tl.getInput(TaskConstants_1.TaskConstants.SUBJECT_INPUTKEY, true); + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(mailSubject)) { + throw new InputError_1.InputError("Email subject not set"); + } + // Optional inputs + const toAddresses = tl.getInput(TaskConstants_1.TaskConstants.TOADDRESS_INPUTKEY, false); + const ccAddresses = tl.getInput(TaskConstants_1.TaskConstants.CCADDRESS_INPUTKEY, false); + const includeInToAddressesConfig = tl.getInput(TaskConstants_1.TaskConstants.INCLUDEINTO_INPUTKEY, false); + const includeInCCAddressesConfig = tl.getInput(TaskConstants_1.TaskConstants.INCLUDEINCC_INPUTKEY, false); + // Addresses Configuration + const toRecipientsConfiguration = this.getRecipientConfiguration(toAddresses, includeInToAddressesConfig); + const ccRecipientsConfiguration = this.getRecipientConfiguration(ccAddresses, includeInCCAddressesConfig); + const defaultDomain = tl.getInput(TaskConstants_1.TaskConstants.DEFAULTDOMAIN_INPUTKEY, true); + this.mailConfiguration = new MailConfiguration_1.MailConfiguration(mailSubject, toRecipientsConfiguration, ccRecipientsConfiguration, smtpConfig, defaultDomain); + } + initReportDataConfiguration() { + // required inputs + const groupResultsBy = this.getGroupTestResultsByEnumFromString(tl.getInput(TaskConstants_1.TaskConstants.GROUPTESTRESULTSBY_INPUTKEY, true)); + const includeOthersInTotal = tl.getBoolInput(TaskConstants_1.TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY, true); + const maxTestFailuresToShow = Number(tl.getInput(TaskConstants_1.TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, true)); + const includeCommits = tl.getBoolInput(TaskConstants_1.TaskConstants.INCLUDECOMMITS_INPUTKEY, true); + // optional inputs + const includeResultsStr = tl.getInput(TaskConstants_1.TaskConstants.INCLUDERESULTS_INPUTKEY, false); + const groupTestSummaryByStr = tl.getInput(TaskConstants_1.TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY, false); + const groupTestSummaryBy = new Array(); + if (!util_1.isNullOrUndefined(groupTestSummaryByStr)) { + groupTestSummaryByStr.split(",").forEach(element => { groupTestSummaryBy.push(this.getGroupTestResultsByEnumFromString(element)); }); + } + // derived input values + const includeResultsConfig = util_1.isNullOrUndefined(includeResultsStr) ? [] : includeResultsStr.split(","); + const includeFailedTests = includeResultsConfig.includes("1"); + const includeOtherTests = includeResultsConfig.includes("2"); + const includePassedTests = includeResultsConfig.includes("3"); + const includeInconclusiveTests = includeResultsConfig.includes("4"); + const includeNotExecutedTests = includeResultsConfig.includes("5"); + const testResultsConfig = new TestResultsConfiguration_1.TestResultsConfiguration(includeFailedTests, includePassedTests, includeInconclusiveTests, includeNotExecutedTests, includeOtherTests, groupResultsBy, maxTestFailuresToShow); + this.reportDataConfiguration = new ReportDataConfiguration_1.ReportDataConfiguration(includeCommits, includeOthersInTotal, true, groupTestSummaryBy, testResultsConfig); + } + initSendMailCondition() { + const sendMailConditionStr = tl.getInput(TaskConstants_1.TaskConstants.SENDMAILCONDITION_INPUTKEY); + let sendMailCondition; + switch (sendMailConditionStr) { + case "On Failure": + sendMailCondition = SendMailCondition_1.SendMailCondition.OnFailure; + break; + case "On Success": + sendMailCondition = SendMailCondition_1.SendMailCondition.OnSuccess; + break; + case "On New Failures Only": + sendMailCondition = SendMailCondition_1.SendMailCondition.OnNewFailuresOnly; + break; + default: + sendMailCondition = SendMailCondition_1.SendMailCondition.Always; + break; + } + this.sendMailCondition = sendMailCondition; + } + getRecipientConfiguration(namedRecipients, includeConfigStr) { + if (includeConfigStr != null) { + const includeConfig = includeConfigStr.split(","); + const includeChangesetOwners = includeConfig.includes("1"); + const includeTestOwners = includeConfig.includes("2"); + const includeActiveBugOwners = includeConfig.includes("3"); + const includeCreatedBy = includeConfig.includes("4"); + return new RecipientsConfiguration_1.RecipientsConfiguration(namedRecipients, includeChangesetOwners, includeTestOwners, includeActiveBugOwners, includeCreatedBy); + } + return new RecipientsConfiguration_1.RecipientsConfiguration(namedRecipients); + } + getGroupTestResultsByEnumFromString(groupResultsByStr) { + switch (groupResultsByStr) { + case "Priority": return GroupTestResultsBy_1.GroupTestResultsBy.Priority; + case "Team": return GroupTestResultsBy_1.GroupTestResultsBy.Team; + default: return GroupTestResultsBy_1.GroupTestResultsBy.Run; + } + } +} +exports.ConfigurationProvider = ConfigurationProvider; +//# sourceMappingURL=ConfigurationProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js.map new file mode 100644 index 00000000..96b7fe79 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ConfigurationProvider.js","sourceRoot":"","sources":["ConfigurationProvider.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEhD,mDAAgD;AAChD,kEAA+D;AAC/D,gEAA6D;AAC7D,4EAAyE;AACzE,gEAA6D;AAC7D,yDAAsD;AACtD,8EAA2E;AAC3E,gFAA6E;AAC7E,oEAAiE;AACjE,4EAAyE;AACzE,0DAAuD;AACvD,sDAAmD;AACnD,+BAAyC;AAEzC,MAAa,qBAAqB;IAMhC;QACE,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACnC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,wBAAwB;QACtB,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IACD,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,0BAA0B;QACxB,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IACD,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,OAAO,EAAE,CAAC,iCAAiC,CACzC,6BAAa,CAAC,kBAAkB,EAChC,6BAAa,CAAC,gBAAgB,EAC9B,KAAK,CACN,CAAC;IACJ,CAAC;IAEO,yBAAyB;QAC/B,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,6BAAa,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,2BAAY,CAAC,OAAO,CAAC;QACrF,MAAM,aAAa,GAAG,YAAY,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,6BAAa,CAAC,YAAY,CAAC,CAAC,CAAC,6BAAa,CAAC,cAAc,CAAC;QAErH,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,6BAAa,CAAC,aAAa,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,6BAAa,CAAC,eAAe,CAAC,CAAC;QAElE,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,6BAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,6BAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAE5E,MAAM,kBAAkB,GAAG,EAAE,CAAC,YAAY,CAAC,6BAAa,CAAC,mBAAmB,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,6BAAa,CAAC,mBAAmB,CAAC,CAAA;QACjE,IAAI,CAAC,qBAAqB,GAAG,IAAI,6CAAqB,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9K,CAAC;IAEO,qBAAqB;QAC3B,MAAM,gBAAgB,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;QAClF,MAAM,cAAc,GAAG,EAAE,CAAC,8BAA8B,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACjF,IAAI,cAAc,IAAI,kBAAkB,EAAE;YACxC,MAAM,IAAI,uBAAU,CAAC,yCAAyC,cAAc,uDAAuD,CAAC,CAAC;SACtI;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,cAAc,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3G,MAAM,QAAQ,GAAG,EAAE,CAAC,iCAAiC,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,EAAE,CAAC,iCAAiC,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC1F,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,6BAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QAE1E,MAAM,UAAU,GAAG,IAAI,qCAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAElF,eAAe;QACf,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,yBAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAC/C;YACE,MAAM,IAAI,uBAAU,CAAC,uBAAuB,CAAC,CAAC;SAC/C;QAED,kBAAkB;QAClB,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzE,MAAM,0BAA0B,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC1F,MAAM,0BAA0B,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAE1F,0BAA0B;QAC1B,MAAM,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;QAC1G,MAAM,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;QAE1G,MAAM,aAAa,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QAE9E,IAAI,CAAC,iBAAiB,GAAG,IAAI,qCAAiB,CAAC,WAAW,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAC/I,CAAC;IAEO,2BAA2B;QACjC,kBAAkB;QAClB,MAAM,cAAc,GAAG,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9H,MAAM,oBAAoB,GAAG,EAAE,CAAC,YAAY,CAAC,6BAAa,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC;QAChG,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAC,CAAC;QACtG,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;QAEpF,kBAAkB;QAClB,MAAM,iBAAiB,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QACpF,MAAM,qBAAqB,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAE5F,MAAM,kBAAkB,GAA8B,IAAI,KAAK,EAAE,CAAC;QAClE,IAAI,CAAC,wBAAiB,CAAC,qBAAqB,CAAC,EAAE;YAC5C,qBAAgC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC;SACjJ;QAED,uBAAuB;QACvB,MAAM,oBAAoB,GAAG,wBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtG,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,wBAAwB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEnE,MAAM,iBAAiB,GAAG,IAAI,mDAAwB,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC;QAE5M,IAAI,CAAC,uBAAuB,GAAG,IAAI,iDAAuB,CAAC,cAAc,EAAE,oBAAoB,EAAE,IAAI,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IAChJ,CAAC;IAED,qBAAqB;QACnB,MAAM,oBAAoB,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAAa,CAAC,0BAA0B,CAAC,CAAC;QACnF,IAAI,iBAAoC,CAAC;QACzC,QAAQ,oBAAoB,EAAE;YAC5B,KAAK,YAAY;gBAAE,iBAAiB,GAAG,qCAAiB,CAAC,SAAS,CAAC;gBAAC,MAAM;YAC1E,KAAK,YAAY;gBAAE,iBAAiB,GAAG,qCAAiB,CAAC,SAAS,CAAC;gBAAC,MAAM;YAC1E,KAAK,sBAAsB;gBAAE,iBAAiB,GAAG,qCAAiB,CAAC,iBAAiB,CAAC;gBAAC,MAAM;YAC5F;gBAAS,iBAAiB,GAAG,qCAAiB,CAAC,MAAM,CAAC;gBAAC,MAAM;SAC9D;QACD,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEO,yBAAyB,CAAC,eAAuB,EAAE,gBAAwB;QACjF,IAAI,gBAAgB,IAAI,IAAI,EAAE;YAC5B,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,sBAAsB,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,iBAAiB,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtD,MAAM,sBAAsB,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,gBAAgB,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAErD,OAAO,IAAI,iDAAuB,CAAC,eAAe,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;SAC1I;QAED,OAAO,IAAI,iDAAuB,CAAC,eAAe,CAAC,CAAC;IACtD,CAAC;IAEO,mCAAmC,CAAC,iBAAyB;QACnE,QAAQ,iBAAiB,EAAE;YACzB,KAAK,UAAU,CAAC,CAAC,OAAO,uCAAkB,CAAC,QAAQ,CAAC;YACpD,KAAK,MAAM,CAAC,CAAC,OAAO,uCAAkB,CAAC,IAAI,CAAC;YAC5C,OAAO,CAAC,CAAC,OAAO,uCAAkB,CAAC,GAAG,CAAC;SACxC;IACH,CAAC;CACF;AAxJD,sDAwJC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/ConfigurationProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/ConfigurationProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.d.ts new file mode 100644 index 00000000..df19ee31 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.d.ts @@ -0,0 +1,10 @@ +import { SendMailCondition } from "./report/SendMailCondition"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +import { MailConfiguration } from "./mail/MailConfiguration"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; +export interface IConfigurationProvider { + getPipelineConfiguration(): PipelineConfiguration; + getMailConfiguration(): MailConfiguration; + getReportDataConfiguration(): ReportDataConfiguration; + getSendMailCondition(): SendMailCondition; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js new file mode 100644 index 00000000..6a116ba8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IConfigurationProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js.map new file mode 100644 index 00000000..916dcc67 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IConfigurationProvider.js","sourceRoot":"","sources":["IConfigurationProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/IConfigurationProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/IConfigurationProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.d.ts new file mode 100644 index 00000000..26b2dde4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.d.ts @@ -0,0 +1,19 @@ +import { MailConfiguration } from "./mail/MailConfiguration"; +import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; +import { IConfigurationProvider } from "./IConfigurationProvider"; +import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; +import { SendMailCondition } from "./report/SendMailCondition"; +export declare class ReportConfiguration { + private sendMailCondition; + private mailConfiguration; + private reportDataConfiguration; + private pipelineConfiguration; + constructor(configProvider: IConfigurationProvider); + validateConfiguration(): void; + private validateMailConfig; + get $sendMailCondition(): SendMailCondition; + get $mailConfiguration(): MailConfiguration; + get $reportDataConfiguration(): ReportDataConfiguration; + get $pipelineConfiguration(): PipelineConfiguration; + private throwError; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js new file mode 100644 index 00000000..a602ef99 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportConfiguration = void 0; +const InputError_1 = require("../exceptions/InputError"); +const TaskConstants_1 = require("./TaskConstants"); +const StringUtils_1 = require("../utils/StringUtils"); +class ReportConfiguration { + constructor(configProvider) { + this.sendMailCondition = configProvider.getSendMailCondition(); + this.mailConfiguration = configProvider.getMailConfiguration(); + this.reportDataConfiguration = configProvider.getReportDataConfiguration(); + this.pipelineConfiguration = configProvider.getPipelineConfiguration(); + } + validateConfiguration() { + if (this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow <= 0) { + this.throwError(TaskConstants_1.TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow, "be > 0"); + } + this.validateMailConfig(); + } + validateMailConfig() { + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$mailSubject)) { + this.throwError(TaskConstants_1.TaskConstants.SUBJECT_INPUTKEY, this.mailConfiguration.$mailSubject, "be specified"); + } + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$smtpHost)) { + this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$smtpHost, "specify SMTP Host URL"); + } + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$userName)) { + this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$userName, "specify SMTP UserName"); + } + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$password)) { + this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$password, "specify SMTP Password"); + } + } + // Getters + get $sendMailCondition() { + return this.sendMailCondition; + } + get $mailConfiguration() { + return this.mailConfiguration; + } + get $reportDataConfiguration() { + return this.reportDataConfiguration; + } + get $pipelineConfiguration() { + return this.pipelineConfiguration; + } + throwError(prefix, suffix, expectation) { + throw new InputError_1.InputError(`${prefix} should ${expectation}. Actual Input value: '${suffix}'`); + } +} +exports.ReportConfiguration = ReportConfiguration; +//# sourceMappingURL=ReportConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js.map new file mode 100644 index 00000000..77e9fd87 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportConfiguration.js","sourceRoot":"","sources":["ReportConfiguration.ts"],"names":[],"mappings":";;;AAKA,yDAAsD;AACtD,mDAAgD;AAChD,sDAAmD;AAEnD,MAAa,mBAAmB;IAM9B,YAAY,cAAsC;QAChD,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,uBAAuB,GAAG,cAAc,CAAC,0BAA0B,EAAE,CAAC;QAC3E,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC,wBAAwB,EAAE,CAAC;IACzE,CAAC;IAED,qBAAqB;QACnB,IAAI,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,eAAe,IAAI,CAAC,EAAE;YACxE,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,8BAA8B,EAAE,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;SAC1I;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,kBAAkB;QACxB,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;YACvE,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;SACtG;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;IACH,CAAC;IAED,UAAU;IACV,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,MAAW,EAAE,WAAmB;QACjE,MAAM,IAAI,uBAAU,CAAC,GAAG,MAAM,WAAW,WAAW,0BAA0B,MAAM,GAAG,CAAC,CAAC;IAC3F,CAAC;CACF;AA3DD,kDA2DC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/ReportConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/ReportConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.d.ts new file mode 100644 index 00000000..d88a6fb3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.d.ts @@ -0,0 +1,28 @@ +export declare class TaskConstants { + static readonly SUBJECT_INPUTKEY = "subject"; + static readonly SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; + static readonly INCLUDECOMMITS_INPUTKEY = "includeCommits"; + static readonly GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; + static readonly INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; + static readonly MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; + static readonly GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; + static readonly INCLUDERESULTS_INPUTKEY = "includeResultsStr"; + static readonly TOADDRESS_INPUTKEY = "toAddress"; + static readonly CCADDRESS_INPUTKEY = "ccAddress"; + static readonly INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; + static readonly INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; + static readonly SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; + static readonly ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; + static readonly USEPREVENV_INPUTKEY = "usePreviousEnvironment"; + static readonly DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; + static readonly TEAM_FOUNDATION_KEY: string; + static readonly VSS_CONNECTION_KEY: string; + static readonly ACCESS_PARAMETER: string; + static readonly PROJECTNAME_KEY: string; + static readonly PROJECTID_KEY: string; + static readonly BUILD_ID_KEY: string; + static readonly RELEASE_ID_KEY: string; + static readonly HOST_KEY: string; + static readonly ENVIRONMENTID_KEY: string; + static readonly ENVIRONMENTDEFID_KEY: string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js new file mode 100644 index 00000000..8faed453 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskConstants = void 0; +class TaskConstants { +} +exports.TaskConstants = TaskConstants; +TaskConstants.SUBJECT_INPUTKEY = "subject"; +TaskConstants.SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; +TaskConstants.INCLUDECOMMITS_INPUTKEY = "includeCommits"; +TaskConstants.GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; +TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; +TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; +TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; +TaskConstants.INCLUDERESULTS_INPUTKEY = "includeResultsStr"; +TaskConstants.TOADDRESS_INPUTKEY = "toAddress"; +TaskConstants.CCADDRESS_INPUTKEY = "ccAddress"; +TaskConstants.INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; +TaskConstants.INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; +TaskConstants.SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; +// Inputkey value should be "enableTLS" - however changing that will break the task for everyone. See task.dev.json or task.prod.json for the confusion. +// For now -inputkey has to be enableSSL... until AzureDevOps marketplace supports a way to rename params in json +TaskConstants.ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; +TaskConstants.USEPREVENV_INPUTKEY = "usePreviousEnvironment"; +TaskConstants.DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; +TaskConstants.TEAM_FOUNDATION_KEY = "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"; +TaskConstants.VSS_CONNECTION_KEY = "SYSTEMVSSCONNECTION"; +TaskConstants.ACCESS_PARAMETER = "ACCESSTOKEN"; +TaskConstants.PROJECTNAME_KEY = "SYSTEM_TEAMPROJECT"; +TaskConstants.PROJECTID_KEY = "SYSTEM_TEAMPROJECTID"; +TaskConstants.BUILD_ID_KEY = "BUILD_BUILDID"; +TaskConstants.RELEASE_ID_KEY = "RELEASE_RELEASEID"; +TaskConstants.HOST_KEY = "SYSTEM_HOSTTYPE"; +TaskConstants.ENVIRONMENTID_KEY = "RELEASE_ENVIRONMENTID"; +TaskConstants.ENVIRONMENTDEFID_KEY = "RELEASE_DEFINITIONENVIRONMENTID"; +//# sourceMappingURL=TaskConstants.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js.map new file mode 100644 index 00000000..c88ee1c5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskConstants.js","sourceRoot":"","sources":["TaskConstants.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;;AAA1B,sCAgCC;AA/BwB,8BAAgB,GAAG,SAAS,CAAC;AAC7B,wCAA0B,GAAG,yBAAyB,CAAC;AACvD,qCAAuB,GAAG,gBAAgB,CAAC;AAC3C,yCAA2B,GAAG,oBAAoB,CAAC;AACnD,2CAA6B,GAAG,sBAAsB,CAAC;AACvD,4CAA8B,GAAG,uBAAuB,CAAC;AACzD,yCAA2B,GAAG,uBAAuB,CAAC;AACtD,qCAAuB,GAAG,mBAAmB,CAAC;AAC9C,gCAAkB,GAAG,WAAW,CAAC;AACjC,gCAAkB,GAAG,WAAW,CAAC;AACjC,kCAAoB,GAAG,uBAAuB,CAAC;AAC/C,kCAAoB,GAAG,uBAAuB,CAAC;AAC/C,qCAAuB,GAAG,wBAAwB,CAAC;AAC1E,wJAAwJ;AACxJ,iHAAiH;AAC1F,gCAAkB,GAAG,2BAA2B,CAAC;AACjD,iCAAmB,GAAG,wBAAwB,CAAC;AAC/C,oCAAsB,GAAG,eAAe,CAAC;AAEzC,iCAAmB,GACxC,oCAAoC,CAAC;AAChB,gCAAkB,GAAW,qBAAqB,CAAC;AACnD,8BAAgB,GAAW,aAAa,CAAC;AACzC,6BAAe,GAAW,oBAAoB,CAAC;AAC/C,2BAAa,GAAW,sBAAsB,CAAC;AAC/C,0BAAY,GAAW,eAAe,CAAC;AACvC,4BAAc,GAAW,mBAAmB,CAAC;AAC7C,sBAAQ,GAAW,iBAAiB,CAAC;AAErC,+BAAiB,GAAW,uBAAuB,CAAC;AACpD,kCAAoB,GAAW,iCAAiC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/TaskConstants.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/TaskConstants.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.d.ts new file mode 100644 index 00000000..dee79830 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.d.ts @@ -0,0 +1,40 @@ +import { RecipientsConfiguration } from "./RecipientsConfiguration"; +import { SmtpConfiguration } from "./SmtpConfiguration"; +export declare class MailConfiguration { + private mailSubject; + private toRecipientsConfig; + private ccRecipientsConfig; + private smtpConfig; + private defaultDomain; + constructor($mailSubject: string, $toRecipientsConfig: RecipientsConfiguration, $ccRecipientsConfig: RecipientsConfiguration, $smtpConfig: SmtpConfiguration, $defaultDomain: string); + /** + * Getter $defaultDomain + * @return {string} + */ + get $defaultDomain(): string; + /** + * Getter $mailSubject + * @return {string} + */ + get $mailSubject(): string; + /** + * Getter $ccRecipientsConfig + * @return {RecipientsConfiguration} + */ + get $ccRecipientsConfig(): RecipientsConfiguration; + /** + * Getter $smtpConfig + * @return {SmtpConfiguration} + */ + get $smtpConfig(): SmtpConfiguration; + /** + * Getter $toRecipientsConfig + * @return {RecipientsConfiguration} + */ + get $toRecipientsConfig(): RecipientsConfiguration; + /** + * Setter $mailSubject + * @param {string} value + */ + set $mailSubject(value: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js new file mode 100644 index 00000000..b92224fc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MailConfiguration = void 0; +class MailConfiguration { + constructor($mailSubject, $toRecipientsConfig, $ccRecipientsConfig, $smtpConfig, $defaultDomain) { + this.mailSubject = $mailSubject; + this.toRecipientsConfig = $toRecipientsConfig; + this.ccRecipientsConfig = $ccRecipientsConfig; + this.smtpConfig = $smtpConfig; + this.defaultDomain = $defaultDomain; + } + /** + * Getter $defaultDomain + * @return {string} + */ + get $defaultDomain() { + return this.defaultDomain; + } + /** + * Getter $mailSubject + * @return {string} + */ + get $mailSubject() { + return this.mailSubject; + } + /** + * Getter $ccRecipientsConfig + * @return {RecipientsConfiguration} + */ + get $ccRecipientsConfig() { + return this.ccRecipientsConfig; + } + /** + * Getter $smtpConfig + * @return {SmtpConfiguration} + */ + get $smtpConfig() { + return this.smtpConfig; + } + /** + * Getter $toRecipientsConfig + * @return {RecipientsConfiguration} + */ + get $toRecipientsConfig() { + return this.toRecipientsConfig; + } + /** + * Setter $mailSubject + * @param {string} value + */ + set $mailSubject(value) { + this.mailSubject = value; + } +} +exports.MailConfiguration = MailConfiguration; +//# sourceMappingURL=MailConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js.map new file mode 100644 index 00000000..29e7bf96 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MailConfiguration.js","sourceRoot":"","sources":["MailConfiguration.ts"],"names":[],"mappings":";;;AAGA,MAAa,iBAAiB;IAQ5B,YAAY,YAAoB,EAAE,mBAA4C,EAAE,mBAA4C,EAAE,WAA8B,EAAE,cAAsB;QAClL,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;KAGC;IACD,IAAW,YAAY,CAAC,KAAa;QACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CAEF;AAhED,8CAgEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/MailConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/MailConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.d.ts new file mode 100644 index 00000000..5b3d30ce --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.d.ts @@ -0,0 +1,33 @@ +export declare class RecipientsConfiguration { + private defaultRecipients; + private includeChangesetOwners; + private includeTestOwners; + private includeActiveBugOwners; + private includeCreatedBy; + constructor($defaultRecipients: string, $includeChangesetOwners?: boolean, $includeTestOwners?: boolean, $includeActiveBugOwners?: boolean, $includeCreatedBy?: boolean); + /** + * Getter $defaultRecipients + * @return {string} + */ + get $defaultRecipients(): string; + /** + * Getter $includeChangesetOwners + * @return {boolean} + */ + get $includeChangesetOwners(): boolean; + /** + * Getter $includeTestOwners + * @return {boolean} + */ + get $includeTestOwners(): boolean; + /** + * Getter $includeActiveBugOwners + * @return {boolean} + */ + get $includeActiveBugOwners(): boolean; + /** + * Getter $includeCreatedBy + * @return {boolean} + */ + get $includeCreatedBy(): boolean; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js new file mode 100644 index 00000000..a13ce410 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RecipientsConfiguration = void 0; +class RecipientsConfiguration { + constructor($defaultRecipients, $includeChangesetOwners, $includeTestOwners, $includeActiveBugOwners, $includeCreatedBy) { + this.defaultRecipients = $defaultRecipients; + this.includeChangesetOwners = $includeChangesetOwners; + this.includeTestOwners = $includeTestOwners; + this.includeActiveBugOwners = $includeActiveBugOwners; + this.includeCreatedBy = $includeCreatedBy; + } + /** + * Getter $defaultRecipients + * @return {string} + */ + get $defaultRecipients() { + return this.defaultRecipients; + } + /** + * Getter $includeChangesetOwners + * @return {boolean} + */ + get $includeChangesetOwners() { + return this.includeChangesetOwners; + } + /** + * Getter $includeTestOwners + * @return {boolean} + */ + get $includeTestOwners() { + return this.includeTestOwners; + } + /** + * Getter $includeActiveBugOwners + * @return {boolean} + */ + get $includeActiveBugOwners() { + return this.includeActiveBugOwners; + } + /** + * Getter $includeCreatedBy + * @return {boolean} + */ + get $includeCreatedBy() { + return this.includeCreatedBy; + } +} +exports.RecipientsConfiguration = RecipientsConfiguration; +//# sourceMappingURL=RecipientsConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js.map new file mode 100644 index 00000000..f69f3fbe --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RecipientsConfiguration.js","sourceRoot":"","sources":["RecipientsConfiguration.ts"],"names":[],"mappings":";;;AAAA,MAAa,uBAAuB;IAOlC,YAAY,kBAA0B,EAAE,uBAAiC,EAAE,kBAA4B,EAAE,uBAAiC,EAAE,iBAA2B;QACrK,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAtDD,0DAsDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/RecipientsConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/RecipientsConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.d.ts new file mode 100644 index 00000000..3d9e3705 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.d.ts @@ -0,0 +1,27 @@ +export declare class SmtpConfiguration { + private userName; + private password; + private smtpHost; + private enableTLS; + constructor($userName: string, $password: string, $smtpHost: string, $enableTLS: boolean); + /** + * Getter $userName + * @return {string} + */ + get $userName(): string; + /** + * Getter $password + * @return {string} + */ + get $password(): string; + /** + * Getter $smtpHost + * @return {string} + */ + get $smtpHost(): string; + /** + * Getter $enableSSL + * @return {boolean} + */ + get $enableTLS(): boolean; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js new file mode 100644 index 00000000..10c87f7d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SmtpConfiguration = void 0; +class SmtpConfiguration { + constructor($userName, $password, $smtpHost, $enableTLS) { + this.userName = $userName; + this.password = $password; + this.smtpHost = $smtpHost; + this.enableTLS = $enableTLS; + } + /** + * Getter $userName + * @return {string} + */ + get $userName() { + return this.userName; + } + /** + * Getter $password + * @return {string} + */ + get $password() { + return this.password; + } + /** + * Getter $smtpHost + * @return {string} + */ + get $smtpHost() { + return this.smtpHost; + } + /** + * Getter $enableSSL + * @return {boolean} + */ + get $enableTLS() { + return this.enableTLS; + } +} +exports.SmtpConfiguration = SmtpConfiguration; +//# sourceMappingURL=SmtpConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js.map new file mode 100644 index 00000000..445b4fd3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SmtpConfiguration.js","sourceRoot":"","sources":["SmtpConfiguration.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAM5B,YAAY,SAAiB,EAAE,SAAiB,EAAE,SAAiB,EAAE,UAAmB;QACtF,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;KAGC;IACD,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA5CD,8CA4CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/SmtpConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/mail/SmtpConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.d.ts new file mode 100644 index 00000000..f5d5457a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.d.ts @@ -0,0 +1,60 @@ +import { PipelineType } from "./PipelineType"; +export declare class PipelineConfiguration { + private pipelineType; + private pipelineId; + private projectId; + private projectName; + private environmentId; + private environmentDefinitionId; + private usePreviousEnvironment; + private teamUri; + private accessKey; + private testTabLink; + constructor($pipelineType: PipelineType, $pipelineId: number, $projectId: string, $projectName: string, $environmentId: number, $environmentDefinitionId: number, $usePreviousEnvironment: boolean, $teamUri: string, $accessKey: string); + /** + * Getter $pipelineId + * @return {number} + */ + get $pipelineType(): number; + /** + * Getter $pipelineId + * @return {number} + */ + get $pipelineId(): number; + /** + * Getter $projectId + * @return {string} + */ + get $projectId(): string; + /** + * Getter $projectName + * @return {string} + */ + get $projectName(): string; + /** + * Getter $environmentId + * @return {number} + */ + get $environmentId(): number; + /** + * Getter $environmentDefinitionId + * @return {number} + */ + get $environmentDefinitionId(): number; + /** + * Getter $usePreviousEnvironment + * @return {boolean} + */ + get $usePreviousEnvironment(): boolean; + /** + * Getter $teamUri + * @return {string} + */ + get $teamUri(): string; + /** + * Getter $accessKey + * @return {string} + */ + get $accessKey(): string; + getTestTabLink(): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js new file mode 100644 index 00000000..c8844b9f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js @@ -0,0 +1,94 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PipelineConfiguration = void 0; +const PipelineType_1 = require("./PipelineType"); +const LinkHelper_1 = require("../../model/helpers/LinkHelper"); +class PipelineConfiguration { + constructor($pipelineType, $pipelineId, $projectId, $projectName, $environmentId, $environmentDefinitionId, $usePreviousEnvironment, $teamUri, $accessKey) { + this.pipelineType = $pipelineType; + this.pipelineId = $pipelineId; + this.projectId = $projectId; + this.projectName = $projectName; + this.environmentId = $environmentId; + this.environmentDefinitionId = $environmentDefinitionId; + this.usePreviousEnvironment = $usePreviousEnvironment; + this.teamUri = $teamUri; + this.accessKey = $accessKey; + } + /** + * Getter $pipelineId + * @return {number} + */ + get $pipelineType() { + return this.pipelineType; + } + /** + * Getter $pipelineId + * @return {number} + */ + get $pipelineId() { + return this.pipelineId; + } + /** + * Getter $projectId + * @return {string} + */ + get $projectId() { + return this.projectId; + } + /** + * Getter $projectName + * @return {string} + */ + get $projectName() { + return this.projectName; + } + /** + * Getter $environmentId + * @return {number} + */ + get $environmentId() { + return this.environmentId; + } + /** + * Getter $environmentDefinitionId + * @return {number} + */ + get $environmentDefinitionId() { + return this.environmentDefinitionId; + } + /** + * Getter $usePreviousEnvironment + * @return {boolean} + */ + get $usePreviousEnvironment() { + return this.usePreviousEnvironment; + } + /** + * Getter $teamUri + * @return {string} + */ + get $teamUri() { + return this.teamUri; + } + /** + * Getter $accessKey + * @return {string} + */ + get $accessKey() { + return this.accessKey; + } + getTestTabLink() { + if (this.testTabLink == null) { + if (this.pipelineType == PipelineType_1.PipelineType.Release) { + this.testTabLink = LinkHelper_1.LinkHelper.getTestTabLinkInRelease(this); + } + else if (this.pipelineType == PipelineType_1.PipelineType.Build) { + this.testTabLink = LinkHelper_1.LinkHelper.getTestTabLinkInBuild(this); + } + } + return this.testTabLink; + } +} +exports.PipelineConfiguration = PipelineConfiguration; +//# sourceMappingURL=PipelineConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js.map new file mode 100644 index 00000000..57b349db --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PipelineConfiguration.js","sourceRoot":"","sources":["PipelineConfiguration.ts"],"names":[],"mappings":";;;AAAA,iDAA8C;AAC9C,+DAA4D;AAE5D,MAAa,qBAAqB;IAYhC,YAAY,aAA2B,EACrC,WAAmB,EACnB,UAAkB,EAClB,YAAoB,EACpB,cAAsB,EACtB,wBAAgC,EAChC,uBAAgC,EAChC,QAAgB,EAChB,UAAkB;QAClB,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;QACpC,IAAI,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;QACxD,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;KAGC;IACD,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;IAGA;IACA,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;YAC5B,IAAI,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC,OAAO,EAAE;gBAC7C,IAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;aAC7D;iBAAM,IAAI,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC,KAAK,EAAE;gBAClD,IAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;aAC3D;SACF;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAlHD,sDAkHC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.d.ts new file mode 100644 index 00000000..09b23178 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.d.ts @@ -0,0 +1,4 @@ +export declare enum PipelineType { + Build = 0, + Release = 1 +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js new file mode 100644 index 00000000..630d9589 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PipelineType = void 0; +var PipelineType; +(function (PipelineType) { + PipelineType[PipelineType["Build"] = 0] = "Build"; + PipelineType[PipelineType["Release"] = 1] = "Release"; +})(PipelineType = exports.PipelineType || (exports.PipelineType = {})); +//# sourceMappingURL=PipelineType.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js.map new file mode 100644 index 00000000..a7c978d9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PipelineType.js","sourceRoot":"","sources":["PipelineType.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,iDAAK,CAAA;IACL,qDAAO,CAAA;AACT,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/pipeline/PipelineType.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/pipeline/PipelineType.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.d.ts new file mode 100644 index 00000000..f5970674 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.d.ts @@ -0,0 +1,5 @@ +export declare enum GroupTestResultsBy { + Priority = 0, + Run = 1, + Team = 2 +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js new file mode 100644 index 00000000..e5a1d7b0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GroupTestResultsBy = void 0; +var GroupTestResultsBy; +(function (GroupTestResultsBy) { + GroupTestResultsBy[GroupTestResultsBy["Priority"] = 0] = "Priority"; + GroupTestResultsBy[GroupTestResultsBy["Run"] = 1] = "Run"; + GroupTestResultsBy[GroupTestResultsBy["Team"] = 2] = "Team"; +})(GroupTestResultsBy = exports.GroupTestResultsBy || (exports.GroupTestResultsBy = {})); +//# sourceMappingURL=GroupTestResultsBy.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js.map new file mode 100644 index 00000000..fa15639d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js.map @@ -0,0 +1 @@ +{"version":3,"file":"GroupTestResultsBy.js","sourceRoot":"","sources":["GroupTestResultsBy.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC5B,mEAAY,CAAA;IACZ,yDAAG,CAAA;IACH,2DAAI,CAAA;AACN,CAAC,EAJW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAI7B"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/GroupTestResultsBy.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/GroupTestResultsBy.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.d.ts new file mode 100644 index 00000000..afcfadd4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.d.ts @@ -0,0 +1,35 @@ +import { GroupTestResultsBy } from "./GroupTestResultsBy"; +import { TestResultsConfiguration } from "./TestResultsConfiguration"; +export declare class ReportDataConfiguration { + private includeCommits; + private includeOthersInTotal; + private includeEnvironmentInfo; + private groupTestSummaryBy; + private testResultsConfig; + constructor($includeCommits: boolean, $includeOthersInTotal: boolean, $includeEnvironmentInfo: boolean, $groupTestSummaryBy: GroupTestResultsBy[], $testResultsConfig: TestResultsConfiguration); + /** + * Getter $includeCommits + * @return {boolean} + */ + get $includeCommits(): boolean; + /** + * Getter $includeOthersInTotal + * @return {boolean} + */ + get $includeOthersInTotal(): boolean; + /** + * Getter $includeEnvironmentInfo + * @return {boolean} + */ + get $includeEnvironmentInfo(): boolean; + /** + * Getter $groupTestSummaryBy + * @return {GroupTestResultsBy[]} + */ + get $groupTestSummaryBy(): GroupTestResultsBy[]; + /** + * Getter $testResultsConfig + * @return {TestResultsConfiguration} + */ + get $testResultsConfig(): TestResultsConfiguration; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js new file mode 100644 index 00000000..770aad71 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportDataConfiguration = void 0; +class ReportDataConfiguration { + constructor($includeCommits, $includeOthersInTotal, $includeEnvironmentInfo, $groupTestSummaryBy, $testResultsConfig) { + this.includeCommits = $includeCommits; + this.includeOthersInTotal = $includeOthersInTotal; + this.includeEnvironmentInfo = $includeEnvironmentInfo; + this.groupTestSummaryBy = $groupTestSummaryBy; + this.testResultsConfig = $testResultsConfig; + } + /** + * Getter $includeCommits + * @return {boolean} + */ + get $includeCommits() { + return this.includeCommits; + } + /** + * Getter $includeOthersInTotal + * @return {boolean} + */ + get $includeOthersInTotal() { + return this.includeOthersInTotal; + } + /** + * Getter $includeEnvironmentInfo + * @return {boolean} + */ + get $includeEnvironmentInfo() { + return this.includeEnvironmentInfo; + } + /** + * Getter $groupTestSummaryBy + * @return {GroupTestResultsBy[]} + */ + get $groupTestSummaryBy() { + return this.groupTestSummaryBy; + } + /** + * Getter $testResultsConfig + * @return {TestResultsConfiguration} + */ + get $testResultsConfig() { + return this.testResultsConfig; + } +} +exports.ReportDataConfiguration = ReportDataConfiguration; +//# sourceMappingURL=ReportDataConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js.map new file mode 100644 index 00000000..2b4825c2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportDataConfiguration.js","sourceRoot":"","sources":["ReportDataConfiguration.ts"],"names":[],"mappings":";;;AAGA,MAAa,uBAAuB;IAYlC,YAAY,eAAwB,EAAE,qBAA8B,EAAE,uBAAgC,EAAE,mBAAyC,EAAE,kBAA4C;QAC7L,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;QACtC,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC;QAClD,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AA3DD,0DA2DC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/ReportDataConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/ReportDataConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.d.ts new file mode 100644 index 00000000..81073e1f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.d.ts @@ -0,0 +1,6 @@ +export declare enum SendMailCondition { + Always = 0, + OnFailure = 1, + OnSuccess = 2, + OnNewFailuresOnly = 3 +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js new file mode 100644 index 00000000..faa08b3e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SendMailCondition = void 0; +var SendMailCondition; +(function (SendMailCondition) { + SendMailCondition[SendMailCondition["Always"] = 0] = "Always"; + SendMailCondition[SendMailCondition["OnFailure"] = 1] = "OnFailure"; + SendMailCondition[SendMailCondition["OnSuccess"] = 2] = "OnSuccess"; + SendMailCondition[SendMailCondition["OnNewFailuresOnly"] = 3] = "OnNewFailuresOnly"; +})(SendMailCondition = exports.SendMailCondition || (exports.SendMailCondition = {})); +//# sourceMappingURL=SendMailCondition.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js.map new file mode 100644 index 00000000..36ca9571 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SendMailCondition.js","sourceRoot":"","sources":["SendMailCondition.ts"],"names":[],"mappings":";;;AAAA,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,6DAAU,CAAA;IACV,mEAAS,CAAA;IACT,mEAAS,CAAA;IACT,mFAAiB,CAAA;AACnB,CAAC,EALW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAK5B"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/SendMailCondition.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/SendMailCondition.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.d.ts new file mode 100644 index 00000000..0a73878c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.d.ts @@ -0,0 +1,46 @@ +import { GroupTestResultsBy } from "./GroupTestResultsBy"; +export declare class TestResultsConfiguration { + private includeFailedTests; + private includePassedTests; + private includeInconclusiveTests; + private includeNotExecutedTests; + private includeOtherTests; + private groupTestResultsBy; + private maxItemsToShow; + constructor($includeFailedTests: boolean, $includePassedTests: boolean, $includeInconclusiveTests: boolean, $includeNotExecutedTests: boolean, $includeOtherTests: boolean, $groupTestResultsBy: GroupTestResultsBy, $maxItemsToShow: number); + /** + * Getter $includeFailedTests + * @return {boolean} + */ + get $includeFailedTests(): boolean; + /** + * Getter $includePassedTests + * @return {boolean} + */ + get $includePassedTests(): boolean; + /** + * Getter $includeInconclusiveTests + * @return {boolean} + */ + get $includeInconclusiveTests(): boolean; + /** + * Getter $includeNotExecutedTests + * @return {boolean} + */ + get $includeNotExecutedTests(): boolean; + /** + * Getter $includeOtherTests + * @return {boolean} + */ + get $includeOtherTests(): boolean; + /** + * Getter $groupTestResultsBy + * @return {GroupTestResultsBy} + */ + get $groupTestResultsBy(): GroupTestResultsBy; + /** + * Getter $maxItemsToShow + * @return {number} + */ + get $maxItemsToShow(): number; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js new file mode 100644 index 00000000..24fb9a79 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js @@ -0,0 +1,65 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsConfiguration = void 0; +class TestResultsConfiguration { + constructor($includeFailedTests, $includePassedTests, $includeInconclusiveTests, $includeNotExecutedTests, $includeOtherTests, $groupTestResultsBy, $maxItemsToShow) { + this.includeFailedTests = $includeFailedTests; + this.includePassedTests = $includePassedTests; + this.includeInconclusiveTests = $includeInconclusiveTests; + this.includeNotExecutedTests = $includeNotExecutedTests; + this.includeOtherTests = $includeOtherTests; + this.groupTestResultsBy = $groupTestResultsBy; + this.maxItemsToShow = $maxItemsToShow; + } + /** + * Getter $includeFailedTests + * @return {boolean} + */ + get $includeFailedTests() { + return this.includeFailedTests; + } + /** + * Getter $includePassedTests + * @return {boolean} + */ + get $includePassedTests() { + return this.includePassedTests; + } + /** + * Getter $includeInconclusiveTests + * @return {boolean} + */ + get $includeInconclusiveTests() { + return this.includeInconclusiveTests; + } + /** + * Getter $includeNotExecutedTests + * @return {boolean} + */ + get $includeNotExecutedTests() { + return this.includeNotExecutedTests; + } + /** + * Getter $includeOtherTests + * @return {boolean} + */ + get $includeOtherTests() { + return this.includeOtherTests; + } + /** + * Getter $groupTestResultsBy + * @return {GroupTestResultsBy} + */ + get $groupTestResultsBy() { + return this.groupTestResultsBy; + } + /** + * Getter $maxItemsToShow + * @return {number} + */ + get $maxItemsToShow() { + return this.maxItemsToShow; + } +} +exports.TestResultsConfiguration = TestResultsConfiguration; +//# sourceMappingURL=TestResultsConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js.map new file mode 100644 index 00000000..0e9bbf3b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultsConfiguration.js","sourceRoot":"","sources":["TestResultsConfiguration.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAwB;IASnC,YAAY,mBAA4B,EAAE,mBAA4B,EAAE,yBAAkC,EAAE,wBAAiC,EAAE,kBAA2B,EAAE,mBAAuC,EAAE,eAAuB;QAC1O,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,wBAAwB,GAAG,yBAAyB,CAAC;QAC1D,IAAI,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;QACxD,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,yBAAyB;QAClC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AA1ED,4DA0EC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/TestResultsConfiguration.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/config/report/TestResultsConfiguration.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.d.ts new file mode 100644 index 00000000..9b6a8d92 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class DataProviderError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js new file mode 100644 index 00000000..bfb8da0a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DataProviderError = void 0; +const ReportError_1 = require("./ReportError"); +class DataProviderError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = DataProviderError.name; + } +} +exports.DataProviderError = DataProviderError; +//# sourceMappingURL=DataProviderError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js.map new file mode 100644 index 00000000..c033f135 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DataProviderError.js","sourceRoot":"","sources":["DataProviderError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,iBAAkB,SAAQ,yBAAW;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;IACrC,CAAC;CACF;AALD,8CAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/DataProviderError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/DataProviderError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.d.ts new file mode 100644 index 00000000..808fd744 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class InputError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js new file mode 100644 index 00000000..14470419 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InputError = void 0; +const ReportError_1 = require("./ReportError"); +class InputError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = InputError.name; + } +} +exports.InputError = InputError; +//# sourceMappingURL=InputError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js.map new file mode 100644 index 00000000..f852e88d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"InputError.js","sourceRoot":"","sources":["InputError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,UAAW,SAAQ,yBAAW;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AALD,gCAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/InputError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/InputError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.d.ts new file mode 100644 index 00000000..9dfa8656 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class InvalidTestResultDataError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js new file mode 100644 index 00000000..d29437eb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InvalidTestResultDataError = void 0; +const ReportError_1 = require("./ReportError"); +class InvalidTestResultDataError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = InvalidTestResultDataError.name; + } +} +exports.InvalidTestResultDataError = InvalidTestResultDataError; +//# sourceMappingURL=InvalidTestResultDataError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js.map new file mode 100644 index 00000000..8dc89501 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"InvalidTestResultDataError.js","sourceRoot":"","sources":["InvalidTestResultDataError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,0BAA2B,SAAQ,yBAAW;IACzD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC;IAC9C,CAAC;CACF;AALD,gEAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.d.ts new file mode 100644 index 00000000..08659da2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class MailError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js new file mode 100644 index 00000000..d068d533 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MailError = void 0; +const ReportError_1 = require("./ReportError"); +class MailError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = MailError.name; + } +} +exports.MailError = MailError; +//# sourceMappingURL=MailError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js.map new file mode 100644 index 00000000..bf6960bb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MailError.js","sourceRoot":"","sources":["MailError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,SAAU,SAAQ,yBAAW;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF;AALD,8BAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/MailError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/MailError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.d.ts new file mode 100644 index 00000000..b4d47a5c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class MissingDataError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js new file mode 100644 index 00000000..7545c9e6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MissingDataError = void 0; +const ReportError_1 = require("./ReportError"); +class MissingDataError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = MissingDataError.name; + } +} +exports.MissingDataError = MissingDataError; +//# sourceMappingURL=MissingDataError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js.map new file mode 100644 index 00000000..5977fecc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MissingDataError.js","sourceRoot":"","sources":["MissingDataError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,gBAAiB,SAAQ,yBAAW;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AALD,4CAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/MissingDataError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/MissingDataError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.d.ts new file mode 100644 index 00000000..9ab6105d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class PipelineNotFoundError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js new file mode 100644 index 00000000..8ce54ee2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PipelineNotFoundError = void 0; +const ReportError_1 = require("./ReportError"); +class PipelineNotFoundError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = "PipelineNotFoundError"; + } +} +exports.PipelineNotFoundError = PipelineNotFoundError; +//# sourceMappingURL=PipelineNotFoundError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js.map new file mode 100644 index 00000000..1c02cf11 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PipelineNotFoundError.js","sourceRoot":"","sources":["PipelineNotFoundError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,qBAAsB,SAAQ,yBAAW;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/PipelineNotFoundError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/PipelineNotFoundError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.d.ts new file mode 100644 index 00000000..40ff69a1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.d.ts @@ -0,0 +1,4 @@ +import { ReportError } from "./ReportError"; +export declare class PostProcessorError extends ReportError { + constructor(message: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js new file mode 100644 index 00000000..0402641d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PostProcessorError = void 0; +const ReportError_1 = require("./ReportError"); +class PostProcessorError extends ReportError_1.ReportError { + constructor(message) { + super(message); + this.name = PostProcessorError.name; + } +} +exports.PostProcessorError = PostProcessorError; +//# sourceMappingURL=PostProcessorError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js.map new file mode 100644 index 00000000..7c84fb52 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PostProcessorError.js","sourceRoot":"","sources":["PostProcessorError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,kBAAmB,SAAQ,yBAAW;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACtC,CAAC;CACF;AALD,gDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/PostProcessorError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/PostProcessorError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.d.ts new file mode 100644 index 00000000..aa924ae6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.d.ts @@ -0,0 +1,6 @@ +export declare abstract class ReportError extends Error { + innerError: any; + constructor(message: string); + getMessage(): string; + static HandleError(err: Error, rethrow?: boolean): void; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js new file mode 100644 index 00000000..ab69ab25 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportError = void 0; +const util_1 = require("util"); +class ReportError extends Error { + constructor(message) { + super(message); + } + getMessage() { + const stack = util_1.isNullOrUndefined(this.innerError) || util_1.isNullOrUndefined(this.innerError.stack) ? this.stack : + `${this.stack}\r\nInnerError:${this.innerError.message}: ${this.innerError.stack}`; + return `${this.name}: ${this.message}\r\n ${stack}`; + } + static HandleError(err, rethrow = false) { + if (err instanceof ReportError) { + console.error(err.getMessage()); + } + else { + console.error(err); + } + if (rethrow) { + throw err; + } + } +} +exports.ReportError = ReportError; +//# sourceMappingURL=ReportError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js.map new file mode 100644 index 00000000..505bc060 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportError.js","sourceRoot":"","sources":["ReportError.ts"],"names":[],"mappings":";;;AAAA,+BAAyC;AAEzC,MAAsB,WAAY,SAAQ,KAAK;IAE7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAEM,UAAU;QACf,MAAM,KAAK,GAAG,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzG,GAAG,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACpF,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,QAAQ,KAAK,EAAE,CAAC;IACtD,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,GAAU,EAAE,UAAmB,KAAK;QAC5D,IAAG,GAAG,YAAY,WAAW,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAE,GAAmB,CAAC,UAAU,EAAE,CAAC,CAAC;SAClD;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpB;QAED,IAAG,OAAO,EAAE;YACV,MAAM,GAAG,CAAC;SACX;IACH,CAAC;CACF;AAvBD,kCAuBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/ReportError.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/exceptions/ReportError.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/EmailTemplate.xslt b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/EmailTemplate.xslt similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/EmailTemplate.xslt rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/EmailTemplate.xslt diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.d.ts new file mode 100644 index 00000000..9c4145c4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.d.ts @@ -0,0 +1,6 @@ +import { IHTMLReportCreator } from './IHTMLReportCreator'; +import { Report } from '../model/Report'; +import { ReportConfiguration } from '../config/ReportConfiguration'; +export declare class HTMLReportCreator implements IHTMLReportCreator { + createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js new file mode 100644 index 00000000..859c6c18 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HTMLReportCreator = void 0; +const EmailReportViewModel_1 = require("../model/viewmodel/EmailReportViewModel"); +const fs = require("fs"); +const o2x = require('object-to-xml'); +const xsltProcessor = require("xslt-processor"); +const { xmlParse, xsltProcess } = xsltProcessor; +class HTMLReportCreator { + createHtmlReport(report, reportConfiguration) { + const currDir = __dirname; + console.log(`CurrentDir: ${currDir}`); + var xsltTemplatePath = `${currDir}\\EmailTemplate.xslt`; + console.log("Loading Email Template: " + xsltTemplatePath); + // Create a view model object before serialize to xml + const reportViewModel = new EmailReportViewModel_1.EmailReportViewModel(report, reportConfiguration); + // Serialize gathered data into xml + const xmlString = "" + o2x(reportViewModel) + ""; + // Read XSLT email template + const buffer = fs.readFileSync(xsltTemplatePath); + // Parse the xml string as XmlDocument/Node + const xmlDoc = xmlParse(xmlString, "text/xml"); + // Parse XSLT as XMLDocument + const xsltDoc = xmlParse(buffer.toString(), "application/xml"); + // Fill the XSLT document template with the xml doc data + let outXmlString = xsltProcess(xmlDoc, xsltDoc); + // XML parsing changes
to special chars if they are part of xml nodevalues. Do string replace to fix the jankiness for HTML. + outXmlString = outXmlString.split("<br/>").join("
"); + return outXmlString; + } +} +exports.HTMLReportCreator = HTMLReportCreator; +//# sourceMappingURL=HTMLReportCreator.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js.map new file mode 100644 index 00000000..a6461dec --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"HTMLReportCreator.js","sourceRoot":"","sources":["HTMLReportCreator.ts"],"names":[],"mappings":";;;AAAA,kFAA+E;AAI/E,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AACrC,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAChD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;AAEhD,MAAa,iBAAiB;IAE5B,gBAAgB,CAAC,MAAc,EAAE,mBAAwC;QACvE,MAAM,OAAO,GAAG,SAAS,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QACtC,IAAI,gBAAgB,GAAG,GAAG,OAAO,sBAAsB,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,gBAAgB,CAAC,CAAC;QAE3D,qDAAqD;QACrD,MAAM,eAAe,GAAG,IAAI,2CAAoB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC9E,oCAAoC;QACpC,MAAM,SAAS,GAAW,wBAAwB,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,yBAAyB,CAAC;QACtG,4BAA4B;QAC5B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACjD,2CAA2C;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC/C,4BAA4B;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAC/D,wDAAwD;QACxD,IAAI,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,kIAAkI;QAClI,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAxBD,8CAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/HTMLReportCreator.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/HTMLReportCreator.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.d.ts new file mode 100644 index 00000000..9ceab733 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.d.ts @@ -0,0 +1,5 @@ +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +export interface IHTMLReportCreator { + createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js new file mode 100644 index 00000000..f626ba20 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IHTMLReportCreator.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js.map new file mode 100644 index 00000000..9ec8a16e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IHTMLReportCreator.js","sourceRoot":"","sources":["IHTMLReportCreator.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js new file mode 100644 index 00000000..239f955d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js @@ -0,0 +1,67 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const ReportConfiguration_1 = require("./config/ReportConfiguration"); +const ConfigurationProvider_1 = require("./config/ConfigurationProvider"); +const ReportManager_1 = require("./ReportManager"); +const ReportProvider_1 = require("./providers/ReportProvider"); +const DataProviderFactory_1 = require("./providers/DataProviderFactory"); +const HTMLReportCreator_1 = require("./htmlreport/HTMLReportCreator"); +const EmailSender_1 = require("./EmailSender"); +const ReportError_1 = require("./exceptions/ReportError"); +const TelemetryLogger_1 = require("./telemetry/TelemetryLogger"); +function run() { + return __awaiter(this, void 0, void 0, function* () { + try { + console.log('Node Version: ' + process.version); + const configProvider = new ConfigurationProvider_1.ConfigurationProvider(); + const reportConfiguration = new ReportConfiguration_1.ReportConfiguration(configProvider); + const reportProvider = new ReportProvider_1.ReportProvider(new DataProviderFactory_1.DataProviderFactory(configProvider.getPipelineConfiguration())); + // Log telemetry: Task Inputs and Configuration + TelemetryLogger_1.TelemetryLogger.LogTaskConfig(reportConfiguration); + const reportManager = new ReportManager_1.ReportManager(reportProvider, new HTMLReportCreator_1.HTMLReportCreator(), new EmailSender_1.EmailSender()); + const mailSent = yield reportManager.sendReportAsync(reportConfiguration); + if (mailSent) { + // Wait for 10 sec and timeout + let val = yield Promise.race([sleep(10000), setEmailSentVariable(mailSent)]); + if (!val) { + console.log("Unable to set variable value in 10 sec. Exiting task."); + } + } + } + catch (err) { + if (err instanceof ReportError_1.ReportError) { + console.log(err.getMessage()); + } + else { + console.log(err); + } + // Fail task + throw err; + } + finally { + console.log("Task Processing Complete."); + } + }); +} +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms, false)); +} +function setEmailSentVariable(mailSent) { + return __awaiter(this, void 0, void 0, function* () { + console.log("Setting EmailReportTask.EmailSent Variable value."); + console.log(`##vso[task.setvariable variable=EmailReportTask.EmailSent;]${mailSent}`); + console.log(`EmailReportTask.EmailSent Variable value set as ${mailSent}`); + return true; + }); +} +run(); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js.map new file mode 100644 index 00000000..c285d1a8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,sEAAmE;AACnE,0EAAuE;AACvE,mDAAgD;AAChD,+DAA4D;AAC5D,yEAAsE;AACtE,sEAAmE;AACnE,+CAA4C;AAC5C,0DAAuD;AACvD,iEAA8D;AAE9D,SAAe,GAAG;;QAChB,IAAI;YAEF,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAEhD,MAAM,cAAc,GAAG,IAAI,6CAAqB,EAAE,CAAC;YACnD,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,CAAC,cAAc,CAAC,CAAC;YACpE,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,yCAAmB,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAE9G,+CAA+C;YAC/C,iCAAe,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YAEnD,MAAM,aAAa,GAAG,IAAI,6BAAa,CACrC,cAAc,EACd,IAAI,qCAAiB,EAAE,EACvB,IAAI,yBAAW,EAAE,CAAC,CAAC;YAErB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YAC1E,IAAG,QAAQ,EAAE;gBACX,8BAA8B;gBAC9B,IAAI,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAG,CAAC,GAAG,EAAE;oBACP,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;iBACtE;aACF;SACF;QACD,OAAO,GAAG,EAAE;YACV,IAAI,GAAG,YAAY,yBAAW,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;aAC/B;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClB;YACD,YAAY;YACZ,MAAM,GAAG,CAAC;SACX;gBACO;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;SAC1C;IACH,CAAC;CAAA;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAe,oBAAoB,CAAC,QAAiB;;QACnD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,8DAA8D,QAAQ,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;CAAA;AAED,GAAG,EAAE,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/index.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/index.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.d.ts new file mode 100644 index 00000000..a84f16d5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.d.ts @@ -0,0 +1,25 @@ +import { Build, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { Report } from "./Report"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; +import { PhaseModel } from "./PhaseModel"; +import { ChangeModel } from "./ChangeModel"; +export declare class BuildReport extends Report { + private build; + private timeline; + private lastCompletedBuild; + private lastCompletedTimeline; + setBuildData($build: Build, $timeline: Timeline, $lastCompletedBuild: Build, $lastCompletedTimeline: Timeline, $phases: PhaseModel[], $changes: ChangeModel[]): void; + hasPrevGotSameFailures(): boolean; + hasFailedTasks(): boolean; + hasPrevFailedTasks(): boolean; + arePrevFailedTasksSame(): boolean; + getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; + getEnvironmentStatus(): string; + getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel; + getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; + hasCanceledPhases(): boolean; + private timelineHasFailedTasks; + private getTasksByResultinTimeline; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js new file mode 100644 index 00000000..90c7aa30 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js @@ -0,0 +1,79 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildReport = void 0; +const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); +const Report_1 = require("./Report"); +const util_1 = require("util"); +const PipelineConfiguration_1 = require("../config/pipeline/PipelineConfiguration"); +const PipelineType_1 = require("../config/pipeline/PipelineType"); +const BuildReferenceViewModel_1 = require("./viewmodel/BuildReferenceViewModel"); +class BuildReport extends Report_1.Report { + setBuildData($build, $timeline, $lastCompletedBuild, $lastCompletedTimeline, $phases, $changes) { + this.build = $build; + this.timeline = $timeline; + this.lastCompletedBuild = $lastCompletedBuild; + this.lastCompletedTimeline = $lastCompletedTimeline; + this.phases = $phases; + this.associatedChanges = $changes; + } + hasPrevGotSameFailures() { + if (this.lastCompletedBuild == null) { + return false; + } + console.log(`Using Last Completed Build: '${this.lastCompletedBuild.id}'.`); + if (this.lastCompletedBuild.id > this.build.id) { + // We are in a situation where current build completed latter compared to the newer one + // Newer one would have already evaluated the failures and sent a mail to committers anyway + // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer + // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line + return true; + } + return null; + } + hasFailedTasks() { + return this.timelineHasFailedTasks(this.timeline); + } + hasPrevFailedTasks() { + return this.timelineHasFailedTasks(this.lastCompletedTimeline); + } + arePrevFailedTasksSame() { + var prevfailedTask = this.getTasksByResultinTimeline(this.lastCompletedTimeline, BuildInterfaces_1.TaskResult.Failed)[0]; + var currentFailedTask = this.getTasksByResultinTimeline(this.timeline, BuildInterfaces_1.TaskResult.Failed)[0]; + // if both releases failed without executing any tasks, then they can be null + // otherwise, use name matching + return (prevfailedTask == null && currentFailedTask == null) + || (!util_1.isNullOrUndefined(prevfailedTask) && !util_1.isNullOrUndefined(currentFailedTask) && prevfailedTask.name.toLowerCase() == currentFailedTask.name.toLowerCase()); + } + getPrevConfig(config) { + var buildConfig = new PipelineConfiguration_1.PipelineConfiguration(PipelineType_1.PipelineType.Build, this.lastCompletedBuild.id, config.$projectId, config.$projectName, null, null, config.$usePreviousEnvironment, config.$teamUri, config.$accessKey); + return buildConfig; + } + getEnvironmentStatus() { + if (this.hasFailedTasks()) { + return "Failed"; + } + else if (this.getTasksByResultinTimeline(this.timeline, BuildInterfaces_1.TaskResult.SucceededWithIssues).length > 0) { + return "Partially Succeeded"; + } + else { + return "Succeeded"; + } + } + getPipelineViewModel(config) { + return new BuildReferenceViewModel_1.BuildReferenceViewModel(config, null, this.build); + } + getArtifactViewModels(config) { + return []; + } + hasCanceledPhases() { + return false; + } + timelineHasFailedTasks(timeLine) { + return this.getTasksByResultinTimeline(timeLine, BuildInterfaces_1.TaskResult.Failed).length > 0; + } + getTasksByResultinTimeline(timeLine, taskResult) { + return this.timeline == null || this.timeline.records == null ? [] : this.timeline.records.filter(r => r.result == taskResult); + } +} +exports.BuildReport = BuildReport; +//# sourceMappingURL=BuildReport.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js.map new file mode 100644 index 00000000..3811e9f5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildReport.js","sourceRoot":"","sources":["BuildReport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/BuildReport.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/BuildReport.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.d.ts new file mode 100644 index 00000000..72f457c1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.d.ts @@ -0,0 +1,34 @@ +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +export declare class ChangeModel { + private id; + private author; + private location; + private timeStamp; + private message; + constructor($id: string, $author: IdentityRef, $location: string, $timeStamp: Date, $message: string); + /** + * Getter $id + * @return {string} + */ + get $id(): string; + /** + * Getter $author + * @return {IdentityRef} + */ + get $author(): IdentityRef; + /** + * Getter $location + * @return {string} + */ + get $location(): string; + /** + * Getter $timeStamp + * @return {Date} + */ + get $timeStamp(): Date; + /** + * Getter $message + * @return {string} + */ + get $message(): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js new file mode 100644 index 00000000..615c8481 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ChangeModel = void 0; +class ChangeModel { + constructor($id, $author, $location, $timeStamp, $message) { + this.id = $id; + this.author = $author; + this.location = $location; + this.timeStamp = $timeStamp; + this.message = $message; + } + /** + * Getter $id + * @return {string} + */ + get $id() { + return this.id; + } + /** + * Getter $author + * @return {IdentityRef} + */ + get $author() { + return this.author; + } + /** + * Getter $location + * @return {string} + */ + get $location() { + return this.location; + } + /** + * Getter $timeStamp + * @return {Date} + */ + get $timeStamp() { + return this.timeStamp; + } + /** + * Getter $message + * @return {string} + */ + get $message() { + return this.message; + } +} +exports.ChangeModel = ChangeModel; +//# sourceMappingURL=ChangeModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js.map new file mode 100644 index 00000000..590feb10 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ChangeModel.js","sourceRoot":"","sources":["ChangeModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,WAAW;IAQtB,YAAY,GAAW,EAAE,OAAoB,EAAE,SAAiB,EAAE,UAAgB,EAAE,QAAgB;QAClG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAvDD,kCAuDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ChangeModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ChangeModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.d.ts new file mode 100644 index 00000000..11185df1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.d.ts @@ -0,0 +1,15 @@ +export declare class IssueModel { + private message; + private issueType; + constructor($issueType: string, $message: string); + /** + * Getter $message + * @return {string} + */ + get $message(): string; + /** + * Getter $issueType + * @return {string} + */ + get $issueType(): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js new file mode 100644 index 00000000..957d866e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IssueModel = void 0; +class IssueModel { + constructor($issueType, $message) { + this.message = $message; + this.issueType = $issueType; + } + /** + * Getter $message + * @return {string} + */ + get $message() { + return this.message; + } + /** + * Getter $issueType + * @return {string} + */ + get $issueType() { + return this.issueType; + } +} +exports.IssueModel = IssueModel; +//# sourceMappingURL=IssueModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js.map new file mode 100644 index 00000000..e1100e93 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IssueModel.js","sourceRoot":"","sources":["IssueModel.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;IAKrB,YAAY,UAAkB,EAAE,QAAgB;QAC9C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAzBD,gCAyBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/IssueModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/IssueModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.d.ts new file mode 100644 index 00000000..c9fd7b75 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.d.ts @@ -0,0 +1,30 @@ +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { TaskModel } from "./TaskModel"; +import { IssueModel } from "./IssueModel"; +export declare class JobModel { + private tasks; + private jobStatus; + private issues; + private jobName; + constructor($jobName: string, $jobStatus: TaskStatus, $issues: IssueModel[], $tasks: TaskModel[]); + /** + * Getter $jobName + * @return {string} + */ + get $jobName(): string; + /** + * Getter $issues + * @return {IssueModel[]} + */ + get $issues(): IssueModel[]; + /** + * Getter $tasks + * @return {TaskModel[]} + */ + get $tasks(): TaskModel[]; + /** + * Getter $jobStatus + * @return {TaskStatus} + */ + get $jobStatus(): TaskStatus; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js new file mode 100644 index 00000000..8c8162b7 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JobModel = void 0; +class JobModel { + constructor($jobName, $jobStatus, $issues, $tasks) { + this.tasks = $tasks; + this.jobStatus = $jobStatus; + this.issues = $issues; + this.jobName = $jobName; + } + /** + * Getter $jobName + * @return {string} + */ + get $jobName() { + return this.jobName; + } + /** + * Getter $issues + * @return {IssueModel[]} + */ + get $issues() { + return this.issues; + } + /** + * Getter $tasks + * @return {TaskModel[]} + */ + get $tasks() { + return this.tasks; + } + /** + * Getter $jobStatus + * @return {TaskStatus} + */ + get $jobStatus() { + return this.jobStatus; + } +} +exports.JobModel = JobModel; +//# sourceMappingURL=JobModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js.map new file mode 100644 index 00000000..600b4903 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"JobModel.js","sourceRoot":"","sources":["JobModel.ts"],"names":[],"mappings":";;;AAIA,MAAa,QAAQ;IAOnB,YAAY,QAAgB,EAAE,UAAsB,EAAE,OAAqB,EAAE,MAAmB;QAC9F,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACD,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;KAGC;IACD,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA7CD,4BA6CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/JobModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/JobModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.d.ts new file mode 100644 index 00000000..d99f19bd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.d.ts @@ -0,0 +1,28 @@ +import { JobModel } from "./JobModel"; +export declare class PhaseModel { + private name; + private jobs; + private status; + private rank; + constructor($name: string, $jobs: JobModel[], $status: string, $rank: number); + /** + * Getter $name + * @return {string} + */ + get $name(): string; + /** + * Getter $jobs + * @return {JobModel[]} + */ + get $jobs(): JobModel[]; + /** + * Getter $status + * @return {string} + */ + get $status(): string; + /** + * Getter $rank + * @return {number} + */ + get $rank(): number; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js new file mode 100644 index 00000000..28608efa --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PhaseModel = void 0; +class PhaseModel { + constructor($name, $jobs, $status, $rank) { + this.name = $name; + this.jobs = $jobs; + this.status = $status; + this.rank = $rank; + } + /** + * Getter $name + * @return {string} + */ + get $name() { + return this.name; + } + /** + * Getter $jobs + * @return {JobModel[]} + */ + get $jobs() { + return this.jobs; + } + /** + * Getter $status + * @return {string} + */ + get $status() { + return this.status; + } + /** + * Getter $rank + * @return {number} + */ + get $rank() { + return this.rank; + } +} +exports.PhaseModel = PhaseModel; +//# sourceMappingURL=PhaseModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js.map new file mode 100644 index 00000000..18d51840 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PhaseModel.js","sourceRoot":"","sources":["PhaseModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAOrB,YAAY,KAAa,EAAE,KAAiB,EAAE,OAAe,EAAE,KAAa;QAC1E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AA7CD,gCA6CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/PhaseModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/PhaseModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.d.ts new file mode 100644 index 00000000..69da9784 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.d.ts @@ -0,0 +1,51 @@ +import { Report } from "./Report"; +import { Artifact, Release, ReleaseEnvironment, ReleaseTask } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { ChangeModel } from "./ChangeModel"; +import { PhaseModel } from "./PhaseModel"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; +export declare class ReleaseReport extends Report { + private artifacts; + private release; + private environment; + private lastCompletedRelease; + private lastCompletedEnvironment; + setReleaseData($release: Release, $environment: ReleaseEnvironment, $lastCompletedRelease: Release, $phases: PhaseModel[], $changes: ChangeModel[], $lastCompletedEnvironment?: ReleaseEnvironment): void; + /** + * Getter $artifacts + * @return {Artifact[]} + */ + get $artifacts(): Artifact[]; + /** + * Getter $release + * @return {Release} + */ + get $release(): Release; + /** + * Getter $environment + * @return {ReleaseEnvironment} + */ + get $environment(): ReleaseEnvironment; + /** + * Getter $lastCompletedRelease + * @return {Release} + */ + get $lastCompletedRelease(): Release; + /** + * Getter $lastCompletedEnvironment + * @return {ReleaseEnvironment} + */ + get $lastCompletedEnvironment(): ReleaseEnvironment; + hasPrevGotSameFailures(): boolean; + hasFailedTasks(): boolean; + hasPrevFailedTasks(): boolean; + arePrevFailedTasksSame(): boolean; + getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; + getEnvironmentStatus(): string; + private hasPartiallySucceededTasks; + hasCanceledPhases(): boolean; + getPipelineViewModel(config: PipelineConfiguration): ReleaseViewModel; + getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; + getReleaseTasks(source: ReleaseEnvironment): ReleaseTask[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js new file mode 100644 index 00000000..6f58a957 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js @@ -0,0 +1,179 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseReport = void 0; +const Report_1 = require("./Report"); +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const PipelineConfiguration_1 = require("../config/pipeline/PipelineConfiguration"); +const ArtifactViewModel_1 = require("./viewmodel/ArtifactViewModel"); +const ReleaseViewModel_1 = require("./viewmodel/ReleaseViewModel"); +const util_1 = require("util"); +class ReleaseReport extends Report_1.Report { + constructor() { + super(...arguments); + this.artifacts = []; + } + setReleaseData($release, $environment, $lastCompletedRelease, $phases, $changes, $lastCompletedEnvironment) { + this.artifacts = $release.artifacts == null ? [] : $release.artifacts; + this.createdBy = $release.createdBy; + this.phases = $phases; + this.associatedChanges = $changes; + this.release = $release; + this.environment = $environment; + this.lastCompletedRelease = $lastCompletedRelease; + if ($lastCompletedEnvironment == null) { + if ($lastCompletedRelease != null && $lastCompletedRelease.environments != null) { + var lastEnvironments = $lastCompletedRelease.environments.filter(e => e.definitionEnvironmentId == $environment.definitionEnvironmentId); + if (lastEnvironments != null && lastEnvironments.length > 0) { + this.lastCompletedEnvironment = lastEnvironments[0]; + } + } + } + else { + this.lastCompletedEnvironment = $lastCompletedEnvironment; + } + } + /** + * Getter $artifacts + * @return {Artifact[]} + */ + get $artifacts() { + return this.artifacts; + } + /** + * Getter $release + * @return {Release} + */ + get $release() { + return this.release; + } + /** + * Getter $environment + * @return {ReleaseEnvironment} + */ + get $environment() { + return this.environment; + } + /** + * Getter $lastCompletedRelease + * @return {Release} + */ + get $lastCompletedRelease() { + return this.lastCompletedRelease; + } + /** + * Getter $lastCompletedEnvironment + * @return {ReleaseEnvironment} + */ + get $lastCompletedEnvironment() { + return this.lastCompletedEnvironment; + } + hasPrevGotSameFailures() { + const lastId = this.lastCompletedRelease == null ? "null" : this.lastCompletedRelease.id; + console.log(`Using Last Completed Release: '${lastId}'`); + if (this.lastCompletedRelease == null || this.$lastCompletedEnvironment == null) { + return false; + } + if (lastId > this.release.id) { + // We are in a situation where current build completed latter compared to the newer one + // Newer one would have already evaluated the failures and sent a mail to committers anyway + // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer + // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line + return true; + } + return null; + } + hasFailedTasks() { + const tasks = this.getReleaseTasks(this.environment); + return tasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed).length > 0; + } + hasPrevFailedTasks() { + const tasks = this.getReleaseTasks(this.lastCompletedEnvironment); + return tasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed).length > 0; + } + arePrevFailedTasksSame() { + const lastTasks = this.getReleaseTasks(this.lastCompletedEnvironment); + const lastFailedTasks = lastTasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed); + var prevfailedTask = lastFailedTasks.length > 0 ? lastFailedTasks[0] : null; + const currentTasks = this.getReleaseTasks(this.environment); + const currentFailedTasks = currentTasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed); + var currfailedTask = currentFailedTasks.length > 0 ? currentFailedTasks[0] : null; + const prevfailedTaskName = prevfailedTask == null ? "" : prevfailedTask.name; + const currfailedTaskName = currfailedTask == null ? "" : currfailedTask.name; + // if both releases failed without executing any tasks, then they can be null + // otherwise, use name matching + return (prevfailedTask == null && currfailedTask == null) || prevfailedTaskName == currfailedTaskName; + } + getPrevConfig(config) { + if (util_1.isNullOrUndefined(this.lastCompletedRelease) || util_1.isNullOrUndefined(this.lastCompletedEnvironment)) { + return null; + } + var prevConfig = new PipelineConfiguration_1.PipelineConfiguration(config.$pipelineType, this.lastCompletedRelease.id, config.$projectId, config.$projectName, this.lastCompletedEnvironment.id, this.lastCompletedEnvironment.definitionEnvironmentId, config.$usePreviousEnvironment, config.$teamUri, config.$accessKey); + return prevConfig; + } + getEnvironmentStatus() { + if (this.hasFailedTasks() || this.hasCanceledPhases()) { + return "Failed"; + } + else if (this.hasPartiallySucceededTasks(this.environment)) { + return "Partially Succeeded"; + } + else { + return "Succeeded"; + } + } + hasPartiallySucceededTasks(source) { + if (source == null) { + return false; + } + const tasks = this.getReleaseTasks(source); + return tasks.filter(t => t.status == ReleaseInterfaces_1.TaskStatus.PartiallySucceeded).length > 0; + } + hasCanceledPhases() { + if (this.phases == null) { + return false; + } + const jobs = []; + this.phases.forEach(p => { + if (p.$jobs != null) { + p.$jobs.forEach(j => { + if (j.$jobStatus == ReleaseInterfaces_1.TaskStatus.Canceled) { + jobs.push(j); + } + }); + } + }); + return jobs.length > 0; + } + getPipelineViewModel(config) { + return new ReleaseViewModel_1.ReleaseViewModel(this.environment, config); + } + getArtifactViewModels(config) { + var artifacts = []; + if (this.artifacts != null && this.artifacts.length > 0) { + this.artifacts.forEach(artifact => { + artifacts.push(new ArtifactViewModel_1.ArtifactViewModel(artifact, config)); + }); + } + return artifacts; + } + getReleaseTasks(source) { + const tasks = []; + if (source != null && source.deploySteps != null && source.deploySteps.length > 0) { + let attempt = 0; + let deploymentAttempt = source.deploySteps[0]; + for (var i = 0; i < source.deploySteps.length; i++) { + if (source.deploySteps[i].attempt > attempt) { + deploymentAttempt = source.deploySteps[i]; + } + } + deploymentAttempt.releaseDeployPhases.forEach(releaseDeployPhase => { + releaseDeployPhase.deploymentJobs.forEach(deploymentJob => { + tasks.push(...deploymentJob.tasks); + }); + }); + } + return tasks; + } +} +exports.ReleaseReport = ReleaseReport; +//# sourceMappingURL=ReleaseReport.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js.map new file mode 100644 index 00000000..f45029cf --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseReport.js","sourceRoot":"","sources":["ReleaseReport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ReleaseReport.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ReleaseReport.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.d.ts new file mode 100644 index 00000000..85204208 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.d.ts @@ -0,0 +1,73 @@ +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +import { ChangeModel } from "./ChangeModel"; +import { PhaseModel } from "./PhaseModel"; +import { TestSummaryGroupModel } from "./testresults/TestSummaryGroupModel"; +import { TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestResultsGroupModel } from "./testresults/TestResultGroupModel"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; +import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; +import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; +export declare abstract class Report { + private dataMissing; + private sendMailConditionSatisfied; + createdBy: IdentityRef; + protected associatedChanges: ChangeModel[]; + protected phases: PhaseModel[]; + private failedTestOwners; + filteredResults: TestResultsGroupModel[]; + hasFilteredTests: boolean; + private testSummaryGroups; + testResultSummary: TestResultSummary; + /** + * Getter $dataMissing + * @return {boolean} + */ + get $dataMissing(): boolean; + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + get $associatedChanges(): ChangeModel[]; + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + get $phases(): PhaseModel[]; + /** + * Getter $sendMailConditionSatisfied + * @return {boolean} + */ + get $sendMailConditionSatisfied(): boolean; + /** + * Setter $dataMissing + * @param {boolean} value + */ + set $dataMissing(value: boolean); + /** + * Setter $sendMailConditionSatisfied + * @param {boolean} value + */ + set $sendMailConditionSatisfied(value: boolean); + /** + * Getter $testSummaryGroups + * @return {TestSummaryGroupModel[]} + */ + get $testSummaryGroups(): TestSummaryGroupModel[]; + /** + * Getter $failedTestOwners + * @return {IdentityRef[] } + */ + get $failedTestOwners(): IdentityRef[]; + abstract hasPrevGotSameFailures(): boolean; + abstract hasFailedTasks(): boolean; + abstract hasPrevFailedTasks(): boolean; + abstract arePrevFailedTasksSame(): boolean; + abstract getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; + abstract getEnvironmentStatus(): string; + abstract getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel | ReleaseViewModel; + abstract getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; + hasFailedTests(includeOthersInTotal: boolean): boolean; + private getTestCountForOutcome; + abstract hasCanceledPhases(): boolean; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js new file mode 100644 index 00000000..acded510 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js @@ -0,0 +1,99 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Report = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const util_1 = require("util"); +class Report { + constructor() { + this.dataMissing = false; + this.sendMailConditionSatisfied = false; + this.associatedChanges = []; + this.phases = []; + this.failedTestOwners = []; + this.filteredResults = []; + this.hasFilteredTests = false; + this.testSummaryGroups = []; + } + /** + * Getter $dataMissing + * @return {boolean} + */ + get $dataMissing() { + return this.dataMissing; + } + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + get $associatedChanges() { + return this.associatedChanges; + } + /** + * Getter $associatedChanges + * @return {ChangeModel[]} + */ + get $phases() { + return this.phases; + } + /** + * Getter $sendMailConditionSatisfied + * @return {boolean} + */ + get $sendMailConditionSatisfied() { + return this.sendMailConditionSatisfied; + } + /** + * Setter $dataMissing + * @param {boolean} value + */ + set $dataMissing(value) { + this.dataMissing = value; + } + /** + * Setter $sendMailConditionSatisfied + * @param {boolean} value + */ + set $sendMailConditionSatisfied(value) { + this.sendMailConditionSatisfied = value; + } + /** + * Getter $testSummaryGroups + * @return {TestSummaryGroupModel[]} + */ + get $testSummaryGroups() { + return this.testSummaryGroups; + } + /** + * Getter $failedTestOwners + * @return {IdentityRef[] } + */ + get $failedTestOwners() { + return this.failedTestOwners; + } + hasFailedTests(includeOthersInTotal) { + if (util_1.isNullOrUndefined(this.testResultSummary)) { + return false; + } + if (!includeOthersInTotal) { + return this.getTestCountForOutcome(TestInterfaces_1.TestOutcome.Failed) > 0; + } + // Others need to be included - Calculate failed as (total - passed) + const passedCount = this.getTestCountForOutcome(TestInterfaces_1.TestOutcome.Passed); + if (passedCount > 0) { + return (this.testResultSummary.aggregatedResultsAnalysis.totalTests - passedCount) > 0; + } + // If no passed tests, then anything ran should be considered as failed since "other" outcomes need to be considered as failures + // if no tests ran, then we don't have failed tests + return this.testResultSummary.aggregatedResultsAnalysis.totalTests > 0; + } + getTestCountForOutcome(outcome) { + const resultsByOutcome = this.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome; + let testsForOutcome = 0; + if (!util_1.isNullOrUndefined(resultsByOutcome) && !util_1.isNullOrUndefined(resultsByOutcome[outcome])) { + testsForOutcome += resultsByOutcome[outcome].count; + } + return testsForOutcome; + } +} +exports.Report = Report; +//# sourceMappingURL=Report.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js.map new file mode 100644 index 00000000..7d2f9b8c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Report.js","sourceRoot":"","sources":["Report.ts"],"names":[],"mappings":";;;AAIA,oFAA6H;AAG7H,+BAAyC;AAKzC,MAAsB,MAAM;IAA5B;QACU,gBAAW,GAAY,KAAK,CAAC;QAE7B,+BAA0B,GAAY,KAAK,CAAC;QAI1C,sBAAiB,GAAkB,EAAE,CAAC;QAEtC,WAAM,GAAiB,EAAE,CAAC;QAE5B,qBAAgB,GAAkB,EAAE,CAAC;QAEtC,oBAAe,GAA4B,EAAE,CAAC;QAE9C,qBAAgB,GAAY,KAAK,CAAC;QAEjC,sBAAiB,GAA4B,EAAE,CAAC;IAqH1D,CAAC;IAjHC;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;IAGA;IACA,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B;QACpC,OAAO,IAAI,CAAC,0BAA0B,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B,CAAC,KAAc;QACnD,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAGD;;;OAGG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAkBM,cAAc,CAAC,oBAA6B;QACjD,IAAI,wBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;YAC7C,OAAO,KAAK,CAAC;SACd;QAED,IAAI,CAAC,oBAAoB,EAAE;YACzB,OAAO,IAAI,CAAC,sBAAsB,CAAC,4BAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC5D;QAED,oEAAoE;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,WAAW,GAAG,CAAC,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;SACxF;QAED,gIAAgI;QAChI,oDAAoD;QACpD,OAAO,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,UAAU,GAAG,CAAC,CAAC;IACzE,CAAC;IAEO,sBAAsB,CAAC,OAAoB;QACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;QAEzF,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE;YACzF,eAAe,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;SACpD;QAED,OAAO,eAAe,CAAC;IAC3B,CAAC;CAGF;AAtID,wBAsIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/Report.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/Report.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.d.ts new file mode 100644 index 00000000..f8335f5d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.d.ts @@ -0,0 +1,9 @@ +import { ReleaseReport } from "./ReleaseReport"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { Report } from "./Report"; +import { BuildReport } from "./BuildReport"; +export declare class ReportFactory { + static createNewReport(pipelineConfig: PipelineConfiguration): ReleaseReport | BuildReport; + static mergeReports(reports: Report[]): Report; + private static mergeTwoReports; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js new file mode 100644 index 00000000..1d372832 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportFactory = void 0; +const ReleaseReport_1 = require("./ReleaseReport"); +const PipelineType_1 = require("../config/pipeline/PipelineType"); +const BuildReport_1 = require("./BuildReport"); +class ReportFactory { + static createNewReport(pipelineConfig) { + return (pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build) ? new BuildReport_1.BuildReport() : new ReleaseReport_1.ReleaseReport(); + } + static mergeReports(reports) { + if (reports == null || reports.length == 0) + return null; + if (reports.length == 1) + return reports[0]; + let finalReport = reports[0]; + for (var i = 1; i < reports.length; i++) { + finalReport = ReportFactory.mergeTwoReports(finalReport, reports[i]); + } + return finalReport; + } + static mergeTwoReports(source, target) { + let associatedChanges = []; + let phases = []; + if (target.$testSummaryGroups != null) { + source.$testSummaryGroups.push(...target.$testSummaryGroups); + } + if (target.$associatedChanges != null) { + associatedChanges = target.$associatedChanges; + } + if (target.$failedTestOwners != null) { + source.$failedTestOwners.push(...target.$failedTestOwners); + } + if (target.filteredResults != null) { + source.filteredResults = target.filteredResults; + } + if (target.hasFilteredTests) { + source.hasFilteredTests = target.hasFilteredTests; + } + if (target.testResultSummary != null) { + source.testResultSummary = target.testResultSummary; + } + if (target.$phases != null) { + phases = target.$phases; + } + if (source instanceof ReleaseReport_1.ReleaseReport) { + var releaseTarget = target; + var releaseSource = source; + let targetRelease = null; + let targetEnv = null; + let targetLastRelease = null; + let targetLastEnv = null; + if (releaseTarget.$release != null) { + targetRelease = releaseTarget.$release; + } + if (releaseTarget.$environment != null) { + targetEnv = releaseTarget.$environment; + } + if (releaseTarget.$lastCompletedEnvironment != null) { + targetLastRelease = releaseTarget.$lastCompletedRelease; + } + if (releaseTarget.$lastCompletedEnvironment != null) { + targetLastEnv = releaseTarget.$lastCompletedEnvironment; + } + if (targetRelease != null) { + releaseSource.setReleaseData(targetRelease, targetEnv, targetLastRelease, phases, associatedChanges, targetLastEnv); + } + } + return source; + } +} +exports.ReportFactory = ReportFactory; +//# sourceMappingURL=ReportFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js.map new file mode 100644 index 00000000..46ca8c40 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportFactory.js","sourceRoot":"","sources":["ReportFactory.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ReportFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/ReportFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.d.ts new file mode 100644 index 00000000..38981545 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.d.ts @@ -0,0 +1,41 @@ +import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { IssueModel } from "./IssueModel"; +export declare class TaskModel { + private name; + private status; + private issues; + private agentName; + private finishTime; + private startTime; + constructor($name: string, $status: TaskStatus, $issues: IssueModel[], $agentName: string, $finishTime: Date, $startTime: Date); + /** + * Getter $name + * @return {string} + */ + get $name(): string; + /** + * Getter $status + * @return {TaskStatus} + */ + get $status(): TaskStatus; + /** + * Getter $issues + * @return {IssueModel[]} + */ + get $issues(): IssueModel[]; + /** + * Getter $agentName + * @return {string} + */ + get $agentName(): string; + /** + * Getter $finishTime + * @return {Date} + */ + get $finishTime(): Date; + /** + * Getter $startTime + * @return {Date} + */ + get $startTime(): Date; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js new file mode 100644 index 00000000..0e7a9d5c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskModel = void 0; +class TaskModel { + constructor($name, $status, $issues, $agentName, $finishTime, $startTime) { + this.name = $name; + this.status = $status; + this.issues = $issues; + this.agentName = $agentName; + this.finishTime = $finishTime; + this.startTime = $startTime; + } + /** + * Getter $name + * @return {string} + */ + get $name() { + return this.name; + } + /** + * Getter $status + * @return {TaskStatus} + */ + get $status() { + return this.status; + } + /** + * Getter $issues + * @return {IssueModel[]} + */ + get $issues() { + return this.issues; + } + /** + * Getter $agentName + * @return {string} + */ + get $agentName() { + return this.agentName; + } + /** + * Getter $finishTime + * @return {Date} + */ + get $finishTime() { + return this.finishTime; + } + /** + * Getter $startTime + * @return {Date} + */ + get $startTime() { + return this.startTime; + } +} +exports.TaskModel = TaskModel; +//# sourceMappingURL=TaskModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js.map new file mode 100644 index 00000000..de1c9842 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskModel.js","sourceRoot":"","sources":["TaskModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,SAAS;IASpB,YAAY,KAAa,EAAE,OAAmB,EAAE,OAAqB,EAAE,UAAkB,EAAE,WAAiB,EAAE,UAAgB;QAC5H,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAjED,8BAiEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/TaskModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/TaskModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.d.ts new file mode 100644 index 00000000..72d5f999 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.d.ts @@ -0,0 +1,28 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestCaseResult } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class LinkHelper { + private static readonly TcmPipelineExtension; + private static readonly ReleaseProgressView; + private static readonly ReleaseDefView; + private static readonly ReleaseEnvironmentExtension; + private static readonly ReleaseEnvironmentLogsExtension; + private static readonly ReleaseLinkTestExtensionId; + private static readonly WorkItemPipelineExtension; + private static readonly BuildPipelineExtension; + static getBuildDefinitionLinkById(definitionId: any, config: PipelineConfiguration): string; + private static getBuildLink; + static getCommitLink(changeId: string, changeUri: string, config: PipelineConfiguration): string; + static getCreateBugLinkForTest(config: PipelineConfiguration, testResult: TestCaseResult): string; + static getQueryParameter(parameterValues: Map): string; + static getReleaseDefinitionLink(config: PipelineConfiguration, releaseDefinitionId: number): string; + static getReleaseLogsTabLink(config: PipelineConfiguration): string; + static getReleaseSummaryLink(config: PipelineConfiguration): string; + static getTestResultLink(config: PipelineConfiguration, runId: string, resultId: number, queryParams?: Map): string; + static getTestTabLinkInRelease(config: PipelineConfiguration): string; + static getWorkItemLink(config: PipelineConfiguration, workItemId: number): string; + private static getBuildRelativeUrl; + static getTestTabLinkInBuild(config: PipelineConfiguration): string; + private static getTcmRelativeUrl; + private static getWorkItemRelativeUrl; + static getTestTabLink(pipelineConfiguration: PipelineConfiguration): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js new file mode 100644 index 00000000..df8c399f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js @@ -0,0 +1,125 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LinkHelper = void 0; +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +class LinkHelper { + static getBuildDefinitionLinkById(definitionId, config) { + var collectionUri = config.$teamUri; + var parameters = new Map(); + parameters.set("definitionId", definitionId.toString()); + parameters.set("_a", "summary"); + var uri = this.getBuildLink(config, collectionUri, parameters); + return uri; + } + static getBuildLink(config, collectionUri, parameters) { + return collectionUri + "/" + this.getBuildRelativeUrl(config.$projectName) + "/results" + this.getQueryParameter(parameters); + } + static getCommitLink(changeId, changeUri, config) { + var collectionUri = config.$teamUri; + let repoId = null; + var pos = changeUri.indexOf("repositories"); + if (pos > 0) { + repoId = changeUri.substr(pos).split("/")[1]; + } + var uri = collectionUri + `/${config.$projectName}/_git/${repoId}/commit/${changeId})`; + return uri; + } + static getCreateBugLinkForTest(config, testResult) { + const testRunId = testResult.testRun == null ? null : testResult.testRun.id; + const parameters = new Map(); + parameters.set("create-bug", "true"); + return LinkHelper.getTestResultLink(config, testRunId, testResult.id, parameters); + } + static getQueryParameter(parameterValues) { + var queryString = ""; + parameterValues.forEach((value, key) => { + queryString = (queryString == "") + ? "?" + key + "=" + value + : queryString + "&" + key + "=" + value; + }); + return queryString; + } + static getReleaseDefinitionLink(config, releaseDefinitionId) { + var collectionUri = config.$teamUri; + const parameters = new Map(); + parameters.set("definitionId", releaseDefinitionId.toString()); + parameters.set("_a", "environments-editor"); + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseDefView + "/" + LinkHelper.getQueryParameter(parameters); + } + static getReleaseLogsTabLink(config) { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + queryParams.set("_a", LinkHelper.ReleaseEnvironmentLogsExtension); + queryParams.set("environmentId", config.$environmentId.toString()); + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + static getReleaseSummaryLink(config) { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + static getTestResultLink(config, runId, resultId, queryParams) { + var collectionUri = config.$teamUri; + const parameters = new Map(); + parameters.set("runId", runId); + parameters.set("_a", "resultSummary"); + parameters.set("resultId", resultId.toString()); + if (queryParams != null) { + queryParams.forEach((value, key) => { + 6; + parameters.set(key, value); + }); + } + return collectionUri + "\\" + LinkHelper.getTcmRelativeUrl(config.$projectName) + "\\" + LinkHelper.getQueryParameter(parameters); + } + static getTestTabLinkInRelease(config) { + var collectionUri = config.$teamUri; + const queryParams = new Map(); + queryParams.set("releaseId", config.$pipelineId.toString()); + queryParams.set("_a", LinkHelper.ReleaseEnvironmentExtension); + queryParams.set("environmentId", config.$environmentId.toString()); + queryParams.set("extensionId", LinkHelper.ReleaseLinkTestExtensionId); + return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); + } + static getWorkItemLink(config, workItemId) { + const queryParams = new Map(); + queryParams.set("id", workItemId.toString()); + return config.$teamUri + "/" + LinkHelper.getWorkItemRelativeUrl(config.$projectName) + "/" + LinkHelper.getQueryParameter(queryParams); + } + static getBuildRelativeUrl(projectName) { + return projectName + "/" + LinkHelper.BuildPipelineExtension; + } + static getTestTabLinkInBuild(config) { + var collectionUri = config.$teamUri; + var parameters = new Map([ + ["buildId", config.$pipelineId.toString()], + ["view", "ms.vss-test-web.build-test-results-tab"] + ]); + var uri = this.getBuildLink(config, collectionUri, parameters); + return uri; + } + static getTcmRelativeUrl(projectName) { + return projectName + "/" + LinkHelper.TcmPipelineExtension; + } + static getWorkItemRelativeUrl(projectName) { + return projectName + "/" + LinkHelper.WorkItemPipelineExtension; + } + static getTestTabLink(pipelineConfiguration) { + return pipelineConfiguration.$pipelineType == PipelineType_1.PipelineType.Release ? + this.getTestTabLinkInRelease(pipelineConfiguration) : + this.getTestTabLinkInBuild(pipelineConfiguration); + } +} +exports.LinkHelper = LinkHelper; +LinkHelper.TcmPipelineExtension = "_TestManagement/Runs"; +// Release related strings +LinkHelper.ReleaseProgressView = "_releaseProgress"; +LinkHelper.ReleaseDefView = "_releaseDefinition"; +LinkHelper.ReleaseEnvironmentExtension = "release-environment-extension"; +LinkHelper.ReleaseEnvironmentLogsExtension = "release-environment-logs"; +LinkHelper.ReleaseLinkTestExtensionId = "ms.vss-test-web.test-result-in-release-environment-editor-tab"; +LinkHelper.WorkItemPipelineExtension = "_workitems"; +LinkHelper.BuildPipelineExtension = "_build"; +//# sourceMappingURL=LinkHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js.map new file mode 100644 index 00000000..bec637f7 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"LinkHelper.js","sourceRoot":"","sources":["LinkHelper.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/LinkHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/LinkHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.d.ts new file mode 100644 index 00000000..0173bac6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.d.ts @@ -0,0 +1,10 @@ +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; +export declare class TestResultsHelper { + static readonly PercentagePrecision = 2; + static getTestOutcomePercentage(testCountForOutcome: number, totalTests: number): number; + private static getCustomizedDecimalValue; + static getTestOutcomePercentageString(testCountForOutcome: number, totalTests: number): string; + static getTotalTestCountBasedOnUserConfiguration(testCountsByOutcome: Map, includeOthersInTotal: boolean): number; + static getTotalTestCountBasedOnUserConfigurationPriority(testCountsByOutcome: Map, includeOthersInTotal: boolean): number; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js new file mode 100644 index 00000000..ffb3f0a9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js @@ -0,0 +1,48 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsHelper = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TestOutcomeForPriority_1 = require("../testresults/TestOutcomeForPriority"); +class TestResultsHelper { + static getTestOutcomePercentage(testCountForOutcome, totalTests) { + if (totalTests == 0) { + console.log("Total Test count is 0. Setting outcome percentage to 0"); + } + let testOutcomePercentage = totalTests == 0 ? + 0 : + testCountForOutcome / totalTests * 100; + return TestResultsHelper.getCustomizedDecimalValue(testOutcomePercentage); + } + static getCustomizedDecimalValue(value) { + var fixedValue = Math.pow(10, TestResultsHelper.PercentagePrecision); + return ((Math.floor(value * fixedValue)) / fixedValue); + } + static getTestOutcomePercentageString(testCountForOutcome, totalTests) { + return this.getTestOutcomePercentage(testCountForOutcome, totalTests) + "%"; + } + static getTotalTestCountBasedOnUserConfiguration(testCountsByOutcome, includeOthersInTotal) { + var totalTests = 0; + testCountsByOutcome.forEach((testCount, testOutcome) => { + var isPassedTest = testOutcome == TestInterfaces_1.TestOutcome.Passed; + var isFailedTest = testOutcome == TestInterfaces_1.TestOutcome.Failed; + if (isPassedTest || isFailedTest || includeOthersInTotal) { + totalTests += testCount; + } + }); + return totalTests; + } + static getTotalTestCountBasedOnUserConfigurationPriority(testCountsByOutcome, includeOthersInTotal) { + var totalTests = 0; + testCountsByOutcome.forEach((testCount, testOutcome) => { + var isPassedTest = testOutcome == TestOutcomeForPriority_1.TestOutcomeForPriority.Passed; + var isFailedTest = testOutcome == TestOutcomeForPriority_1.TestOutcomeForPriority.Failed; + if (isPassedTest || isFailedTest || includeOthersInTotal) { + totalTests += testCount; + } + }); + return totalTests; + } +} +exports.TestResultsHelper = TestResultsHelper; +TestResultsHelper.PercentagePrecision = 2; +//# sourceMappingURL=TestResultsHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js.map new file mode 100644 index 00000000..f0422c22 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultsHelper.js","sourceRoot":"","sources":["TestResultsHelper.ts"],"names":[],"mappings":";;;AAAA,oFAA8E;AAC9E,kFAA+E;AAE/E,MAAa,iBAAiB;IAGrB,MAAM,CAAC,wBAAwB,CAAC,mBAA2B,EAAE,UAAkB;QACpF,IAAI,UAAU,IAAI,CAAC,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;SACvE;QAED,IAAI,qBAAqB,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,mBAAmB,GAAG,UAAU,GAAG,GAAG,CAAC;QAEzC,OAAO,iBAAiB,CAAC,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAEO,MAAM,CAAC,yBAAyB,CAAC,KAAa;QACpD,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;IACzD,CAAC;IAEM,MAAM,CAAC,8BAA8B,CAAC,mBAA2B,EAAE,UAAkB;QAC1F,OAAO,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC;IAC9E,CAAC;IAEM,MAAM,CAAC,yCAAyC,CACrD,mBAA6C,EAC7C,oBAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,WAAwB,EAAE,EAAE;YAC1E,IAAI,YAAY,GAAG,WAAW,IAAI,4BAAW,CAAC,MAAM,CAAC;YACrD,IAAI,YAAY,GAAG,WAAW,IAAI,4BAAW,CAAC,MAAM,CAAC;YAErD,IAAI,YAAY,IAAI,YAAY,IAAI,oBAAoB,EAAE;gBACxD,UAAU,IAAI,SAAS,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,MAAM,CAAC,iDAAiD,CAC7D,mBAAwD,EACxD,oBAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,WAAmC,EAAE,EAAE;YACrF,IAAI,YAAY,GAAG,WAAW,IAAI,+CAAsB,CAAC,MAAM,CAAC;YAChE,IAAI,YAAY,GAAG,WAAW,IAAI,+CAAsB,CAAC,MAAM,CAAC;YAEhE,IAAI,YAAY,IAAI,YAAY,IAAI,oBAAoB,EAAE;gBACxD,UAAU,IAAI,SAAS,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;;AAxDH,8CAyDC;AAxDwB,qCAAmB,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/TestResultsHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/TestResultsHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.d.ts new file mode 100644 index 00000000..c4e88503 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.d.ts @@ -0,0 +1,7 @@ +export declare class TimeFormatter { + static ConvertTimeStringToMilliSeconds(duration: string): number; + static FormatDuration(timeInMilliseconds: number): string; + static FormatDurationStr(timeStr: string): string; + private static getCombinedTimeString; + private static getTimeUnitString; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js new file mode 100644 index 00000000..d7b813fc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js @@ -0,0 +1,79 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TimeFormatter = void 0; +const util_1 = require("util"); +class TimeFormatter { + static ConvertTimeStringToMilliSeconds(duration) { + const timeSpanArray = duration.split("."); + let durationNum = 0; + let hmsIndex = 0; + if (timeSpanArray.length > 3) { + console.warn("cannot format time duration"); + return 0; + } + else if (timeSpanArray.length == 3) { + // Eg: 1.03:04:05.567 = 1 day, 3 hours, 4 min, 5 seconds and 567 ms. + // Days to ms + durationNum += Number(timeSpanArray[0]) * 24 * 3600; + hmsIndex = 1; + } + let timeStrArray = timeSpanArray[hmsIndex].split(":"); + if (timeStrArray.length != 3) { + console.warn("cannot format time duration properly. test run duration will not be accurate"); + } + else { + durationNum += Number(timeStrArray[2]); // secs + durationNum += Number(timeStrArray[1]) * 60; // mins to secs + durationNum += Number(timeStrArray[0]) * 3600; // hours to secs + } + return durationNum * 1000; + } + static FormatDuration(timeInMilliseconds) { + let timeStr = ""; + // 1- Convert to seconds: + var seconds = timeInMilliseconds / 1000; + // 2- Extract hours: + var hours = Math.round(seconds / 3600); // 3,600 seconds in 1 hour + seconds = seconds % 3600; // seconds remaining after extracting hours + // 3- Extract minutes: + var minutes = Math.round(seconds / 60); // 60 seconds in 1 minute + // 4- Keep only seconds not extracted to minutes: + seconds = seconds % 60; + seconds = Math.round(seconds); + if (minutes == 60) { + hours += 1; + minutes = 0; + } + return this.getCombinedTimeString(hours, minutes, seconds); + } + static FormatDurationStr(timeStr) { + let resultStr = ""; + if (!util_1.isNullOrUndefined(timeStr)) { + // strip off milliseconds if any, and then split into hh:mm:ss + const timeStrArray = timeStr.split(".")[0].split(":"); + if (timeStrArray.length != 3) { + // not supported + return timeStr; + } + // 1- Convert to seconds: + var seconds = Math.round(Number.parseInt(timeStrArray[2])); + var minutes = Math.round(Number.parseInt(timeStrArray[1])); + var hours = Math.round(Number.parseInt(timeStrArray[0])); + resultStr = this.getCombinedTimeString(hours, minutes, seconds); + } + return resultStr; + } + static getCombinedTimeString(hours, minutes, seconds) { + let timeStr = ""; + timeStr += this.getTimeUnitString(hours, "h"); + timeStr += this.getTimeUnitString(minutes, "m"); + timeStr += this.getTimeUnitString(seconds, "s"); + timeStr = timeStr.trim(); + return (timeStr == "" ? "0s" : timeStr); + } + static getTimeUnitString(timeUnit, suffix) { + return timeUnit < 1 ? "" : timeUnit + suffix + " "; + } +} +exports.TimeFormatter = TimeFormatter; +//# sourceMappingURL=TimeFormatter.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js.map new file mode 100644 index 00000000..f96973ac --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TimeFormatter.js","sourceRoot":"","sources":["TimeFormatter.ts"],"names":[],"mappings":";;;AAAA,+BAAyC;AAEzC,MAAa,aAAa;IACxB,MAAM,CAAC,+BAA+B,CAAC,QAAgB;QACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,WAAW,GAAW,CAAC,CAAC;QAE5B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC5C,OAAO,CAAC,CAAC;SACV;aAAM,IAAG,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE;YACnC,qEAAqE;YACrE,aAAa;YACb,WAAW,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACpD,QAAQ,GAAG,CAAC,CAAC;SACd;QAED,IAAI,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEtD,IAAG,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;SAC9F;aAAM;YACL,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;YAC/C,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe;YAC5D,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;SAChE;QACD,OAAO,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,kBAA0B;QACrD,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,yBAAyB;QACzB,IAAI,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAAC;QACxC,oBAAoB;QACpB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,0BAA0B;QAClE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,2CAA2C;QACrE,sBAAsB;QACtB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,yBAAyB;QACjE,iDAAiD;QACjD,OAAO,GAAG,OAAO,GAAG,EAAE,CAAC;QACvB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAG,OAAO,IAAI,EAAE,EAAE;YAChB,KAAK,IAAI,CAAC,CAAC;YACX,OAAO,GAAG,CAAC,CAAC;SACb;QACD,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAEM,MAAM,CAAC,iBAAiB,CAAC,OAAe;QAC7C,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,wBAAiB,CAAC,OAAO,CAAC,EAAE;YAC/B,8DAA8D;YAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;gBAC5B,gBAAgB;gBAChB,OAAO,OAAO,CAAC;aAChB;YAED,yBAAyB;YACzB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzD,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACjE;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,KAAa,EAAE,OAAe,EAAE,OAAe;QAClF,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAEzB,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,QAAgB,EAAE,MAAc;QAC/D,OAAO,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC;IACrD,CAAC;CACF;AAjFD,sCAiFC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/TimeFormatter.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/helpers/TimeFormatter.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.d.ts new file mode 100644 index 00000000..c2dbc46e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.d.ts @@ -0,0 +1,7 @@ +export declare enum TestOutcomeForPriority { + Failed = 0, + Inconclusive = 1, + NotExecuted = 2, + Passed = 3, + Other = 4 +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js new file mode 100644 index 00000000..5677cc8c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestOutcomeForPriority = void 0; +var TestOutcomeForPriority; +(function (TestOutcomeForPriority) { + TestOutcomeForPriority[TestOutcomeForPriority["Failed"] = 0] = "Failed"; + TestOutcomeForPriority[TestOutcomeForPriority["Inconclusive"] = 1] = "Inconclusive"; + TestOutcomeForPriority[TestOutcomeForPriority["NotExecuted"] = 2] = "NotExecuted"; + TestOutcomeForPriority[TestOutcomeForPriority["Passed"] = 3] = "Passed"; + TestOutcomeForPriority[TestOutcomeForPriority["Other"] = 4] = "Other"; +})(TestOutcomeForPriority = exports.TestOutcomeForPriority || (exports.TestOutcomeForPriority = {})); +//# sourceMappingURL=TestOutcomeForPriority.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js.map new file mode 100644 index 00000000..d6f1e5c2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestOutcomeForPriority.js","sourceRoot":"","sources":["TestOutcomeForPriority.ts"],"names":[],"mappings":";;;AAAA,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,uEAAM,CAAA;IACN,mFAAY,CAAA;IACZ,iFAAW,CAAA;IACX,uEAAM,CAAA;IACN,qEAAK,CAAA;AACP,CAAC,EANW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAMjC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.d.ts new file mode 100644 index 00000000..097ec84b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.d.ts @@ -0,0 +1,6 @@ +import { TestResultModel } from "./TestResultModel"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultsGroupModel { + groupName: string; + testResults: Map; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js new file mode 100644 index 00000000..9625859d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsGroupModel = void 0; +class TestResultsGroupModel { + constructor() { + this.testResults = new Map(); + } +} +exports.TestResultsGroupModel = TestResultsGroupModel; +//# sourceMappingURL=TestResultGroupModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js.map new file mode 100644 index 00000000..f04389a5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultGroupModel.js","sourceRoot":"","sources":["TestResultGroupModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAAlC;QAGS,gBAAW,GAAwC,IAAI,GAAG,EAAkC,CAAC;IACtG,CAAC;CAAA;AAJD,sDAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestResultGroupModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestResultGroupModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.d.ts new file mode 100644 index 00000000..ed658c8d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.d.ts @@ -0,0 +1,7 @@ +import { TestCaseResult, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +export declare class TestResultModel { + testResult: TestCaseResult; + associatedBugRefs: WorkItemReference[]; + associatedBugs: WorkItem[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js new file mode 100644 index 00000000..4062bcef --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultModel = void 0; +class TestResultModel { + constructor() { + this.associatedBugRefs = []; + this.associatedBugs = []; + } +} +exports.TestResultModel = TestResultModel; +//# sourceMappingURL=TestResultModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js.map new file mode 100644 index 00000000..2131536d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultModel.js","sourceRoot":"","sources":["TestResultModel.ts"],"names":[],"mappings":";;;AAIA,MAAa,eAAe;IAA5B;QAES,sBAAiB,GAAwB,EAAE,CAAC;QAC5C,mBAAc,GAAe,EAAE,CAAC;IACzC,CAAC;CAAA;AAJD,0CAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestResultModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestResultModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.d.ts new file mode 100644 index 00000000..d75cd7ec --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.d.ts @@ -0,0 +1,6 @@ +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +import { TestSummaryItemModel } from "./TestSummaryItemModel"; +export declare class TestSummaryGroupModel { + groupedBy: GroupTestResultsBy; + runs: TestSummaryItemModel[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js new file mode 100644 index 00000000..957749b7 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryGroupModel = void 0; +class TestSummaryGroupModel { + constructor() { + this.runs = []; + } +} +exports.TestSummaryGroupModel = TestSummaryGroupModel; +//# sourceMappingURL=TestSummaryGroupModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js.map new file mode 100644 index 00000000..4b893cd0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryGroupModel.js","sourceRoot":"","sources":["TestSummaryGroupModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAAlC;QAIS,SAAI,GAA2B,EAAE,CAAC;IAC3C,CAAC;CAAA;AALD,sDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.d.ts new file mode 100644 index 00000000..d9a886e1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.d.ts @@ -0,0 +1,55 @@ +import { TestOutcomeForPriority } from "./TestOutcomeForPriority"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestSummaryItemModel { + private name; + private id; + private totalTestCount; + private testCountByOutcome; + private testCountForOutcomeByPriority; + private duration; + constructor($name: string, $id: string); + /** + * Getter $name + * @return {string} + */ + get $name(): string; + /** + * Getter $id + * @return {string} + */ + get $id(): string; + /** + * Getter $totalTestCount + * @return {number} + */ + get $totalTestCount(): number; + /** + * Getter $testCountByOutcome + * @return {Map} + */ + get $testCountByOutcome(): Map; + /** + * Getter $testCountForOutcomeByPriority + * @return {Map} + */ + get $testCountForOutcomeByPriority(): Map>; + /** + * Getter $duration + * @return {any} + */ + get $duration(): number; + /** + * Setter $totalTestCount + * @param {number} value + */ + set $totalTestCount(value: number); + /** + * Setter $duration + * @param {any} value + */ + set $duration(value: number); + getFailedTestsCount(): number; + getOtherTestsCount(): number; + getPassedTestsCount(): number; + private getTestOutcomeCount; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js new file mode 100644 index 00000000..6fc6b60f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js @@ -0,0 +1,91 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryItemModel = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +class TestSummaryItemModel { + constructor($name, $id) { + this.name = $name; + this.id = $id; + this.testCountByOutcome = new Map(); + this.testCountForOutcomeByPriority = new Map(); + } + /** + * Getter $name + * @return {string} + */ + get $name() { + return this.name; + } + /** + * Getter $id + * @return {string} + */ + get $id() { + return this.id; + } + /** + * Getter $totalTestCount + * @return {number} + */ + get $totalTestCount() { + return this.totalTestCount; + } + /** + * Getter $testCountByOutcome + * @return {Map} + */ + get $testCountByOutcome() { + return this.testCountByOutcome; + } + /** + * Getter $testCountForOutcomeByPriority + * @return {Map} + */ + get $testCountForOutcomeByPriority() { + return this.testCountForOutcomeByPriority; + } + /** + * Getter $duration + * @return {any} + */ + get $duration() { + return this.duration; + } + /** + * Setter $totalTestCount + * @param {number} value + */ + set $totalTestCount(value) { + this.totalTestCount = value; + } + /** + * Setter $duration + * @param {any} value + */ + set $duration(value) { + this.duration = value; + } + getFailedTestsCount() { + return this.getTestOutcomeCount(TestInterfaces_1.TestOutcome.Failed); + } + getOtherTestsCount() { + let totalCount = 0; + this.testCountByOutcome.forEach((value, key) => { + if (key != TestInterfaces_1.TestOutcome.Passed && key != TestInterfaces_1.TestOutcome.Failed) { + totalCount += value; + } + }); + return totalCount; + } + getPassedTestsCount() { + return this.getTestOutcomeCount(TestInterfaces_1.TestOutcome.Passed); + } + getTestOutcomeCount(testOutcome) { + if (this.testCountByOutcome.has(testOutcome)) { + return this.testCountByOutcome.get(testOutcome); + } + return 0; + } +} +exports.TestSummaryItemModel = TestSummaryItemModel; +//# sourceMappingURL=TestSummaryItemModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js.map new file mode 100644 index 00000000..a7c29bfd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryItemModel.js","sourceRoot":"","sources":["TestSummaryItemModel.ts"],"names":[],"mappings":";;;AACA,oFAA8E;AAE9E,MAAa,oBAAoB;IAQ/B,YAAY,KAAa,EAAE,GAAW;QACpC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;QACzD,IAAI,CAAC,6BAA6B,GAAG,IAAI,GAAG,EAA+C,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,8BAA8B;QACvC,OAAO,IAAI,CAAC,6BAA6B,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAGD;;;OAGG;IACH,IAAW,eAAe,CAAC,KAAa;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS,CAAC,KAAa;QAChC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEM,kBAAkB;QACvB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,GAAgB,EAAE,EAAE;YAClE,IAAI,GAAG,IAAI,4BAAW,CAAC,MAAM,IAAI,GAAG,IAAI,4BAAW,CAAC,MAAM,EAAE;gBAC1D,UAAU,IAAI,KAAK,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEO,mBAAmB,CAAC,WAAwB;QAClD,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;SACjD;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAxGD,oDAwGC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.d.ts new file mode 100644 index 00000000..54340d1d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.d.ts @@ -0,0 +1,15 @@ +import { Artifact } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export declare class ArtifactViewModelWrapper { + ArtifactViewModel: ArtifactViewModel[]; +} +export declare class ArtifactViewModel { + ArtifactDefinitionUrl: string; + BranchName: string; + BuildSummaryUrl: string; + Name: string; + Version: string; + IsPrimary: boolean; + constructor(artifact: Artifact, config: PipelineConfiguration); + private getArtifactInfo; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js new file mode 100644 index 00000000..999dcd2a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ArtifactViewModel = exports.ArtifactViewModelWrapper = void 0; +const util_1 = require("util"); +class ArtifactViewModelWrapper { +} +exports.ArtifactViewModelWrapper = ArtifactViewModelWrapper; +class ArtifactViewModel { + constructor(artifact, config) { + this.Version = this.getArtifactInfo(artifact, "version"); + this.BranchName = this.getArtifactInfo(artifact, "branch"); + this.Name = artifact.alias; + this.IsPrimary = artifact.isPrimary; + if (!util_1.isNullOrUndefined(artifact.definitionReference)) { + if (!util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl) && + !util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl.id)) { + this.ArtifactDefinitionUrl = artifact.definitionReference.artifactSourceDefinitionUrl.id; + } + if (!util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl) && + !util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl.id)) { + this.BuildSummaryUrl = artifact.definitionReference.artifactSourceVersionUrl.id; + } + } + } + getArtifactInfo(artifact, key) { + const sourceRef = artifact.definitionReference[key]; + return util_1.isNullOrUndefined(sourceRef) ? null : sourceRef.name; + } +} +exports.ArtifactViewModel = ArtifactViewModel; +//# sourceMappingURL=ArtifactViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js.map new file mode 100644 index 00000000..d26a37f4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ArtifactViewModel.js","sourceRoot":"","sources":["ArtifactViewModel.ts"],"names":[],"mappings":";;;AAEA,+BAAyC;AAGzC,MAAa,wBAAwB;CAEpC;AAFD,4DAEC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,QAAkB,EAAE,MAA6B;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;YACpD,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC;gBAC9E,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,CAAC,EAAE;gBACjF,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,CAAC;aAC1F;YAED,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC;gBAC3E,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE;gBAC9E,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,CAAC;aACjF;SACF;IACH,CAAC;IAEO,eAAe,CAAC,QAAkB,EAAE,GAAW;QACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,wBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IAC9D,CAAC;CACF;AA/BD,8CA+BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.d.ts new file mode 100644 index 00000000..ec082909 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.d.ts @@ -0,0 +1,11 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { BuildReference, Build } from "azure-devops-node-api/interfaces/BuildInterfaces"; +export declare class BuildReferenceViewModel { + Id: string; + Number: string; + Branch: string; + Url: string; + DefinitionUrl: string; + DefinitionName: string; + constructor(config: PipelineConfiguration, buildReference: BuildReference, build: Build); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js new file mode 100644 index 00000000..68ee5557 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildReferenceViewModel = void 0; +const LinkHelper_1 = require("../helpers/LinkHelper"); +const util_1 = require("util"); +class BuildReferenceViewModel { + constructor(config, buildReference, build) { + if (buildReference != null) { + this.Id = buildReference.id.toString(); + this.Number = buildReference.buildNumber; + if (!util_1.isNullOrUndefined(buildReference._links) && !util_1.isNullOrUndefined(buildReference._links.web) && !util_1.isNullOrUndefined(buildReference._links.web.href)) { + this.Url = buildReference._links.web.href; + } + } + else if (build != null) { + this.Id = build.id.toString(); + this.Number = build.buildNumber; + this.Branch = build.sourceBranch; + if (!util_1.isNullOrUndefined(build._links) && !util_1.isNullOrUndefined(build._links.web) && !util_1.isNullOrUndefined(build._links.web.href)) { + this.Url = build._links.web.href; + } + this.DefinitionUrl = LinkHelper_1.LinkHelper.getBuildDefinitionLinkById(build.definition.id, config); + this.DefinitionName = build.definition.name; + } + } +} +exports.BuildReferenceViewModel = BuildReferenceViewModel; +//# sourceMappingURL=BuildReferenceViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js.map new file mode 100644 index 00000000..88ab2f9d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildReferenceViewModel.js","sourceRoot":"","sources":["BuildReferenceViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,+BAAyC;AAEzC,MAAa,uBAAuB;IAQlC,YAAY,MAA6B,EAAE,cAA8B,EAAE,KAAY;QACrF,IAAG,cAAc,IAAI,IAAI,EAAE;YACzB,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC;YACzC,IAAG,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnJ,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAC3C;SACF;aAAM,IAAI,KAAK,IAAI,IAAI,EAAE;YACxB,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YACjC,IAAG,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACxH,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAClC;YACD,IAAI,CAAC,aAAa,GAAG,uBAAU,CAAC,0BAA0B,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACxF,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;SAC7C;IACH,CAAC;CACF;AA1BD,0DA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.d.ts new file mode 100644 index 00000000..af5beb94 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.d.ts @@ -0,0 +1,15 @@ +import { ChangeModel } from "../ChangeModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export declare class ChangeViewModelWrapper { + ChangeViewModel: ChangeViewModel[]; +} +export declare class ChangeViewModel { + readonly ConstHashLength = 8; + AuthorName: string; + Id: string; + Message: string; + TimeStamp: string; + Url: string; + ShortId: string; + constructor(change: ChangeModel, config: PipelineConfiguration); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js new file mode 100644 index 00000000..e3e7c956 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ChangeViewModel = exports.ChangeViewModelWrapper = void 0; +const StringUtils_1 = require("../../utils/StringUtils"); +const LinkHelper_1 = require("../helpers/LinkHelper"); +class ChangeViewModelWrapper { +} +exports.ChangeViewModelWrapper = ChangeViewModelWrapper; +class ChangeViewModel { + constructor(change, config) { + this.ConstHashLength = 8; + this.Id = change.$id; + this.ShortId = isNaN(Number.parseInt(this.Id)) ? this.Id : this.Id.substring(0, this.ConstHashLength); + this.Message = StringUtils_1.StringUtils.CompressNewLines(change.$message); + this.AuthorName = change.$author == null ? null : change.$author.displayName; + this.TimeStamp = change.$timeStamp.toDateString(); + this.Url = LinkHelper_1.LinkHelper.getCommitLink(change.$id, change.$location, config); + } +} +exports.ChangeViewModel = ChangeViewModel; +//# sourceMappingURL=ChangeViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js.map new file mode 100644 index 00000000..f4fc902c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ChangeViewModel.js","sourceRoot":"","sources":["ChangeViewModel.ts"],"names":[],"mappings":";;;AAEA,yDAAsD;AACtD,sDAAmD;AAEnD,MAAa,sBAAsB;CAElC;AAFD,wDAEC;AAED,MAAa,eAAe;IAS1B,YAAY,MAAmB,EAAE,MAA6B;QAR9C,oBAAe,GAAG,CAAC,CAAC;QASlC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACtG,IAAI,CAAC,OAAO,GAAG,yBAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7E,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAElD,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;CACF;AAlBD,0CAkBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.d.ts new file mode 100644 index 00000000..9ef5f238 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.d.ts @@ -0,0 +1,10 @@ +import { JobModel } from "../JobModel"; +import { TaskResultViewModelWrapper } from "./TaskResultViewModel"; +export declare class DeploymentJobViewModel { + Tasks: TaskResultViewModelWrapper; + MinTaskStartTime: Date; + MaxTaskFinishTime: Date; + constructor(jobs: JobModel[]); + private getMinTime; + private getMaxTime; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js new file mode 100644 index 00000000..b723545f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DeploymentJobViewModel = void 0; +const TaskResultViewModel_1 = require("./TaskResultViewModel"); +class DeploymentJobViewModel { + constructor(jobs) { + this.Tasks = new TaskResultViewModel_1.TaskResultViewModelWrapper(); + this.Tasks.TaskResultViewModel = []; + if (jobs.length > 0) { + let taskIndex = 0; + let releaseTasks = []; + do { + releaseTasks = []; + jobs.forEach(job => { + // Not all jobs have same set of tasks + if (taskIndex < job.$tasks.length) { + releaseTasks.push(job.$tasks[taskIndex]); + this.MinTaskStartTime = this.getMinTime(this.MinTaskStartTime, job.$tasks[taskIndex].$startTime); + this.MaxTaskFinishTime = this.getMaxTime(this.MaxTaskFinishTime, job.$tasks[taskIndex].$finishTime); + } + }); + if (releaseTasks != null && releaseTasks.length > 0) { + this.Tasks.TaskResultViewModel.push(new TaskResultViewModel_1.TaskResultViewModel(releaseTasks)); + } + taskIndex++; + } while (releaseTasks.length > 0); + } + } + getMinTime(time1, time2) { + if (time1 == null) { + return time2; + } + else if (time2 != null && time2 < time1) { + return time2; + } + return time1; + } + getMaxTime(time1, time2) { + if (time1 == null) { + return time2; + } + else if (time2 != null && time2 > time1) { + return time2; + } + return time1; + } +} +exports.DeploymentJobViewModel = DeploymentJobViewModel; +//# sourceMappingURL=DeploymentJobViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js.map new file mode 100644 index 00000000..bece72f8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DeploymentJobViewModel.js","sourceRoot":"","sources":["DeploymentJobViewModel.ts"],"names":[],"mappings":";;;AAEA,+DAAwF;AAExF,MAAa,sBAAsB;IAKjC,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,gDAA0B,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,YAAY,GAAgB,EAAE,CAAC;YACnC,GAAG;gBACD,YAAY,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBACjB,sCAAsC;oBACtC,IAAI,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;wBACjC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;wBACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC;wBACjG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;qBACrG;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;iBAC5E;gBAED,SAAS,EAAE,CAAC;aAEb,QAAQ,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;SACnC;IACH,CAAC;IAEO,UAAU,CAAC,KAAW,EAAE,KAAW;QACzC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;aACI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,KAAW,EAAE,KAAW;QACzC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;aACI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAtDD,wDAsDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.d.ts new file mode 100644 index 00000000..bf616383 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.d.ts @@ -0,0 +1,38 @@ +import { Report } from "../Report"; +import { ReportConfiguration } from "../../config/ReportConfiguration"; +import { ReleaseViewModel } from "./ReleaseViewModel"; +import { PhaseViewModelWrapper } from "./PhaseViewModel"; +import { PhaseIssuesViewModel } from "./PhaseIssuesViewModel"; +import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; +import { ArtifactViewModelWrapper } from "./ArtifactViewModel"; +import { ChangeViewModelWrapper } from "./ChangeViewModel"; +import { TestSummaryGroupViewModelWrapper } from "./TestSummaryGroupViewModel"; +import { TestResultsGroupViewModelWrapper } from "./TestResultsGroupViewModel"; +export declare class EmailReportViewModel { + DataMissing: boolean; + HasTestResultsToShow: boolean; + HasFailedTests: boolean; + HasFilteredTests: boolean; + HasTaskFailures: boolean; + HasCanceledPhases: boolean; + MaxTestResultsToShow: number; + ProjectName: string; + Release: ReleaseViewModel; + Build: any; + Phases: PhaseViewModelWrapper; + PhaseIssuesSummary: PhaseIssuesViewModel; + AllTests: TestResultSummaryViewModel; + Artifacts: ArtifactViewModelWrapper; + AssociatedChanges: ChangeViewModelWrapper; + SummaryGroups: TestSummaryGroupViewModelWrapper; + TestResultsGroups: TestResultsGroupViewModelWrapper; + TestTabLink: string; + ShowAssociatedChanges: boolean; + constructor(report: Report, reportConfiguration: ReportConfiguration); + private InitializePhases; + private SetMailSubject; + private InitializeAssociatedChanges; + private InitializeSummaryGroupViewModel; + private InitializeTestResultGroups; + private GetPassPercentage; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js new file mode 100644 index 00000000..88dac581 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js @@ -0,0 +1,132 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EmailReportViewModel = void 0; +const util_1 = require("util"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const LinkHelper_1 = require("../helpers/LinkHelper"); +const PhaseViewModel_1 = require("./PhaseViewModel"); +const PhaseIssuesViewModel_1 = require("./PhaseIssuesViewModel"); +const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); +const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); +const ArtifactViewModel_1 = require("./ArtifactViewModel"); +const ChangeViewModel_1 = require("./ChangeViewModel"); +const TestSummaryGroupViewModel_1 = require("./TestSummaryGroupViewModel"); +const TestResultsGroupViewModel_1 = require("./TestResultsGroupViewModel"); +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +class EmailReportViewModel { + constructor(report, reportConfiguration) { + this.ProjectName = reportConfiguration.$pipelineConfiguration.$projectName; + this.HasTaskFailures = report.hasFailedTasks(); + if (reportConfiguration.$pipelineConfiguration.$pipelineType == PipelineType_1.PipelineType.Build) { + this.Build = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration); + } + else { + this.Release = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration); + } + this.Artifacts = new ArtifactViewModel_1.ArtifactViewModelWrapper(); + this.Artifacts.ArtifactViewModel = report.getArtifactViewModels(reportConfiguration.$pipelineConfiguration); + this.HasCanceledPhases = report.hasCanceledPhases(); + this.InitializePhases(report); + this.SetMailSubject(report, reportConfiguration); + this.HasFailedTests = report.hasFailedTests(reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); + if (report.testResultSummary != null) { + this.AllTests = new TestResultSummaryViewModel_1.TestResultSummaryViewModel(null, report.testResultSummary, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); + } + this.InitializeSummaryGroupViewModel(report, reportConfiguration); + this.ShowAssociatedChanges = reportConfiguration.$reportDataConfiguration.$includeCommits; + if (this.ShowAssociatedChanges) { + this.InitializeAssociatedChanges(report, reportConfiguration.$pipelineConfiguration); + } + this.InitializeTestResultGroups(report, reportConfiguration); + this.TestTabLink = LinkHelper_1.LinkHelper.getTestTabLink(reportConfiguration.$pipelineConfiguration); + this.DataMissing = report.$dataMissing; + } + InitializePhases(report) { + const phases = []; + if (util_1.isNullOrUndefined(report.$phases) || report.$phases.length < 1) { + return; + } + report.$phases.forEach(phase => { + phases.push(new PhaseViewModel_1.PhaseViewModel(phase)); + }); + this.Phases = new PhaseViewModel_1.PhaseViewModelWrapper(); + this.Phases.PhaseViewModel = phases; + if (this.HasCanceledPhases) { + this.PhaseIssuesSummary = new PhaseIssuesViewModel_1.PhaseIssuesViewModel(report.$phases); + } + } + SetMailSubject(report, reportConfig) { + var subject = reportConfig.$mailConfiguration.$mailSubject; + if (subject.includes("{passPercentage}")) { + var passPercentage = this.GetPassPercentage(report, reportConfig.$reportDataConfiguration.$includeOthersInTotal); + subject = subject.replace("{passPercentage}", passPercentage); + } + if (subject.includes("{environmentStatus}")) { + subject = subject.replace("{environmentStatus}", report.getEnvironmentStatus()); + } + reportConfig.$mailConfiguration.$mailSubject = subject; + } + InitializeAssociatedChanges(report, pipelineConfig) { + if (!util_1.isNullOrUndefined(report.$associatedChanges) && report.$associatedChanges.length > 0) { + this.AssociatedChanges = new ChangeViewModel_1.ChangeViewModelWrapper(); + this.AssociatedChanges.ChangeViewModel = []; + report.$associatedChanges.forEach(associatedChange => { + this.AssociatedChanges.ChangeViewModel.push(new ChangeViewModel_1.ChangeViewModel(associatedChange, pipelineConfig)); + }); + } + } + InitializeSummaryGroupViewModel(report, reportConfiguration) { + this.SummaryGroups = new TestSummaryGroupViewModel_1.TestSummaryGroupViewModelWrapper(); + this.SummaryGroups.TestSummaryGroupViewModel = []; + if (!util_1.isNullOrUndefined(report.$testSummaryGroups)) { + report.$testSummaryGroups.forEach(summaryGroup => { + reportConfiguration.$reportDataConfiguration.$groupTestSummaryBy.forEach(group => { + if (summaryGroup.groupedBy == group) { + console.log(`Creating summary group viewmodel for ${summaryGroup.groupedBy}`); + this.SummaryGroups.TestSummaryGroupViewModel.push(new TestSummaryGroupViewModel_1.TestSummaryGroupViewModel(summaryGroup, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal)); + } + }); + }); + } + } + InitializeTestResultGroups(report, reportConfig) { + this.TestResultsGroups = new TestResultsGroupViewModel_1.TestResultsGroupViewModelWrapper(); + this.TestResultsGroups.TestResultsGroupViewModel = []; + if (report.filteredResults != null) { + report.filteredResults.forEach(testResultGroupModel => { + var testResultsGroupViewModel = new TestResultsGroupViewModel_1.TestResultsGroupViewModel(testResultGroupModel, reportConfig); + this.TestResultsGroups.TestResultsGroupViewModel.push(testResultsGroupViewModel); + }); + } + this.HasFilteredTests = report.hasFilteredTests; + if (this.TestResultsGroups.TestResultsGroupViewModel.length > 0) { + const testResultsConfig = reportConfig.$reportDataConfiguration.$testResultsConfig; + if (testResultsConfig.$includePassedTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.PassedTests.TestResultViewModel.length > 0).length > 0; + } + if (testResultsConfig.$includeFailedTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.FailedTests.TestResultViewModel.length > 0).length > 0; + } + if (testResultsConfig.$includeOtherTests) { + this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.OtherTests.TestResultViewModel.length > 0).length > 0; + } + } + } + GetPassPercentage(report, includeOthersInTotal) { + var summary = report.testResultSummary; + let passedTests = 0, totalTests = 0; + if (summary != null) { + const passedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Passed]; + passedTests = util_1.isNullOrUndefined(passedTestsAggregation) ? 0 : passedTestsAggregation.count; + const failedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; + const failedTests = util_1.isNullOrUndefined(failedTestsAggregation) ? 0 : failedTestsAggregation.count; + totalTests = summary.aggregatedResultsAnalysis.totalTests; + if (!includeOthersInTotal) { + totalTests = passedTests + failedTests; + } + } + return TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(passedTests, totalTests); + } +} +exports.EmailReportViewModel = EmailReportViewModel; +//# sourceMappingURL=EmailReportViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js.map new file mode 100644 index 00000000..88e2c7cb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EmailReportViewModel.js","sourceRoot":"","sources":["EmailReportViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.d.ts new file mode 100644 index 00000000..def8692e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.d.ts @@ -0,0 +1,18 @@ +import { MailConfiguration } from "../../config/mail/MailConfiguration"; +import { Report } from "../Report"; +export declare class MailAddressViewModel { + cc: string[]; + from: string; + to: string[]; + private defaultDomain; + constructor(report: Report, mailConfig: MailConfiguration); + private getMailAddresses; + private getFailedTestOwners; + private getActiveBugOwnersForFailedTests; + private getChangesetOwners; + private filterValidMailAddresses; + private getValidEmailAddress; + private isValidEmail; + private getMailAddressFromIdentityRef; + private getUniqueName; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js new file mode 100644 index 00000000..f6cf22ed --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js @@ -0,0 +1,128 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MailAddressViewModel = void 0; +const util_1 = require("util"); +const StringUtils_1 = require("../../utils/StringUtils"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +class MailAddressViewModel { + constructor(report, mailConfig) { + this.cc = []; + this.to = []; + this.from = mailConfig.$smtpConfig.$userName; + this.defaultDomain = mailConfig.$defaultDomain; + console.log("computing email addresses for to section"); + this.to = this.getMailAddresses(report, mailConfig.$toRecipientsConfig); + console.log("computing email addresses for Cc section"); + this.cc = this.getMailAddresses(report, mailConfig.$ccRecipientsConfig); + } + getMailAddresses(report, recipientsConfiguration) { + var addressHashSet = new Set(); + if (recipientsConfiguration.$includeTestOwners) { + const owners = this.getFailedTestOwners(report); + owners.forEach(o => addressHashSet.add(o)); + } + if (recipientsConfiguration.$includeActiveBugOwners) { + const bugOwners = this.getActiveBugOwnersForFailedTests(report); + bugOwners.forEach(o => addressHashSet.add(o)); + } + if (recipientsConfiguration.$includeChangesetOwners) { + const changesetOwners = this.getChangesetOwners(report.$associatedChanges); + changesetOwners.forEach(o => addressHashSet.add(o)); + } + if (recipientsConfiguration.$includeCreatedBy) { + if (!util_1.isNullOrUndefined(report.createdBy)) { + addressHashSet.add(report.createdBy.uniqueName); + } + } + if (!util_1.isNullOrUndefined(recipientsConfiguration.$defaultRecipients)) { + recipientsConfiguration.$defaultRecipients.split(";").forEach(a => addressHashSet.add(a)); + } + return this.filterValidMailAddresses(addressHashSet); + } + getFailedTestOwners(report) { + var mailAddresses = []; + if (!util_1.isNullOrUndefined(report.$failedTestOwners)) { + report.$failedTestOwners.forEach(identity => { + var mailAddress = this.getMailAddressFromIdentityRef(identity); + if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(mailAddress)) { + mailAddresses.push(mailAddress); + } + }); + } + console.log(`Failed Test owners - ${mailAddresses.join(",")}`); + return mailAddresses; + } + getActiveBugOwnersForFailedTests(report) { + if (report.filteredResults == null) { + return []; + } + const bugOwners = []; + report.filteredResults.forEach(group => { + if (group.testResults.has(TestInterfaces_1.TestOutcome.Failed)) { + group.testResults.forEach(tr => { + tr.forEach(tr => { + tr.associatedBugs.forEach(bug => { + const bugState = bug.fields["System.State"]; + if (!util_1.isNullOrUndefined(bugState) && bugState.toLowerCase() == "Active".toLowerCase()) { + bugOwners.push(bug.fields["System.AssignedTo"]); + } + }); + }); + }); + } + }); + console.log(`Failed Test owners - ${bugOwners.join(",")}`); + return bugOwners; + } + getChangesetOwners(associatedChanges) { + var mailAddresses = []; + if (!util_1.isNullOrUndefined(associatedChanges) && associatedChanges.length < 1) { + console.log("No changeset owner mail addresses"); + return mailAddresses; + } + associatedChanges.forEach(associatedChange => { + var mailAddress = associatedChange.$author.uniqueName; + if (StringUtils_1.StringUtils.isNullOrWhiteSpace(mailAddress)) { + console.log(`Unable to get mail address for associated change - ${associatedChange.$id}`); + } + else { + mailAddresses.push(mailAddress); + } + }); + console.log(`Changeset owner mail addresses - ${mailAddresses.join(",")}`); + return mailAddresses; + } + filterValidMailAddresses(addressHashSet) { + var mailAddresses = []; + addressHashSet.forEach(address => { + var validAddress = this.getValidEmailAddress(address); + if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(validAddress)) { + mailAddresses.push(validAddress); + } + }); + return mailAddresses; + } + getValidEmailAddress(address) { + if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(address) && !this.isValidEmail(address)) { + console.log(`Address ${address} is not a valid email address. Adding domain: ${this.defaultDomain}`); + address = `${address}@${this.defaultDomain}`; + } + return address; + } + isValidEmail(email) { + var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(String(email)); + } + getMailAddressFromIdentityRef(identity) { + if (!identity.isContainer) { + return this.getUniqueName(identity); + } + console.log(`Not fetching email address for container - ${identity.displayName}`); + return null; + } + getUniqueName(identity) { + return identity.uniqueName == null ? identity.displayName : identity.uniqueName; + } +} +exports.MailAddressViewModel = MailAddressViewModel; +//# sourceMappingURL=MailAddressViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js.map new file mode 100644 index 00000000..af2439d7 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MailAddressViewModel.js","sourceRoot":"","sources":["MailAddressViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.d.ts new file mode 100644 index 00000000..351ef469 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.d.ts @@ -0,0 +1,7 @@ +import { TaskResultViewModelWrapper } from "./TaskResultViewModel"; +import { PhaseModel } from "../PhaseModel"; +export declare class PhaseIssuesViewModel { + Tasks: TaskResultViewModelWrapper; + Name: string; + constructor(phases: PhaseModel[]); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js new file mode 100644 index 00000000..110679ef --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PhaseIssuesViewModel = void 0; +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const TaskResultViewModel_1 = require("./TaskResultViewModel"); +const TaskModel_1 = require("../TaskModel"); +class PhaseIssuesViewModel { + constructor(phases) { + /// + /// Use TaskResultViewModel as Phase level issue as the viewmodel is same + /// + this.Tasks = new TaskResultViewModel_1.TaskResultViewModelWrapper(); + this.Name = "Phase Issues"; + this.Tasks.TaskResultViewModel = []; + phases.forEach(phase => { + if (phase != null && phase.$jobs != null) { + const canceledJobs = phase.$jobs.filter(job => job.$jobStatus == ReleaseInterfaces_1.TaskStatus.Canceled); + if (canceledJobs.length > 0) { + var failedJobsAsTasks = canceledJobs.map(job => { + return new TaskModel_1.TaskModel(job.$jobName, job.$jobStatus, job.$issues, null, null, null); + }); + var taskResViewModel = new TaskResultViewModel_1.TaskResultViewModel(failedJobsAsTasks); + taskResViewModel.IssuesSummary.ErrorMessage = `Failed on ${canceledJobs.length}/${phase.$jobs.length} Agents`; + this.Tasks.TaskResultViewModel.push(taskResViewModel); + } + } + }); + } +} +exports.PhaseIssuesViewModel = PhaseIssuesViewModel; +//# sourceMappingURL=PhaseIssuesViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js.map new file mode 100644 index 00000000..b351c0f9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PhaseIssuesViewModel.js","sourceRoot":"","sources":["PhaseIssuesViewModel.ts"],"names":[],"mappings":";;;AAAA,0FAAgF;AAChF,+DAAwF;AAExF,4CAAyC;AAEzC,MAAa,oBAAoB;IAO/B,YAAY,MAAoB;QANhC,aAAa;QACb,yEAAyE;QACzE,cAAc;QACP,UAAK,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAI1E,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;gBACxC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,8BAAU,CAAC,QAAQ,CAAC,CAAC;gBACtF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3B,IAAI,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBAC7C,OAAO,IAAI,qBAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBACpF,CAAC,CAAC,CAAC;oBACH,IAAI,gBAAgB,GAAG,IAAI,yCAAmB,CAAC,iBAAiB,CAAC,CAAC;oBAClE,gBAAgB,CAAC,aAAa,CAAC,YAAY,GAAG,aAAa,YAAY,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;oBAC9G,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;iBACvD;aACF;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAxBD,oDAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.d.ts new file mode 100644 index 00000000..af1b7f7f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.d.ts @@ -0,0 +1,15 @@ +import { DeploymentJobViewModel } from "./DeploymentJobViewModel"; +import { PhaseModel } from "../PhaseModel"; +export declare class PhaseViewModelWrapper { + PhaseViewModel: PhaseViewModel[]; +} +export declare class PhaseViewModel { + DeploymentJob: DeploymentJobViewModel; + TasksDuration: string; + Status: string; + Rank: number; + Name: string; + constructor(phase: PhaseModel); + private InitializeDeploymentJobs; + private InitializeTasksDuration; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js new file mode 100644 index 00000000..51d18967 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PhaseViewModel = exports.PhaseViewModelWrapper = void 0; +const DeploymentJobViewModel_1 = require("./DeploymentJobViewModel"); +const TimeFormatter_1 = require("../helpers/TimeFormatter"); +class PhaseViewModelWrapper { +} +exports.PhaseViewModelWrapper = PhaseViewModelWrapper; +class PhaseViewModel { + constructor(phase) { + this.Status = phase.$status; + this.Rank = phase.$rank; + this.Name = phase.$name; + this.InitializeDeploymentJobs(phase); + } + InitializeDeploymentJobs(phase) { + const deploymentJobs = phase.$jobs; + if (deploymentJobs.length > 0) { + this.DeploymentJob = new DeploymentJobViewModel_1.DeploymentJobViewModel(deploymentJobs); + this.InitializeTasksDuration(); + } + else { + // This can happen if we have an empty phase or a phase with only disabled steps + console.warn(`No deployment jobs found in phase ${this.Name}`); + } + } + InitializeTasksDuration() { + // Evaluate job duration and format it + if (this.DeploymentJob.MaxTaskFinishTime != null && this.DeploymentJob.MinTaskStartTime != null) { + this.TasksDuration = `${TimeFormatter_1.TimeFormatter.FormatDuration(this.DeploymentJob.MaxTaskFinishTime.getTime() - this.DeploymentJob.MinTaskStartTime.getTime())}`; + } + } +} +exports.PhaseViewModel = PhaseViewModel; +//# sourceMappingURL=PhaseViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js.map new file mode 100644 index 00000000..9126235d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PhaseViewModel.js","sourceRoot":"","sources":["PhaseViewModel.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAElE,4DAAyD;AAEzD,MAAa,qBAAqB;CAEjC;AAFD,sDAEC;AAED,MAAa,cAAc;IAOzB,YAAY,KAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,wBAAwB,CAAC,KAAiB;QAChD,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC;QAEnC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,+CAAsB,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAChC;aACI;YACH,gFAAgF;YAChF,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SAChE;IACH,CAAC;IAEO,uBAAuB;QAC7B,sCAAsC;QACtC,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,gBAAgB,IAAI,IAAI,EAAE;YAC/F,IAAI,CAAC,aAAa,GAAG,GAAG,6BAAa,CAAC,cAAc,CAClD,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;SACrG;IACH,CAAC;CACF;AAlCD,wCAkCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.d.ts new file mode 100644 index 00000000..2124209c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.d.ts @@ -0,0 +1,6 @@ +import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +export declare class ReleaseEnvironmentViewModel { + EnvironmentName: string; + EnvironmentOwnerEmail: string; + constructor(environment: ReleaseEnvironment); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js new file mode 100644 index 00000000..6669729c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseEnvironmentViewModel = void 0; +class ReleaseEnvironmentViewModel { + constructor(environment) { + this.EnvironmentName = environment == null ? null : environment.name; + this.EnvironmentOwnerEmail = environment != null && environment.owner != null ? environment.owner.uniqueName : null; + } +} +exports.ReleaseEnvironmentViewModel = ReleaseEnvironmentViewModel; +//# sourceMappingURL=ReleaseEnvironmentViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js.map new file mode 100644 index 00000000..d13d67d3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseEnvironmentViewModel.js","sourceRoot":"","sources":["ReleaseEnvironmentViewModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,2BAA2B;IAItC,YAAY,WAA+B;QACzC,IAAI,CAAC,eAAe,GAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QACrE,IAAI,CAAC,qBAAqB,GAAG,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IACtH,CAAC;CACF;AARD,kEAQC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.d.ts new file mode 100644 index 00000000..b777d56d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.d.ts @@ -0,0 +1,8 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReleaseReference } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +export declare class ReleaseReferenceViewModel { + Id: number; + Name: string; + Url: string; + constructor(config: PipelineConfiguration, releaseReference: ReleaseReference); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js new file mode 100644 index 00000000..552b3b6e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseReferenceViewModel = void 0; +const LinkHelper_1 = require("../helpers/LinkHelper"); +class ReleaseReferenceViewModel { + constructor(config, releaseReference) { + this.Id = releaseReference.id; + this.Name = releaseReference.name; + this.Url = LinkHelper_1.LinkHelper.getReleaseSummaryLink(config); + } +} +exports.ReleaseReferenceViewModel = ReleaseReferenceViewModel; +//# sourceMappingURL=ReleaseReferenceViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js.map new file mode 100644 index 00000000..d4f2c9ad --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseReferenceViewModel.js","sourceRoot":"","sources":["ReleaseReferenceViewModel.ts"],"names":[],"mappings":";;;AAAA,sDAAmD;AAInD,MAAa,yBAAyB;IAKpC,YAAY,MAA6B,EAAE,gBAAkC;QAC3E,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;CACF;AAVD,8DAUC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.d.ts new file mode 100644 index 00000000..a17f897f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.d.ts @@ -0,0 +1,13 @@ +import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReleaseEnvironmentViewModel } from "./ReleaseEnvironmentViewModel"; +export declare class ReleaseViewModel { + CurrentEnvironment: ReleaseEnvironmentViewModel; + ReleaseDefinitionName: string; + ReleaseDefinitionUrl: string; + ReleaseId: number; + ReleaseName: string; + ReleaseSummaryUrl: string; + ReleaseLogsLink: string; + constructor(currentEnvironment: ReleaseEnvironment, releaseConfig: PipelineConfiguration); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js new file mode 100644 index 00000000..54e00f22 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseViewModel = void 0; +const LinkHelper_1 = require("../helpers/LinkHelper"); +const ReleaseEnvironmentViewModel_1 = require("./ReleaseEnvironmentViewModel"); +const util_1 = require("util"); +class ReleaseViewModel { + constructor(currentEnvironment, releaseConfig) { + if (currentEnvironment != null) { + this.CurrentEnvironment = new ReleaseEnvironmentViewModel_1.ReleaseEnvironmentViewModel(currentEnvironment); + this.ReleaseDefinitionName = currentEnvironment.releaseDefinition == null ? null : currentEnvironment.releaseDefinition.name; + if (currentEnvironment.releaseDefinition != null) { + this.ReleaseDefinitionUrl = LinkHelper_1.LinkHelper.getReleaseDefinitionLink(releaseConfig, currentEnvironment.releaseDefinition.id); + } + this.ReleaseName = currentEnvironment.release == null ? null : currentEnvironment.release.name; + } + this.ReleaseId = releaseConfig.$pipelineId; + if (!util_1.isNullOrUndefined(currentEnvironment.release) && !util_1.isNullOrUndefined(currentEnvironment.release._links) && !util_1.isNullOrUndefined(currentEnvironment.release._links.web)) { + this.ReleaseSummaryUrl = currentEnvironment.release._links.web.href; + } + this.ReleaseLogsLink = LinkHelper_1.LinkHelper.getReleaseLogsTabLink(releaseConfig); + } +} +exports.ReleaseViewModel = ReleaseViewModel; +//# sourceMappingURL=ReleaseViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js.map new file mode 100644 index 00000000..e1966291 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseViewModel.js","sourceRoot":"","sources":["ReleaseViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,+EAA4E;AAC5E,+BAAyC;AAEzC,MAAa,gBAAgB;IAS3B,YAAY,kBAAsC,EAAE,aAAoC;QACtF,IAAI,kBAAkB,IAAI,IAAI,EAAE;YAC9B,IAAI,CAAC,kBAAkB,GAAG,IAAI,yDAA2B,CAAC,kBAAkB,CAAC,CAAC;YAC9E,IAAI,CAAC,qBAAqB,GAAG,kBAAkB,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAE7H,IAAI,kBAAkB,CAAC,iBAAiB,IAAI,IAAI,EAAE;gBAChD,IAAI,CAAC,oBAAoB,GAAG,uBAAU,CAAC,wBAAwB,CAAC,aAAa,EAC3E,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;aAC5C;YAED,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC;SAChG;QAED,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC;QAC3C,IAAG,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACvK,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;SACrE;QACD,IAAI,CAAC,eAAe,GAAG,uBAAU,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACzE,CAAC;CACF;AA5BD,4CA4BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.d.ts new file mode 100644 index 00000000..76748801 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.d.ts @@ -0,0 +1,14 @@ +import { TaskIssueViewModel, TaskIssueViewModelWrapper } from "./TaskIssueViewModel"; +import { TaskModel } from "../TaskModel"; +export declare class TaskIssueSummaryViewModel { + Issues: TaskIssueViewModelWrapper; + ErrorMessage: string; + ErrorCount: number; + WarningCount: number; + constructor(tasks: TaskModel[]); + TruncateIssues(issues: TaskIssueViewModel[], characterLimit?: number): TaskIssueViewModel[]; +} +export declare class IssueTypeConstants { + static readonly Error = "error"; + static readonly Warning = "warning"; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js new file mode 100644 index 00000000..d2ac789c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js @@ -0,0 +1,58 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IssueTypeConstants = exports.TaskIssueSummaryViewModel = void 0; +const TaskIssueViewModel_1 = require("./TaskIssueViewModel"); +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const StringUtils_1 = require("../../utils/StringUtils"); +class TaskIssueSummaryViewModel { + constructor(tasks) { + this.ErrorMessage = ""; + this.ErrorCount = 0; + this.WarningCount = 0; + var allIssues = []; + this.ErrorMessage = `Failed on ${tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Failed || t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length}/${tasks.length} Agents`; + tasks.forEach(task => { + if (task.$issues != null && task.$issues.length > 0) { + task.$issues.forEach(issue => { + if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(issue.$message)) { + if (issue.$issueType.toLowerCase() == IssueTypeConstants.Error) { + this.ErrorCount++; + } + else if (issue.$issueType.toLowerCase() == IssueTypeConstants.Warning) { + this.WarningCount++; + } + allIssues.push(new TaskIssueViewModel_1.TaskIssueViewModel(issue.$message, issue.$issueType, task.$agentName)); + } + }); + } + }); + this.Issues = new TaskIssueViewModel_1.TaskIssueViewModelWrapper(); + this.Issues.TaskIssueViewModel = this.TruncateIssues(allIssues); + } + TruncateIssues(issues, characterLimit = 1000) { + const truncatedIssues = []; + var warningIssues = issues.filter(t => t.IssueType.toLowerCase() != IssueTypeConstants.Error); + var errorIssues = issues.filter(t => t.IssueType.toLowerCase() == IssueTypeConstants.Error); + const sortedIssues = []; + sortedIssues.push(...warningIssues); + sortedIssues.push(...errorIssues); + let currentCharCount = 0; + for (var i = 0; i < sortedIssues.length; i++) { + const issue = sortedIssues[i]; + if (currentCharCount >= characterLimit) { + return truncatedIssues; + } + issue.Message = issue.Message.substring(0, characterLimit - currentCharCount); + currentCharCount += issue.Message.length; + truncatedIssues.push(issue); + } + return truncatedIssues; + } +} +exports.TaskIssueSummaryViewModel = TaskIssueSummaryViewModel; +class IssueTypeConstants { +} +exports.IssueTypeConstants = IssueTypeConstants; +IssueTypeConstants.Error = "error"; +IssueTypeConstants.Warning = "warning"; +//# sourceMappingURL=TaskIssueSummaryViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js.map new file mode 100644 index 00000000..18f293c1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskIssueSummaryViewModel.js","sourceRoot":"","sources":["TaskIssueSummaryViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.d.ts new file mode 100644 index 00000000..4818465a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.d.ts @@ -0,0 +1,9 @@ +export declare class TaskIssueViewModelWrapper { + TaskIssueViewModel: TaskIssueViewModel[]; +} +export declare class TaskIssueViewModel { + Message: string; + IssueType: string; + AgentName: string; + constructor(issueMessage: string, issueType: string, agentName: string); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js new file mode 100644 index 00000000..6b55d0f3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskIssueViewModel = exports.TaskIssueViewModelWrapper = void 0; +class TaskIssueViewModelWrapper { +} +exports.TaskIssueViewModelWrapper = TaskIssueViewModelWrapper; +class TaskIssueViewModel { + constructor(issueMessage, issueType, agentName) { + this.Message = `(${agentName}) ${issueMessage.trim()}`; + this.IssueType = issueType; + this.AgentName = agentName; + } +} +exports.TaskIssueViewModel = TaskIssueViewModel; +//# sourceMappingURL=TaskIssueViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js.map new file mode 100644 index 00000000..c68bb95a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskIssueViewModel.js","sourceRoot":"","sources":["TaskIssueViewModel.ts"],"names":[],"mappings":";;;AAAA,MAAa,yBAAyB;CAErC;AAFD,8DAEC;AAED,MAAa,kBAAkB;IAM7B,YAAY,YAAoB,EAAE,SAAiB,EAAE,SAAiB;QACpE,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,KAAK,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAXD,gDAWC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.d.ts new file mode 100644 index 00000000..7342ec72 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.d.ts @@ -0,0 +1,24 @@ +import { TaskIssueSummaryViewModel } from "./TaskIssueSummaryViewModel"; +import { TaskModel } from "../TaskModel"; +export declare class TaskResultViewModelWrapper { + TaskResultViewModel: TaskResultViewModel[]; +} +export declare class TaskResultViewModel { + Duration: string; + HasFailed: boolean; + HasSkipped: boolean; + NotYetRun: boolean; + HasPartiallySucceeded: boolean; + HasNotRunOnSomeAgents: boolean; + GotCancelled: boolean; + NotRunMessage: string; + IssuesSummary: TaskIssueSummaryViewModel; + Name: string; + StartTime: string; + Status: string; + constructor(tasks: TaskModel[]); + private InitializeDuration; + private getMinTime; + private getMaxTime; + private getTimeDiff; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js new file mode 100644 index 00000000..5a7b0e2f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js @@ -0,0 +1,82 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskResultViewModel = exports.TaskResultViewModelWrapper = void 0; +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const TaskIssueSummaryViewModel_1 = require("./TaskIssueSummaryViewModel"); +const TimeFormatter_1 = require("../helpers/TimeFormatter"); +class TaskResultViewModelWrapper { +} +exports.TaskResultViewModelWrapper = TaskResultViewModelWrapper; +class TaskResultViewModel { + constructor(tasks) { + this.Name = tasks.length > 0 ? tasks[0].$name : ""; + this.HasFailed = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Failed || t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length > 0; + this.HasSkipped = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length == tasks.length; + this.NotYetRun = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.InProgress || t.$status == ReleaseInterfaces_1.TaskStatus.Unknown || t.$status == ReleaseInterfaces_1.TaskStatus.Pending).length > 0; + this.HasPartiallySucceeded = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.PartiallySucceeded).length > 0; + this.GotCancelled = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length > 0; + const inProgressTasks = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.InProgress); + if (inProgressTasks.length == 1) { + // Must be this task - Mark it as completed assuming we will pass + // If we don't, then the email report won't be sent with this data + this.NotYetRun = false; + } + if (tasks.length > 1) { + this.HasNotRunOnSomeAgents = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length > 0; + this.NotRunMessage = `Not run on ${tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length}/${tasks.length} agents`; + } + this.IssuesSummary = new TaskIssueSummaryViewModel_1.TaskIssueSummaryViewModel(tasks); + // No point in calculating duration for skipped/cancelled/not-yet-run tasks + if (!this.HasSkipped && !this.NotYetRun && !this.GotCancelled) { + this.InitializeDuration(tasks.filter(t => t.$status != ReleaseInterfaces_1.TaskStatus.Skipped)); + } + else { + this.Duration = ""; + } + } + InitializeDuration(tasks) { + if (tasks.length == 1) { + var firstTask = tasks[0]; + if (firstTask.$finishTime != null && firstTask.$startTime != null) { + this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(this.getTimeDiff(firstTask)); + } + } + else { + const nonNullTasks = tasks.filter(t => t.$finishTime != null && t.$startTime != null); + if (nonNullTasks.length > 0) { + var minTime = this.getMinTime(nonNullTasks); + var maxTime = this.getMaxTime(nonNullTasks); + if (minTime != null && maxTime != null) { + const minTimeStr = TimeFormatter_1.TimeFormatter.FormatDuration(minTime); + const maxTimeStr = TimeFormatter_1.TimeFormatter.FormatDuration(maxTime); + this.Duration = minTimeStr == maxTimeStr ? minTimeStr : `${minTimeStr} - ${maxTimeStr}`; + } + } + } + } + getMinTime(tasks) { + let minTime = this.getTimeDiff(tasks[0]); + for (var i = 1; i < tasks.length; i++) { + const diffTime = this.getTimeDiff(tasks[i]); + if (diffTime < minTime) { + minTime = diffTime; + } + } + return minTime; + } + getMaxTime(tasks) { + let maxTime = this.getTimeDiff(tasks[0]); + for (var i = 1; i < tasks.length; i++) { + const diffTime = this.getTimeDiff(tasks[i]); + if (diffTime > maxTime) { + maxTime = diffTime; + } + } + return maxTime; + } + getTimeDiff(task) { + return task.$finishTime.getTime() - task.$startTime.getTime(); + } +} +exports.TaskResultViewModel = TaskResultViewModel; +//# sourceMappingURL=TaskResultViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js.map new file mode 100644 index 00000000..95a2c073 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TaskResultViewModel.js","sourceRoot":"","sources":["TaskResultViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.d.ts new file mode 100644 index 00000000..3e1c85ea --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.d.ts @@ -0,0 +1,11 @@ +import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; +export declare class TestInfoByPriorityViewModelWrapper { + TestInfoByPriorityViewModel: TestInfoByPriorityViewModel[]; +} +export declare class TestInfoByPriorityViewModel { + Priority: number; + PassingRate: string; + TestCount: number; + constructor(priority: number, testCountByOutcome: Map, includeOthersInTotal: boolean); + private getPassingTestCountByOutcome; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js new file mode 100644 index 00000000..5d78c3bc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestInfoByPriorityViewModel = exports.TestInfoByPriorityViewModelWrapper = void 0; +const TestOutcomeForPriority_1 = require("../testresults/TestOutcomeForPriority"); +const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); +class TestInfoByPriorityViewModelWrapper { +} +exports.TestInfoByPriorityViewModelWrapper = TestInfoByPriorityViewModelWrapper; +class TestInfoByPriorityViewModel { + constructor(priority, testCountByOutcome, includeOthersInTotal) { + this.Priority = priority; + this.TestCount = TestResultsHelper_1.TestResultsHelper.getTotalTestCountBasedOnUserConfigurationPriority(testCountByOutcome, includeOthersInTotal); + if (this.TestCount > 0) { + var passingTests = this.getPassingTestCountByOutcome(testCountByOutcome); + this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(passingTests, this.TestCount); + } + } + getPassingTestCountByOutcome(testCountByOutcome) { + return testCountByOutcome.has(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed) + ? testCountByOutcome.get(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed) + : 0; + } +} +exports.TestInfoByPriorityViewModel = TestInfoByPriorityViewModel; +//# sourceMappingURL=TestInfoByPriorityViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js.map new file mode 100644 index 00000000..be888529 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestInfoByPriorityViewModel.js","sourceRoot":"","sources":["TestInfoByPriorityViewModel.ts"],"names":[],"mappings":";;;AAAA,kFAA+E;AAC/E,oEAAiE;AAEjE,MAAa,kCAAkC;CAE9C;AAFD,gFAEC;AAED,MAAa,2BAA2B;IAKtC,YAAY,QAAgB,EAC1B,kBAAuD,EACvD,oBAA6B;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,qCAAiB,CAAC,iDAAiD,CAClF,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;YACtB,IAAI,YAAY,GAAG,IAAI,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;YACzE,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;SACnG;IACH,CAAC;IAEO,4BAA4B,CAAC,kBAAuD;QAC1F,OAAO,kBAAkB,CAAC,GAAG,CAAC,+CAAsB,CAAC,MAAM,CAAC;YAC1D,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,+CAAsB,CAAC,MAAM,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;CACF;AAtBD,kEAsBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.d.ts new file mode 100644 index 00000000..0743b369 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.d.ts @@ -0,0 +1,14 @@ +import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultSummaryViewModel { + static readonly MaxSupportedPriority = 2; + Duration: string; + FailedTests: number; + OtherTests: number; + PassedTests: number; + PassingRate: string; + TotalTests: number; + Url: string; + constructor(summaryItemModel: TestSummaryItemModel, summary: TestResultSummary, pipelineConfiguration: PipelineConfiguration, includeOthersInTotal: boolean); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js new file mode 100644 index 00000000..91a1d6c0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultSummaryViewModel = void 0; +const TimeFormatter_1 = require("../helpers/TimeFormatter"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); +const util_1 = require("util"); +class TestResultSummaryViewModel { + constructor(summaryItemModel, summary, pipelineConfiguration, includeOthersInTotal) { + if (summaryItemModel != null) { + this.PassedTests = summaryItemModel.getPassedTestsCount(); + this.FailedTests = summaryItemModel.getFailedTestsCount(); + this.OtherTests = summaryItemModel.getOtherTestsCount(); + this.TotalTests = TestResultsHelper_1.TestResultsHelper.getTotalTestCountBasedOnUserConfiguration(summaryItemModel.$testCountByOutcome, includeOthersInTotal); + this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); + this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(summaryItemModel.$duration); + this.Url = pipelineConfiguration.getTestTabLink(); + } + else if (summary != null) { + const passedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Passed]; + const failedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; + this.PassedTests = util_1.isNullOrUndefined(passedAnalysis) ? 0 : passedAnalysis.count; + this.FailedTests = util_1.isNullOrUndefined(failedAnalysis) ? 0 : failedAnalysis.count; + this.TotalTests = summary.aggregatedResultsAnalysis.totalTests; + this.OtherTests = this.TotalTests - this.PassedTests - this.FailedTests; + if (!includeOthersInTotal) { + this.TotalTests -= this.OtherTests; + } + this.Duration = TimeFormatter_1.TimeFormatter.FormatDurationStr(summary.aggregatedResultsAnalysis.duration); + this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); + this.Url = pipelineConfiguration.getTestTabLink(); + } + } +} +exports.TestResultSummaryViewModel = TestResultSummaryViewModel; +TestResultSummaryViewModel.MaxSupportedPriority = 2; +//# sourceMappingURL=TestResultSummaryViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js.map new file mode 100644 index 00000000..bc2bc776 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultSummaryViewModel.js","sourceRoot":"","sources":["TestResultSummaryViewModel.ts"],"names":[],"mappings":";;;AAEA,4DAAyD;AACzD,oFAAiG;AACjG,oEAAiE;AACjE,+BAAyC;AAEzC,MAAa,0BAA0B;IAUrC,YAAY,gBAAsC,EAAE,OAA0B,EAAE,qBAA4C,EAAE,oBAA6B;QACzJ,IAAI,gBAAgB,IAAI,IAAI,EAAE;YAC5B,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;YAExD,IAAI,CAAC,UAAU,GAAG,qCAAiB,CAAC,yCAAyC,CAAC,gBAAgB,CAAC,mBAAmB,EAChH,oBAAoB,CAAC,CAAC;YAExB,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvG,IAAI,CAAC,QAAQ,GAAG,6BAAa,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAEzE,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;SACnD;aACI,IAAI,OAAO,IAAI,IAAI,EAAE;YACxB,MAAM,cAAc,GAAG,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;YAC9F,MAAM,cAAc,GAAG,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;YAC9F,IAAI,CAAC,WAAW,GAAG,wBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAChF,IAAI,CAAC,WAAW,GAAG,wBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAChF,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,yBAAyB,CAAC,UAAU,CAAC;YAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAExE,IAAI,CAAC,oBAAoB,EAAE;gBACzB,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;aACpC;YAED,IAAI,CAAC,QAAQ,GAAG,6BAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;YAC5F,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACvG,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;SACnD;IACH,CAAC;;AAzCH,gEA0CC;AAzCwB,+CAAoB,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.d.ts new file mode 100644 index 00000000..a6fc2fbd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.d.ts @@ -0,0 +1,26 @@ +import { WorkItemViewModelWrapper } from "./WorkItemViewModel"; +import { TestResultModel } from "../testresults/TestResultModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReleaseReferenceViewModel } from "./ReleaseReferenceViewModel"; +export declare class TestResultViewModelWrapper { + TestResultViewModel: TestResultViewModel[]; +} +export declare class TestResultViewModel { + private readonly StackTraceLineCount; + AssociatedBugs: WorkItemViewModelWrapper; + CreateBugLink: string; + Duration: string; + ErrorMessage: string; + FailingSinceBuild: any; + FailingSinceRelease: ReleaseReferenceViewModel; + FailingSinceTime: string; + Id: number; + Owner: string; + Priority: string; + StackTrace: string; + TestCaseTitle: string; + TestOutcome: string; + Url: string; + constructor(testResultModel: TestResultModel, config: PipelineConfiguration); + private InitializeAssociatedBugs; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js new file mode 100644 index 00000000..1d8005b1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js @@ -0,0 +1,70 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultViewModel = exports.TestResultViewModelWrapper = void 0; +const WorkItemViewModel_1 = require("./WorkItemViewModel"); +const StringUtils_1 = require("../../utils/StringUtils"); +const LinkHelper_1 = require("../helpers/LinkHelper"); +const TimeFormatter_1 = require("../helpers/TimeFormatter"); +const DisplayNameHelper_1 = require("../../utils/DisplayNameHelper"); +const ReleaseReferenceViewModel_1 = require("./ReleaseReferenceViewModel"); +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +const BuildReferenceViewModel_1 = require("./BuildReferenceViewModel"); +const util_1 = require("util"); +class TestResultViewModelWrapper { +} +exports.TestResultViewModelWrapper = TestResultViewModelWrapper; +class TestResultViewModel { + constructor(testResultModel, config) { + this.StackTraceLineCount = 5; + const result = testResultModel.testResult; + this.Id = result.id; + this.TestCaseTitle = result.testCaseTitle; + this.ErrorMessage = ""; + this.TestOutcome = result.outcome; + this.StackTrace = ""; + if (result.priority != 255) { + this.Priority = DisplayNameHelper_1.DisplayNameHelper.getPriorityDisplayName(result.priority == null ? "" : result.priority.toString()); + } + this.InitializeAssociatedBugs(config, testResultModel.associatedBugs); + this.Url = LinkHelper_1.LinkHelper.getTestResultLink(config, result.testRun.id, this.Id); + this.Owner = result.owner == null ? null : result.owner.displayName; + if (result.failingSince != null) { + const failingSincePipeline = config.$pipelineType == PipelineType_1.PipelineType.Build ? result.failingSince.release : result.failingSince.build; + const failingSinceNotCurrent = failingSincePipeline == null ? false : failingSincePipeline.id != config.$pipelineId; + if (failingSinceNotCurrent) { + this.FailingSinceTime = result.failingSince.date.toDateString(); + if (result.failingSince.release != null && result.failingSince.release.id > 0) { + this.FailingSinceRelease = new ReleaseReferenceViewModel_1.ReleaseReferenceViewModel(config, result.failingSince.release); + } + if (result.failingSince.build != null && result.failingSince.build.id > 0) { + this.FailingSinceBuild = new BuildReferenceViewModel_1.BuildReferenceViewModel(config, null, result.failingSince.build); + } + } + } + if (util_1.isNullOrUndefined(result.durationInMs)) { + if (!util_1.isNullOrUndefined(result.startedDate) && !util_1.isNullOrUndefined(result.completedDate)) { + result.durationInMs = result.completedDate.getTime() - result.startedDate.getTime(); + } + if (util_1.isNullOrUndefined(result.durationInMs) || result.durationInMs < 0) { + // unknown duration - assume test didn't run instead of displaying "Undefined/NaN" in email + result.durationInMs = 0; + } + } + this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(result.durationInMs); + this.CreateBugLink = LinkHelper_1.LinkHelper.getCreateBugLinkForTest(config, testResultModel.testResult); + } + InitializeAssociatedBugs(config, associatedBugs) { + this.AssociatedBugs = new WorkItemViewModel_1.WorkItemViewModelWrapper(); + this.AssociatedBugs.WorkItemViewModel = []; + if (associatedBugs == null) { + return; + } + associatedBugs.forEach(workItem => { + if (workItem.id != null) { + this.AssociatedBugs.WorkItemViewModel.push(new WorkItemViewModel_1.WorkItemViewModel(config, workItem)); + } + }); + } +} +exports.TestResultViewModel = TestResultViewModel; +//# sourceMappingURL=TestResultViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js.map new file mode 100644 index 00000000..f87e77ba --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultViewModel.js","sourceRoot":"","sources":["TestResultViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.d.ts new file mode 100644 index 00000000..cee07a69 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.d.ts @@ -0,0 +1,18 @@ +import { TestResultViewModelWrapper } from "./TestResultViewModel"; +import { ReportConfiguration } from "../../config/ReportConfiguration"; +import { TestResultsGroupModel } from "../testresults/TestResultGroupModel"; +import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestResultModel } from "../testresults/TestResultModel"; +export declare class TestResultsGroupViewModelWrapper { + TestResultsGroupViewModel: TestResultsGroupViewModel[]; +} +export declare class TestResultsGroupViewModel { + FailedTests: TestResultViewModelWrapper; + GroupName: string; + OtherTests: TestResultViewModelWrapper; + PassedTests: TestResultViewModelWrapper; + constructor(resultsGroupModel: TestResultsGroupModel, reportConfig: ReportConfiguration); + private setGroupName; + private getTestResultViewModels; + getTestResultsByOutcomes(source: TestResultsGroupModel, outcomes: TestOutcome[]): TestResultModel[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js new file mode 100644 index 00000000..9d67303e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsGroupViewModel = exports.TestResultsGroupViewModelWrapper = void 0; +const TestResultViewModel_1 = require("./TestResultViewModel"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +const DisplayNameHelper_1 = require("../../utils/DisplayNameHelper"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TcmHelper_1 = require("../../providers/tcmproviders/TcmHelper"); +class TestResultsGroupViewModelWrapper { +} +exports.TestResultsGroupViewModelWrapper = TestResultsGroupViewModelWrapper; +class TestResultsGroupViewModel { + constructor(resultsGroupModel, reportConfig) { + this.FailedTests = new TestResultViewModel_1.TestResultViewModelWrapper(); + this.OtherTests = new TestResultViewModel_1.TestResultViewModelWrapper(); + this.PassedTests = new TestResultViewModel_1.TestResultViewModelWrapper(); + this.setGroupName(resultsGroupModel, reportConfig); + this.FailedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestInterfaces_1.TestOutcome.Failed]); + this.PassedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestInterfaces_1.TestOutcome.Passed]); + this.OtherTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed])); + } + setGroupName(resultsGroupModel, reportConfig) { + var groupTestResultsBy = reportConfig.$reportDataConfiguration.$testResultsConfig.$groupTestResultsBy; + this.GroupName = groupTestResultsBy == GroupTestResultsBy_1.GroupTestResultsBy.Priority ? + DisplayNameHelper_1.DisplayNameHelper.getPriorityDisplayName(resultsGroupModel.groupName) : + resultsGroupModel.groupName; + } + getTestResultViewModels(resultsGroupModel, config, testOutcomes) { + return this.getTestResultsByOutcomes(resultsGroupModel, testOutcomes) + .map(result => new TestResultViewModel_1.TestResultViewModel(result, config)); + } + getTestResultsByOutcomes(source, outcomes) { + const testResults = []; + outcomes.forEach(outcome => { + if (source.testResults.has(outcome)) { + testResults.push(...source.testResults.get(outcome)); + } + }); + return testResults; + } +} +exports.TestResultsGroupViewModel = TestResultsGroupViewModel; +//# sourceMappingURL=TestResultsGroupViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js.map new file mode 100644 index 00000000..96653582 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultsGroupViewModel.js","sourceRoot":"","sources":["TestResultsGroupViewModel.ts"],"names":[],"mappings":";;;AAAA,+DAAwF;AAGxF,+EAA4E;AAC5E,qEAAkE;AAElE,oFAA8E;AAE9E,sEAAmE;AAEnE,MAAa,gCAAgC;CAE5C;AAFD,4EAEC;AAED,MAAa,yBAAyB;IAMpC,YAAY,iBAAwC,EAAE,YAAiC;QALhF,gBAAW,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAE3E,eAAU,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAC1E,gBAAW,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAGhF,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClJ,IAAI,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClJ,IAAI,CAAC,UAAU,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EACvH,qBAAS,CAAC,cAAc,CAAC,CAAC,4BAAW,CAAC,MAAM,EAAE,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,YAAY,CAAC,iBAAwC,EAAE,YAAiC;QAC9F,IAAI,kBAAkB,GAAG,YAAY,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;QACtG,IAAI,CAAC,SAAS,GAAG,kBAAkB,IAAI,uCAAkB,CAAC,QAAQ,CAAC,CAAC;YAClE,qCAAiB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;YACvE,iBAAiB,CAAC,SAAS,CAAC;IAChC,CAAC;IAEO,uBAAuB,CAC7B,iBAAwC,EACxC,MAA6B,EAC7B,YAA2B;QAC3B,OAAO,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,YAAY,CAAC;aAClE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,yCAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEM,wBAAwB,CAC7B,MAA6B,EAC7B,QAAuB;QACvB,MAAM,WAAW,GAAsB,EAAE,CAAC;QAE1C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBACnC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtD;QACH,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAzCD,8DAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.d.ts new file mode 100644 index 00000000..1883ea5b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.d.ts @@ -0,0 +1,15 @@ +import { TestSummaryGroupModel } from "../testresults/TestSummaryGroupModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestSummaryItemViewModelWrapper } from "./TestSummaryItemViewModel"; +export declare class TestSummaryGroupViewModelWrapper { + TestSummaryGroupViewModel: TestSummaryGroupViewModel[]; +} +export declare class TestSummaryGroupViewModel { + GroupName: string; + SummaryItems: TestSummaryItemViewModelWrapper; + private SupportedPriorityColumns; + constructor(testSummaryGroup: TestSummaryGroupModel, config: PipelineConfiguration, includeOthersInTotal: boolean); + private InitializeSummaryItems; + private InitializeSupportedPriorityColumns; + private getDescription; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js new file mode 100644 index 00000000..2c67732d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryGroupViewModel = exports.TestSummaryGroupViewModelWrapper = void 0; +const TestSummaryItemViewModel_1 = require("./TestSummaryItemViewModel"); +const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +class TestSummaryGroupViewModelWrapper { +} +exports.TestSummaryGroupViewModelWrapper = TestSummaryGroupViewModelWrapper; +class TestSummaryGroupViewModel { + constructor(testSummaryGroup, config, includeOthersInTotal) { + this.GroupName = this.getDescription(testSummaryGroup.groupedBy); + this.InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal); + this.InitializeSupportedPriorityColumns(); + } + InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal) { + this.SummaryItems = new TestSummaryItemViewModel_1.TestSummaryItemViewModelWrapper(); + this.SummaryItems.TestSummaryItemViewModel = []; + testSummaryGroup.runs.forEach(testSummaryItem => { + this.SummaryItems.TestSummaryItemViewModel.push(new TestSummaryItemViewModel_1.TestSummaryItemViewModel(testSummaryGroup.groupedBy, testSummaryItem, config, includeOthersInTotal)); + }); + } + InitializeSupportedPriorityColumns() { + this.SupportedPriorityColumns = new Set(); + this.SummaryItems.TestSummaryItemViewModel.forEach(item => item.TestsByPriority.TestInfoByPriorityViewModel.forEach(testsByPriorityVm => { + if (testsByPriorityVm.Priority <= TestResultSummaryViewModel_1.TestResultSummaryViewModel.MaxSupportedPriority) { + this.SupportedPriorityColumns.add(testsByPriorityVm.Priority); + } + })); + } + getDescription(groupedBy) { + switch (groupedBy) { + case GroupTestResultsBy_1.GroupTestResultsBy.Priority: return "Priority"; + case GroupTestResultsBy_1.GroupTestResultsBy.Run: return "Test Run"; + default: return "Team"; + } + } +} +exports.TestSummaryGroupViewModel = TestSummaryGroupViewModel; +//# sourceMappingURL=TestSummaryGroupViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js.map new file mode 100644 index 00000000..320e62a9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryGroupViewModel.js","sourceRoot":"","sources":["TestSummaryGroupViewModel.ts"],"names":[],"mappings":";;;AAEA,yEAAuG;AACvG,6EAA0E;AAC1E,+EAA4E;AAE5E,MAAa,gCAAgC;CAE5C;AAFD,4EAEC;AAED,MAAa,yBAAyB;IAKpC,YAAY,gBAAuC,EACjD,MAA6B,EAC7B,oBAA6B;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAE5E,IAAI,CAAC,kCAAkC,EAAE,CAAC;IAC5C,CAAC;IAEO,sBAAsB,CAC5B,gBAAuC,EACvC,MAA6B,EAC7B,oBAA6B;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,0DAA+B,EAAE,CAAC;QAC1D,IAAI,CAAC,YAAY,CAAC,wBAAwB,GAAG,EAAE,CAAC;QAChD,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;YAC9C,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,mDAAwB,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3J,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,kCAAkC;QACxC,IAAI,CAAC,wBAAwB,GAAG,IAAI,GAAG,EAAU,CAAC;QAElD,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CACxD,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;YAC3E,IAAI,iBAAiB,CAAC,QAAQ,IAAI,uDAA0B,CAAC,oBAAoB,EAAE;gBACjF,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;aAC/D;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,SAA6B;QAClD,QAAQ,SAAS,EAAE;YACjB,KAAK,uCAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,UAAU,CAAC;YACpD,KAAK,uCAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,UAAU,CAAC;YAC/C,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;SACxB;IACH,CAAC;CACF;AA5CD,8DA4CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.d.ts new file mode 100644 index 00000000..b1d8c132 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.d.ts @@ -0,0 +1,15 @@ +import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; +import { TestInfoByPriorityViewModelWrapper } from "./TestInfoByPriorityViewModel"; +import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; +export declare class TestSummaryItemViewModelWrapper { + TestSummaryItemViewModel: TestSummaryItemViewModel[]; +} +export declare class TestSummaryItemViewModel extends TestResultSummaryViewModel { + Name: string; + TestsByPriority: TestInfoByPriorityViewModelWrapper; + constructor(groupedBy: GroupTestResultsBy, summaryItem: TestSummaryItemModel, config: PipelineConfiguration, includeOthersInTotal: boolean); + private setupPriorityData; + getDisplayName(priority: string): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js new file mode 100644 index 00000000..78194d33 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryItemViewModel = exports.TestSummaryItemViewModelWrapper = void 0; +const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); +const TestInfoByPriorityViewModel_1 = require("./TestInfoByPriorityViewModel"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +class TestSummaryItemViewModelWrapper { +} +exports.TestSummaryItemViewModelWrapper = TestSummaryItemViewModelWrapper; +class TestSummaryItemViewModel extends TestResultSummaryViewModel_1.TestResultSummaryViewModel { + constructor(groupedBy, summaryItem, config, includeOthersInTotal) { + super(summaryItem, null, config, includeOthersInTotal); + this.TestsByPriority = new TestInfoByPriorityViewModel_1.TestInfoByPriorityViewModelWrapper(); + this.Name = (groupedBy == GroupTestResultsBy_1.GroupTestResultsBy.Priority) ? + this.getDisplayName(summaryItem.$name) : + summaryItem.$name; + this.setupPriorityData(summaryItem, includeOthersInTotal); + } + setupPriorityData(summaryItem, includeOthersInTotal) { + this.TestsByPriority.TestInfoByPriorityViewModel = []; + const testCountForOutcomeByPriority = summaryItem.$testCountForOutcomeByPriority; + testCountForOutcomeByPriority.forEach((value, priority) => { + if (priority <= TestResultSummaryViewModel_1.TestResultSummaryViewModel.MaxSupportedPriority) { + this.TestsByPriority.TestInfoByPriorityViewModel.push(new TestInfoByPriorityViewModel_1.TestInfoByPriorityViewModel(priority, value, includeOthersInTotal)); + } + }); + } + getDisplayName(priority) { + const priorityInt = Number.parseInt(priority); + if (!isNaN(priorityInt) && priorityInt == 255) { + return "Priority unspecified"; + } + return `Priority: ${priority}`; + } +} +exports.TestSummaryItemViewModel = TestSummaryItemViewModel; +//# sourceMappingURL=TestSummaryItemViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js.map new file mode 100644 index 00000000..19641149 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryItemViewModel.js","sourceRoot":"","sources":["TestSummaryItemViewModel.ts"],"names":[],"mappings":";;;AAAA,6EAA0E;AAC1E,+EAAgH;AAGhH,+EAA4E;AAG5E,MAAa,+BAA+B;CAE3C;AAFD,0EAEC;AAED,MAAa,wBAAyB,SAAQ,uDAA0B;IAItE,YACE,SAA6B,EAC7B,WAAiC,EACjC,MAA6B,EAC7B,oBAA6B;QAC7B,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAPlD,oBAAe,GAAuC,IAAI,gEAAkC,EAAE,CAAC;QAQpG,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,IAAI,uCAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,WAAW,CAAC,KAAK,CAAC;QAEpB,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IAC5D,CAAC;IAEO,iBAAiB,CAAC,WAAiC,EAAE,oBAA6B;QACxF,IAAI,CAAC,eAAe,CAAC,2BAA2B,GAAG,EAAE,CAAC;QAEtD,MAAM,6BAA6B,GACjC,WAAW,CAAC,8BAA8B,CAAC;QAE7C,6BAA6B,CAAC,OAAO,CAAC,CAAC,KAA0C,EAAE,QAAgB,EAAE,EAAE;YACrG,IAAI,QAAQ,IAAI,uDAA0B,CAAC,oBAAoB,EAAE;gBAC/D,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,yDAA2B,CAAC,QAAQ,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC;aAC/H;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,QAAgB;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE;YAC7C,OAAO,sBAAsB,CAAC;SAC/B;QACD,OAAO,aAAa,QAAQ,EAAE,CAAC;IACjC,CAAC;CACF;AArCD,4DAqCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.d.ts new file mode 100644 index 00000000..d4d1babd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.d.ts @@ -0,0 +1,14 @@ +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export declare class WorkItemViewModelWrapper { + WorkItemViewModel: WorkItemViewModel[]; +} +export declare class WorkItemViewModel { + AssignedTo: string; + ChangedDate: string; + Id: number; + State: string; + Title: string; + Url: string; + constructor(config: PipelineConfiguration, workItem: WorkItem); +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js new file mode 100644 index 00000000..acde0aad --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkItemViewModel = exports.WorkItemViewModelWrapper = void 0; +const LinkHelper_1 = require("../helpers/LinkHelper"); +const StringUtils_1 = require("../../utils/StringUtils"); +const util_1 = require("util"); +class WorkItemViewModelWrapper { +} +exports.WorkItemViewModelWrapper = WorkItemViewModelWrapper; +class WorkItemViewModel { + constructor(config, workItem) { + if (workItem.id != null) { + this.Id = workItem.id; + this.Url = LinkHelper_1.LinkHelper.getWorkItemLink(config, workItem.id); + } + this.Title = workItem.fields["System.Title"]; + // This is for display in email report only + var assignToRef = workItem.fields["System.AssignedTo"]; + // Prefer Display name to Unique Name in report + this.AssignedTo = util_1.isNullOrUndefined(assignToRef) ? "" : (StringUtils_1.StringUtils.isNullOrWhiteSpace(assignToRef.displayName) ? assignToRef.uniqueName : assignToRef.displayName); + // Unassigned workitem + this.AssignedTo = util_1.isNullOrUndefined(this.AssignedTo) ? "" : this.AssignedTo; + this.State = workItem.fields["System.State"]; + this.ChangedDate = workItem.fields["System.ChangedDate"]; + } +} +exports.WorkItemViewModel = WorkItemViewModel; +//# sourceMappingURL=WorkItemViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js.map new file mode 100644 index 00000000..5324f5b6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"WorkItemViewModel.js","sourceRoot":"","sources":["WorkItemViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,yDAAsD;AACtD,+BAAyC;AAEzC,MAAa,wBAAwB;CAEpC;AAFD,4DAEC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,MAA6B,EAAE,QAAkB;QAC3D,IAAI,QAAQ,CAAC,EAAE,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC5D;QAED,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE7C,2CAA2C;QAC3C,IAAI,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACvD,+CAA+C;QAC/C,IAAI,CAAC,UAAU,GAAG,wBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACrK,sBAAsB;QACtB,IAAI,CAAC,UAAU,GAAG,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAE5E,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC;CACF;AA1BD,8CA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/package-lock.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/package-lock.json similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/package-lock.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/package-lock.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/package.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/package.json similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/package.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/package.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.d.ts new file mode 100644 index 00000000..cefac9c4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.d.ts @@ -0,0 +1,14 @@ +import { IDataProviderFactory } from "./IDataProviderFactory"; +import { IDataProvider } from "./IDataProvider"; +import { IPostProcessor } from "./IPostProcessor"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +export declare class DataProviderFactory implements IDataProviderFactory { + private pipelineConfig; + private dataProviders; + private postProcessors; + private testResultsClient; + constructor($pipelineConfig: PipelineConfiguration); + getDataProviders(): IDataProvider[]; + getPostProcessors(): IPostProcessor[]; + private getTestResultsClient; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js new file mode 100644 index 00000000..3bcb7b68 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DataProviderFactory = void 0; +const PipelineType_1 = require("../config/pipeline/PipelineType"); +const ReleaseDataProvider_1 = require("./pipeline/ReleaseDataProvider"); +const ReleaseClient_1 = require("./restclients/ReleaseClient"); +const TestOwnersDataProvider_1 = require("./tcmproviders/TestOwnersDataProvider"); +const TestSummaryDataProvider_1 = require("./tcmproviders/TestSummaryDataProvider"); +const TestResultsDataProvider_1 = require("./tcmproviders/TestResultsDataProvider"); +const WorkItemClient_1 = require("./restclients/WorkItemClient"); +const SendMailConditionProcessor_1 = require("./SendMailConditionProcessor"); +const BuildClient_1 = require("./restclients/BuildClient"); +const BuildDataProvider_1 = require("./pipeline/BuildDataProvider"); +const BuildTestResultsClient_1 = require("./restclients/BuildTestResultsClient"); +const ReleaseTestResultsClient_1 = require("./restclients/ReleaseTestResultsClient"); +class DataProviderFactory { + constructor($pipelineConfig) { + this.dataProviders = []; + this.postProcessors = []; + this.pipelineConfig = $pipelineConfig; + } + getDataProviders() { + if (this.dataProviders.length < 1) { + if (this.pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Release) { + const pipelineRestClient = new ReleaseClient_1.ReleaseRestClient(this.pipelineConfig); + this.dataProviders.push(new ReleaseDataProvider_1.ReleaseDataProvider(pipelineRestClient)); + } + else { + const pipelineRestClient = new BuildClient_1.BuildRestClient(this.pipelineConfig); + this.dataProviders.push(new BuildDataProvider_1.BuildDataProvider(pipelineRestClient)); + } + const testResultsClient = this.getTestResultsClient(); + const workItemClient = new WorkItemClient_1.WorkItemClient(this.pipelineConfig); + this.dataProviders.push(new TestOwnersDataProvider_1.TestOwnersDataProvider(testResultsClient)); + this.dataProviders.push(new TestSummaryDataProvider_1.TestSummaryDataProvider(testResultsClient)); + this.dataProviders.push(new TestResultsDataProvider_1.TestResultsDataProvider(testResultsClient, workItemClient)); + } + return this.dataProviders; + } + getPostProcessors() { + if (this.postProcessors.length < 1) { + this.postProcessors.push(new SendMailConditionProcessor_1.SendMailConditionProcessor(this.getTestResultsClient())); + } + return this.postProcessors; + } + getTestResultsClient() { + if (this.testResultsClient == null) { + this.testResultsClient = this.pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build ? + new BuildTestResultsClient_1.BuildTestResultsClient(this.pipelineConfig) : + new ReleaseTestResultsClient_1.ReleaseTestResultsClient(this.pipelineConfig); + } + return this.testResultsClient; + } +} +exports.DataProviderFactory = DataProviderFactory; +//# sourceMappingURL=DataProviderFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js.map new file mode 100644 index 00000000..8c21bdb2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DataProviderFactory.js","sourceRoot":"","sources":["DataProviderFactory.ts"],"names":[],"mappings":";;;AAIA,kEAA+D;AAC/D,wEAAqE;AACrE,+DAAgE;AAChE,kFAA+E;AAC/E,oFAAiF;AACjF,oFAAiF;AACjF,iEAA8D;AAC9D,6EAA0E;AAC1E,2DAA4D;AAC5D,oEAAiE;AAEjE,iFAA8E;AAC9E,qFAAkF;AAElF,MAAa,mBAAmB;IAQ9B,YAAY,eAAsC;QAL1C,kBAAa,GAAoB,EAAE,CAAC;QACpC,mBAAc,GAAqB,EAAE,CAAC;QAK5C,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;IACxC,CAAC;IAEM,gBAAgB;QACrB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,OAAO,EAAE;gBAC7D,MAAM,kBAAkB,GAAG,IAAI,iCAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACtE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC;aACtE;iBAAM;gBACL,MAAM,kBAAkB,GAAG,IAAI,6BAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACpE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,qCAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC;aACpE;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE/D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,+CAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iDAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iDAAuB,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;SACzF;QAED,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEM,iBAAiB;QACtB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,uDAA0B,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;SACvF;QAED,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,oBAAoB;QAC1B,IAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE;YACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC;gBAChF,IAAI,+CAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACjD,IAAI,mDAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACrD;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AAhDD,kDAgDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/DataProviderFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/DataProviderFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.d.ts new file mode 100644 index 00000000..bb18722d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.d.ts @@ -0,0 +1,6 @@ +import { Report } from "../model/Report"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ReportDataConfiguration } from "../config/report/ReportDataConfiguration"; +export interface IDataProvider { + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js new file mode 100644 index 00000000..b8225b61 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js.map new file mode 100644 index 00000000..48b33d63 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IDataProvider.js","sourceRoot":"","sources":["IDataProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.d.ts new file mode 100644 index 00000000..a22567be --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.d.ts @@ -0,0 +1,6 @@ +import { IDataProvider } from "./IDataProvider"; +import { IPostProcessor } from "./IPostProcessor"; +export interface IDataProviderFactory { + getDataProviders(): IDataProvider[]; + getPostProcessors(): IPostProcessor[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js new file mode 100644 index 00000000..1653e44f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IDataProviderFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js.map new file mode 100644 index 00000000..ee835e22 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IDataProviderFactory.js","sourceRoot":"","sources":["IDataProviderFactory.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IDataProviderFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IDataProviderFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.d.ts new file mode 100644 index 00000000..0c1f4301 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.d.ts @@ -0,0 +1,5 @@ +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { Report } from "../model/Report"; +export interface IPostProcessor { + processReportAsync(reportConfig: ReportConfiguration, finalReport: Report): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js new file mode 100644 index 00000000..b119f9a9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IPostProcessor.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js.map new file mode 100644 index 00000000..64da73b0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IPostProcessor.js","sourceRoot":"","sources":["IPostProcessor.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IPostProcessor.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IPostProcessor.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.d.ts new file mode 100644 index 00000000..3a18e882 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.d.ts @@ -0,0 +1,5 @@ +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +export interface IReportProvider { + createReportAsync(reportConfig: ReportConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js new file mode 100644 index 00000000..462734a9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IReportProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js.map new file mode 100644 index 00000000..141696fa --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IReportProvider.js","sourceRoot":"","sources":["IReportProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IReportProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/IReportProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.d.ts new file mode 100644 index 00000000..4707ea61 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.d.ts @@ -0,0 +1,12 @@ +import { IReportProvider } from "./IReportProvider"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { Report } from "../model/Report"; +import { IDataProviderFactory } from "./IDataProviderFactory"; +export declare class ReportProvider implements IReportProvider { + private dataProviders; + private postProcessors; + constructor(dataProviderFactory: IDataProviderFactory); + createReportAsync(reportConfig: ReportConfiguration): Promise; + private callDataProvider; + private callPostProcessor; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js new file mode 100644 index 00000000..a4eb6732 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js @@ -0,0 +1,86 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReportProvider = void 0; +const ReportFactory_1 = require("../model/ReportFactory"); +const ReportError_1 = require("../exceptions/ReportError"); +const DataProviderError_1 = require("../exceptions/DataProviderError"); +const PostProcessorError_1 = require("../exceptions/PostProcessorError"); +const TelemetryLogger_1 = require("../telemetry/TelemetryLogger"); +class ReportProvider { + constructor(dataProviderFactory) { + this.dataProviders = []; + this.postProcessors = []; + this.dataProviders.push(...dataProviderFactory.getDataProviders()); + this.postProcessors.push(...dataProviderFactory.getPostProcessors()); + } + createReportAsync(reportConfig) { + return __awaiter(this, void 0, void 0, function* () { + let finalReport; + try { + const reportTaskArray = this.dataProviders.map(dataProvider => TelemetryLogger_1.TelemetryLogger.InvokeWithPerfLogger(() => __awaiter(this, void 0, void 0, function* () { return this.callDataProvider(dataProvider, reportConfig); }), dataProvider.constructor.name)); + const reports = yield Promise.all(reportTaskArray); + finalReport = ReportFactory_1.ReportFactory.mergeReports(reports); + // Post Process data collected + const processorTasks = this.postProcessors.map(processor => TelemetryLogger_1.TelemetryLogger.InvokeWithPerfLogger(() => __awaiter(this, void 0, void 0, function* () { return this.callPostProcessor(processor, reportConfig, finalReport); }), processor.constructor.name)); + // Wait for all processors + yield Promise.all(processorTasks); + } + catch (err) { + ReportError_1.ReportError.HandleError(err); + if (finalReport == null) + finalReport = ReportFactory_1.ReportFactory.createNewReport(reportConfig.$pipelineConfiguration); + finalReport.$dataMissing = true; + } + return finalReport; + }); + } + callDataProvider(dataProvider, reportConfig) { + return __awaiter(this, void 0, void 0, function* () { + let report = null; + try { + report = yield dataProvider.getReportDataAsync(reportConfig.$pipelineConfiguration, reportConfig.$reportDataConfiguration); + } + catch (err) { + // Do not error out until all data providers are done + console.log(err); + if (!(err instanceof ReportError_1.ReportError)) { + const reportError = new DataProviderError_1.DataProviderError(`Error fetching data using ${dataProvider.constructor.name}: ${err.message}`); + reportError.innerError = err; + throw reportError; + } + throw err; + } + return report; + }); + } + callPostProcessor(postProcessor, reportConfig, report) { + return __awaiter(this, void 0, void 0, function* () { + let retVal = false; + try { + retVal = yield postProcessor.processReportAsync(reportConfig, report); + } + catch (err) { + // Do not error out until all post processors are done + console.log(err); + if (!(err instanceof ReportError_1.ReportError)) { + const reportError = new PostProcessorError_1.PostProcessorError(`Error fetching data using ${postProcessor.constructor.name}: ${err.message}`); + reportError.innerError = err; + throw reportError; + } + throw err; + } + return retVal; + }); + } +} +exports.ReportProvider = ReportProvider; +//# sourceMappingURL=ReportProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js.map new file mode 100644 index 00000000..71491088 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportProvider.js","sourceRoot":"","sources":["ReportProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/ReportProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/ReportProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.d.ts new file mode 100644 index 00000000..a1317cb3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.d.ts @@ -0,0 +1,14 @@ +import { IPostProcessor } from "./IPostProcessor"; +import { Report } from "../model/Report"; +import { ReportConfiguration } from "../config/ReportConfiguration"; +import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; +import { ITestResultsClient } from "./restclients/ITestResultsClient"; +export declare class SendMailConditionProcessor implements IPostProcessor { + private testResultsClient; + private readonly TestResultFieldsToQuery; + constructor(testResultsClient: ITestResultsClient); + processReportAsync(reportConfig: ReportConfiguration, report: Report): Promise; + hasPreviousReleaseGotSameFailuresAsync(report: Report, config: PipelineConfiguration, hasTestFailures: boolean, hasFailedTasks: boolean): Promise; + private getFailureCountFromSummary; + private fetchFailedTestCaseIdsAsync; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js new file mode 100644 index 00000000..992128e1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js @@ -0,0 +1,140 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SendMailConditionProcessor = void 0; +const SendMailCondition_1 = require("../config/report/SendMailCondition"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const util_1 = require("util"); +const TcmHelper_1 = require("./tcmproviders/TcmHelper"); +const AbstractTestResultsClient_1 = require("./restclients/AbstractTestResultsClient"); +const EnumUtils_1 = require("../utils/EnumUtils"); +class SendMailConditionProcessor { + constructor(testResultsClient) { + this.TestResultFieldsToQuery = ["TestCaseReferenceId", "OutcomeConfidence"]; + this.testResultsClient = testResultsClient; + } + processReportAsync(reportConfig, report) { + return __awaiter(this, void 0, void 0, function* () { + var shouldSendMail = false; + if (!report.$dataMissing) { + const sendMailCondition = reportConfig.$sendMailCondition; + shouldSendMail = sendMailCondition == SendMailCondition_1.SendMailCondition.Always; + if (!shouldSendMail) { + var hasTestFailures = report.hasFailedTests(reportConfig.$reportDataConfiguration.$includeOthersInTotal); + var hasFailedTasks = report.hasFailedTasks(); + var hasCanceledPhases = report.hasCanceledPhases(); + var hasFailure = hasTestFailures || hasFailedTasks || hasCanceledPhases; + if ((sendMailCondition == SendMailCondition_1.SendMailCondition.OnFailure && hasFailure) + || (sendMailCondition == SendMailCondition_1.SendMailCondition.OnSuccess && !hasFailure)) { + shouldSendMail = true; + } + else if (sendMailCondition == SendMailCondition_1.SendMailCondition.OnNewFailuresOnly && hasFailure) { + // Always treat phase cancellation issues as new failure as we cannot distinguish/compare phase level issues + // Still compare failed tests and failed tasks where possible to reduce noise + if (hasCanceledPhases && !hasTestFailures && !hasFailedTasks) { + shouldSendMail = true; + console.log(`Has Phase cancellation(s) issues. Treating as new failure.`); + } + else { + console.log(`Looking for new failures, as the user send mail condition is '${EnumUtils_1.EnumUtils.GetMailConditionString(sendMailCondition)}'.`); + shouldSendMail = !(yield this.hasPreviousReleaseGotSameFailuresAsync(report, reportConfig.$pipelineConfiguration, hasTestFailures, hasFailedTasks)); + } + } + } + } + report.$sendMailConditionSatisfied = shouldSendMail; + return shouldSendMail; + }); + } + hasPreviousReleaseGotSameFailuresAsync(report, config, hasTestFailures, hasFailedTasks) { + return __awaiter(this, void 0, void 0, function* () { + var hasPrevGotSameFailures = report.hasPrevGotSameFailures(); + if (!util_1.isNullOrUndefined(hasPrevGotSameFailures) && hasPrevGotSameFailures) { + return hasPrevGotSameFailures; + } + const hasPrevFailedTasks = report.hasPrevFailedTasks(); + if (report.testResultSummary == null) { + return false; + } + if (hasTestFailures) { + var prevConfig = report.getPrevConfig(config); + if (util_1.isNullOrUndefined(prevConfig)) { + // we don't know anything about prev pipeline failures if we have no info - assume they are not same + return false; + } + var lastCompletedTestResultSummary = yield this.testResultsClient.queryTestResultsReportAsync(prevConfig); + var failedInCurrent = this.getFailureCountFromSummary(report.testResultSummary); + var failedinPrev = this.getFailureCountFromSummary(lastCompletedTestResultSummary); + // Threshold is 10 to decide whether they are same failures + console.log(`Current Failures Found: '${failedInCurrent}'.`); + console.log(`Previous Failures Found: '${failedinPrev}'.`); + var hasSameFailures = failedInCurrent == failedinPrev; + // No point in moving ahead if number of failures is different + if (hasSameFailures) { + var currFailedTestCaseRefIds = yield this.fetchFailedTestCaseIdsAsync(config); + var prevFailedTestCaseRefIds = yield this.fetchFailedTestCaseIdsAsync(prevConfig); + const leftJoin = currFailedTestCaseRefIds.filter(c => !prevFailedTestCaseRefIds.includes(c)); + if (leftJoin.length > 0) { + console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); + hasSameFailures = false; + } + else { + const rightJoin = prevFailedTestCaseRefIds.filter(p => !currFailedTestCaseRefIds.includes(p)); + if (rightJoin.length > 0) { + console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); + hasSameFailures = false; + } + else { + console.log(`Failed Test Reference Ids match. No new failures found.`); + hasSameFailures = true; + } + } + } + return hasSameFailures; + } + else if (hasFailedTasks && hasPrevFailedTasks) { + return report.arePrevFailedTasksSame(); + } + return false; + }); + } + getFailureCountFromSummary(testResultSummary) { + const failedOutcome = testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; + return !util_1.isNullOrUndefined(failedOutcome) ? failedOutcome.count : 0; + } + fetchFailedTestCaseIdsAsync(pipelineConfig) { + return __awaiter(this, void 0, void 0, function* () { + var testSummary = yield this.testResultsClient.getTestResultsDetailsAsync(null, [TestInterfaces_1.TestOutcome.Failed], pipelineConfig); + var resultsToQuery = []; + testSummary.resultsForGroup.forEach(r => resultsToQuery.push(...r.results)); + var testCaseIds = []; + if (resultsToQuery.length > 0) { + // API supports only 100 results at a time + const tasks = []; + for (let i = 0, j = resultsToQuery.length; i < j; i += 100) { + const tempArray = resultsToQuery.slice(i, i + 100); + let query = new AbstractTestResultsClient_1.TestResultsQueryImpl(); + query.fields = this.TestResultFieldsToQuery; + query.results = tempArray; + tasks.push(this.testResultsClient.getTestResultsByQueryAsync(query)); + } + const resultQueries = yield Promise.all(tasks); + resultQueries.forEach(rq => { + let tempIds = rq.results.filter(r => TcmHelper_1.TcmHelper.isTestFlaky(r)).map(r1 => r1.testCaseReferenceId); + testCaseIds.push(...tempIds); + }); + } + return testCaseIds; + }); + } +} +exports.SendMailConditionProcessor = SendMailConditionProcessor; +//# sourceMappingURL=SendMailConditionProcessor.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js.map new file mode 100644 index 00000000..113e7bc5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SendMailConditionProcessor.js","sourceRoot":"","sources":["SendMailConditionProcessor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/SendMailConditionProcessor.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/SendMailConditionProcessor.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.d.ts new file mode 100644 index 00000000..7e4dc619 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.d.ts @@ -0,0 +1,9 @@ +import { TestResultsDetails, TestResultsDetailsForGroup } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +export declare abstract class AbstractTestResultsDetailsParser { + protected testResultDetails: TestResultsDetails; + constructor(testResultDetails: TestResultsDetails); + abstract getSummaryItems(): Array; + abstract getGroupByValue(group: TestResultsDetailsForGroup): string; + protected parseBaseData(resultsForGroup: TestResultsDetailsForGroup, summaryItem: TestSummaryItemModel): void; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js new file mode 100644 index 00000000..1e57f6fe --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AbstractTestResultsDetailsParser = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const util_1 = require("util"); +const TimeFormatter_1 = require("../../model/helpers/TimeFormatter"); +class AbstractTestResultsDetailsParser { + constructor(testResultDetails) { + this.testResultDetails = testResultDetails; + } + /// + /// Get Duration, TotalTests & test count by outcome + /// Calculating total duration, as the tcm data has duration by test outcome only. + /// + parseBaseData(resultsForGroup, summaryItem) { + let duration = 0; + for (let item in TestInterfaces_1.TestOutcome) { + if (!isNaN(Number(item))) { + const resultsByOutCome = resultsForGroup.resultsCountByOutcome[Number(item)]; + if (!util_1.isNullOrUndefined(resultsByOutCome)) { + summaryItem.$testCountByOutcome.set(resultsByOutCome.outcome, resultsByOutCome.count); + duration += TimeFormatter_1.TimeFormatter.ConvertTimeStringToMilliSeconds(resultsByOutCome.duration); + } + } + } + // // HACK - SHould get data directly from resultsGroup.resultsCountByOutcome - but that data is coming wrong + // resultsForGroup.results.forEach(r => { + // duration += isNaN(r.durationInMs) ? 0 : r.durationInMs; + // }); + summaryItem.$duration = duration; + summaryItem.$totalTestCount = resultsForGroup.results.length; + } +} +exports.AbstractTestResultsDetailsParser = AbstractTestResultsDetailsParser; +//# sourceMappingURL=AbstractTestResultsDetailsParser.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js.map new file mode 100644 index 00000000..d2aa53e6 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbstractTestResultsDetailsParser.js","sourceRoot":"","sources":["AbstractTestResultsDetailsParser.ts"],"names":[],"mappings":";;;AAAA,oFAA0K;AAE1K,+BAAyC;AACzC,qEAAkE;AAElE,MAAsB,gCAAgC;IAIpD,YAAY,iBAAqC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAMD,aAAa;IACb,oDAAoD;IACpD,kFAAkF;IAClF,cAAc;IACJ,aAAa,CAAC,eAA2C,EAAE,WAAiC;QACpG,IAAI,QAAQ,GAAW,CAAC,CAAC;QACzB,KAAK,IAAI,IAAI,IAAI,4BAAW,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;gBACxB,MAAM,gBAAgB,GAAG,eAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7E,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,EAAE;oBACxC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACtF,QAAQ,IAAI,6BAAa,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;iBACtF;aACF;SACF;QAED,6GAA6G;QAC7G,yCAAyC;QACzC,4DAA4D;QAC5D,MAAM;QAEN,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC;QACjC,WAAW,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/D,CAAC;CAMF;AAzCD,4EAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.d.ts new file mode 100644 index 00000000..78c07e95 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.d.ts @@ -0,0 +1,5 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultDetailsParserFactory { + static getParser(resultDetails: TestResultsDetails): AbstractTestResultsDetailsParser; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js new file mode 100644 index 00000000..28109614 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultDetailsParserFactory = void 0; +const TestResultDetailsParserForRun_1 = require("./TestResultDetailsParserForRun"); +const TestResultDetailsParserForPriority_1 = require("./TestResultDetailsParserForPriority"); +const DataProviderError_1 = require("../../exceptions/DataProviderError"); +class TestResultDetailsParserFactory { + static getParser(resultDetails) { + var groupByField = resultDetails.groupByField; + if (groupByField.toLowerCase() == "TestRun".toLowerCase()) { + return new TestResultDetailsParserForRun_1.TestResultDetailsParserForRun(resultDetails); + } + if (groupByField.toLowerCase() == "Priority".toLowerCase()) { + return new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(resultDetails); + } + throw new DataProviderError_1.DataProviderError(`TestResultsDetails by group ${groupByField} not supported`); + } +} +exports.TestResultDetailsParserFactory = TestResultDetailsParserFactory; +//# sourceMappingURL=TestResultDetailsParserFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js.map new file mode 100644 index 00000000..391d7fbc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultDetailsParserFactory.js","sourceRoot":"","sources":["TestResultDetailsParserFactory.ts"],"names":[],"mappings":";;;AAEA,mFAAgF;AAChF,6FAA0F;AAC1F,0EAAuE;AAEvE,MAAa,8BAA8B;IAClC,MAAM,CAAC,SAAS,CAAC,aAAiC;QACvD,IAAI,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAC9C,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YACzD,OAAO,IAAI,6DAA6B,CAAC,aAAa,CAAC,CAAC;SACzD;QAED,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE;YAC1D,OAAO,IAAI,uEAAkC,CAAC,aAAa,CAAC,CAAC;SAC9D;QAED,MAAM,IAAI,qCAAiB,CAAC,+BAA+B,YAAY,gBAAgB,CAAC,CAAC;IAC3F,CAAC;CACF;AAbD,wEAaC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.d.ts new file mode 100644 index 00000000..9844cd01 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.d.ts @@ -0,0 +1,11 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser { + constructor(testResultDetails: TestResultsDetails); + getSummaryItems(): TestSummaryItemModel[]; + getGroupByValue(group: TestResultsDetailsForGroup): string; + getTestResultsForRun(runId: number): Map; + private getPriority; + private getTestCountByPriorityInTestRun; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js new file mode 100644 index 00000000..24e313c8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js @@ -0,0 +1,64 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultDetailsParserForPriority = void 0; +const AbstractTestResultsDetailsParser_1 = require("./AbstractTestResultsDetailsParser"); +const TestSummaryItemModel_1 = require("../../model/testresults/TestSummaryItemModel"); +const InvalidTestResultDataError_1 = require("../../exceptions/InvalidTestResultDataError"); +class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser_1.AbstractTestResultsDetailsParser { + constructor(testResultDetails) { + super(testResultDetails); + if (testResultDetails.groupByField.toUpperCase() != "Priority".toUpperCase()) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); + } + } + getSummaryItems() { + const resultsForGroup = this.testResultDetails.resultsForGroup; + if (resultsForGroup != null && resultsForGroup.length > 0) { + return resultsForGroup.map(group => { + var priority = this.getPriority(group.groupByValue); + var summaryItem = new TestSummaryItemModel_1.TestSummaryItemModel(priority.toString(), priority.toString()); + this.parseBaseData(group, summaryItem); + return summaryItem; + }); + } + return []; + } + getGroupByValue(group) { + return this.getPriority(group.groupByValue).toString(); + } + getTestResultsForRun(runId) { + const testResultsByPriority = this.getTestCountByPriorityInTestRun(); + return testResultsByPriority.has(runId) ? testResultsByPriority.get(runId) : new Map(); + } + getPriority(groupByValue) { + let priority = Number.parseInt(groupByValue); + if (priority == null || Number.isNaN(priority)) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected priority value to be integer in ${groupByValue}`); + } + return priority; + } + getTestCountByPriorityInTestRun() { + var testResultsByPriority = new Map(); + this.testResultDetails.resultsForGroup.forEach(testResultsByGroup => { + var priority = this.getPriority(testResultsByGroup.groupByValue); + testResultsByGroup.results.forEach(result => { + if (result.testRun == null) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Test run field is null in Test result object with test id - ${result.id}`); + } + const testRunId = Number.parseInt(result.testRun.id); + if (testRunId == null || Number.isNaN(testRunId)) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Unable to parse test run id to integer in ${result.testRun.id}`); + } + if (!testResultsByPriority.has(testRunId)) { + testResultsByPriority.set(testRunId, new Map()); + } + const resultsByPriorityForRun = testResultsByPriority.get(testRunId); + var testCountByPriority = resultsByPriorityForRun.has(priority) ? resultsByPriorityForRun.get(priority) : 0; + resultsByPriorityForRun.set(priority, testCountByPriority + 1); + }); + }); + return testResultsByPriority; + } +} +exports.TestResultDetailsParserForPriority = TestResultDetailsParserForPriority; +//# sourceMappingURL=TestResultDetailsParserForPriority.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js.map new file mode 100644 index 00000000..3fa90f2c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultDetailsParserForPriority.js","sourceRoot":"","sources":["TestResultDetailsParserForPriority.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.d.ts new file mode 100644 index 00000000..db1b8ead --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.d.ts @@ -0,0 +1,14 @@ +import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; +import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; +import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser { + constructor(testResultDetails: TestResultsDetails); + getSummaryItems(): TestSummaryItemModel[]; + getGroupByValue(group: TestResultsDetailsForGroup): string; + private getTestRunSummaryInfo; + private readGroupByValue; +} +export declare class TestRunInfo { + id: number; + name: string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js new file mode 100644 index 00000000..100ed24f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestRunInfo = exports.TestResultDetailsParserForRun = void 0; +const AbstractTestResultsDetailsParser_1 = require("./AbstractTestResultsDetailsParser"); +const TestSummaryItemModel_1 = require("../../model/testresults/TestSummaryItemModel"); +const InvalidTestResultDataError_1 = require("../../exceptions/InvalidTestResultDataError"); +class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser_1.AbstractTestResultsDetailsParser { + constructor(testResultDetails) { + super(testResultDetails); + if (testResultDetails.groupByField.toUpperCase() != "TestRun".toUpperCase()) { + throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); + } + } + getSummaryItems() { + return this.testResultDetails.resultsForGroup.map(r => this.getTestRunSummaryInfo(r)); + } + getGroupByValue(group) { + const runinfo = this.readGroupByValue(group); + return runinfo.name; + } + getTestRunSummaryInfo(resultsForGroup) { + console.log(`Getting Test summary data for test run - ${resultsForGroup.groupByValue.name}`); + const runinfo = this.readGroupByValue(resultsForGroup); + var summaryItem = new TestSummaryItemModel_1.TestSummaryItemModel(runinfo.name == null ? runinfo.id.toString() : runinfo.name, runinfo.id.toString()); + this.parseBaseData(resultsForGroup, summaryItem); + return summaryItem; + } + readGroupByValue(resultsForGroup) { + const runinfo = new TestRunInfo(); + runinfo.id = resultsForGroup.groupByValue.id; + runinfo.name = resultsForGroup.groupByValue.name; + return runinfo; + } +} +exports.TestResultDetailsParserForRun = TestResultDetailsParserForRun; +class TestRunInfo { +} +exports.TestRunInfo = TestRunInfo; +//# sourceMappingURL=TestResultDetailsParserForRun.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js.map new file mode 100644 index 00000000..3e9c3db0 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultDetailsParserForRun.js","sourceRoot":"","sources":["TestResultDetailsParserForRun.ts"],"names":[],"mappings":";;;AAAA,yFAAsF;AACtF,uFAAoF;AAEpF,4FAAyF;AAEzF,MAAa,6BAA8B,SAAQ,mEAAgC;IAEjF,YAAY,iBAAqC;QAC/C,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzB,IAAI,iBAAiB,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YAC3E,MAAM,IAAI,uDAA0B,CAAC,6DAA6D,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC;SACrI;IACH,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IAEM,eAAe,CAAC,KAAiC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAEO,qBAAqB,CAAC,eAA2C;QACvE,OAAO,CAAC,GAAG,CAAC,4CAA4C,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAEvD,IAAI,WAAW,GAAG,IAAI,2CAAoB,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE/H,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAEjD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,gBAAgB,CAAC,eAA2C;QAClE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAnCD,sEAmCC;AAED,MAAa,WAAW;CAIvB;AAJD,kCAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.d.ts new file mode 100644 index 00000000..eaf08ab5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.d.ts @@ -0,0 +1,14 @@ +import { IDataProvider } from "../IDataProvider"; +import { Report } from "../../model/Report"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; +export declare class BuildDataProvider implements IDataProvider { + private pipelineRestClient; + constructor(pipelineRestClient: IPipelineRestClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; + private getBuildAsync; + private getPhases; + private getTaskState; + private getOrder; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js new file mode 100644 index 00000000..a5a4f067 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js @@ -0,0 +1,101 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildDataProvider = void 0; +const PipelineNotFoundError_1 = require("../../exceptions/PipelineNotFoundError"); +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const PhaseModel_1 = require("../../model/PhaseModel"); +const JobModel_1 = require("../../model/JobModel"); +const TaskModel_1 = require("../../model/TaskModel"); +const IssueModel_1 = require("../../model/IssueModel"); +const ReportFactory_1 = require("../../model/ReportFactory"); +const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); +const util_1 = require("util"); +const RetryablePromise_1 = require("../restclients/RetryablePromise"); +const DataProviderError_1 = require("../../exceptions/DataProviderError"); +class BuildDataProvider { + constructor(pipelineRestClient) { + this.pipelineRestClient = pipelineRestClient; + } + getReportDataAsync(pipelineConfig, reportDataConfiguration) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + const build = yield this.getBuildAsync(pipelineConfig); + if (build == null) { + throw new PipelineNotFoundError_1.PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); + } + const timeline = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineTimelineAsync(build.id); }), "GetBuildTimeline"); + const changes = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineChangesAsync(build.id); }), "GetPipelineChanges"); + const phases = this.getPhases(timeline); + const lastCompletedBuild = yield this.pipelineRestClient.getLastPipelineAsync(build.definition.id, null, build.sourceBranch); + const lastCompletedTimeline = lastCompletedBuild != null ? yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineTimelineAsync(lastCompletedBuild.id); }), "GetLastCompletedTimeline") : null; + console.log("Fetched release data"); + report.setBuildData(build, timeline, lastCompletedBuild, lastCompletedTimeline, phases, changes); + return report; + }); + } + getBuildAsync(pipelineConfig) { + return __awaiter(this, void 0, void 0, function* () { + var build = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineAsync(); }), "GetPipeline"); + if (util_1.isNullOrUndefined(build)) { + throw new DataProviderError_1.DataProviderError(`Unable to find build with id: ${pipelineConfig.$pipelineId}`); + } + return build; + }); + } + getPhases(timeline) { + const records = timeline.records.sort((a, b) => this.getOrder(a) - this.getOrder(b)); + const phases = records.filter(r => r.type == "Phase"); + if (phases.length > 0) { + const jobs = records.filter(r => r.type == "Job"); + if (jobs.length > 0) { + const tasks = records.filter(r => r.type == "Task"); + const phaseModels = phases.map(phase => { + const jobModels = jobs + .filter(j => j.parentId == phase.id) + .map(j => { + const tasksForThisJob = tasks.filter(t => t.parentId == j.id); + const taskModels = tasksForThisJob.map(task => { + const issues = util_1.isNullOrUndefined(task.issues) || task.issues.length < 1 ? [] : + task.issues.map(i => new IssueModel_1.IssueModel(i.type == BuildInterfaces_1.IssueType.Error ? "Error" : "Warning", i.message)); + return new TaskModel_1.TaskModel(task.name, this.getTaskState(task.result), issues, task.workerName, task.finishTime, task.startTime); + }); + return new JobModel_1.JobModel(j.name, this.getTaskState(j.result), [], taskModels); + }); + return new PhaseModel_1.PhaseModel(phase.name, jobModels, util_1.isNullOrUndefined(phase.result) ? "Unknown" : phase.result.toString(), this.getOrder(phase)); + }); + return phaseModels; + } + } + return []; + } + getTaskState(result) { + switch (result) { + case BuildInterfaces_1.TaskResult.Succeeded: + return ReleaseInterfaces_1.TaskStatus.Succeeded; + case BuildInterfaces_1.TaskResult.SucceededWithIssues: + return ReleaseInterfaces_1.TaskStatus.PartiallySucceeded; + case BuildInterfaces_1.TaskResult.Failed: + return ReleaseInterfaces_1.TaskStatus.Failed; + case BuildInterfaces_1.TaskResult.Canceled: + return ReleaseInterfaces_1.TaskStatus.Canceled; + case BuildInterfaces_1.TaskResult.Skipped: + return ReleaseInterfaces_1.TaskStatus.Skipped; + default: + return ReleaseInterfaces_1.TaskStatus.Unknown; + } + } + getOrder(timelineRecord) { + return util_1.isNullOrUndefined(timelineRecord.order) ? 0 : timelineRecord.order; + } +} +exports.BuildDataProvider = BuildDataProvider; +//# sourceMappingURL=BuildDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js.map new file mode 100644 index 00000000..8f9239be --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildDataProvider.js","sourceRoot":"","sources":["BuildDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.d.ts new file mode 100644 index 00000000..6a0c5de3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.d.ts @@ -0,0 +1,15 @@ +import { IDataProvider } from "../IDataProvider"; +import { Report } from "../../model/Report"; +import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +export declare class ReleaseDataProvider implements IDataProvider { + private pipelineRestClient; + constructor(pipelineRestClient: IPipelineRestClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; + private getReleaseAsync; + private getEnvironment; + private getPhases; + private getJobModelsFromPhase; + private getReleaseByLastCompletedEnvironmentAsync; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js new file mode 100644 index 00000000..e6f2cf14 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js @@ -0,0 +1,116 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseDataProvider = void 0; +const PipelineNotFoundError_1 = require("../../exceptions/PipelineNotFoundError"); +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const DataProviderError_1 = require("../../exceptions/DataProviderError"); +const PhaseModel_1 = require("../../model/PhaseModel"); +const EnvironmentExtensions_1 = require("../../utils/EnvironmentExtensions"); +const JobModel_1 = require("../../model/JobModel"); +const TaskModel_1 = require("../../model/TaskModel"); +const IssueModel_1 = require("../../model/IssueModel"); +const ReportFactory_1 = require("../../model/ReportFactory"); +const RetryablePromise_1 = require("../restclients/RetryablePromise"); +const util_1 = require("util"); +class ReleaseDataProvider { + constructor(pipelineRestClient) { + this.pipelineRestClient = pipelineRestClient; + } + getReportDataAsync(pipelineConfig, reportDataConfiguration) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + const release = yield this.getReleaseAsync(pipelineConfig); + if (release == null) { + throw new PipelineNotFoundError_1.PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); + } + const environment = this.getEnvironment(release, pipelineConfig); + const phases = this.getPhases(environment); + const lastCompletedRelease = yield this.getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment); + let changes = []; + // check if last completed one isn't latter one, then changes don't make sense + if (lastCompletedRelease != null && lastCompletedRelease.id < release.id) { + console.log(`Getting changes between releases ${release.id} & ${lastCompletedRelease.id}`); + try { + changes = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineChangesAsync(lastCompletedRelease.id); }), "GetPipelineChanges"); + } + catch (err) { + // Changes happened in current release w.r.t previous one isn't strictly required to send mail - ignoring any errors + console.warn(`Error while comparing current release - '${release.id}' with previous one - '${lastCompletedRelease.id}': ${err}`); + } + } + else { + console.log("Unable to find any last completed release"); + } + console.log("Fetched release data"); + report.setReleaseData(release, environment, lastCompletedRelease, phases, changes); + return report; + }); + } + getReleaseAsync(pipelineConfig) { + return __awaiter(this, void 0, void 0, function* () { + var release = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineAsync(); }), "GetPipeline"); + if (util_1.isNullOrUndefined(release)) { + throw new DataProviderError_1.DataProviderError(`Unable to find release with release id: ${pipelineConfig.$pipelineId}`); + } + return release; + }); + } + getEnvironment(release, pipelineConfig) { + let environment; + const environments = release.environments; + for (var i = 0; i < environments.length; i++) { + if (environments[i].id == pipelineConfig.$environmentId) { + environment = environments[i]; + break; + } + } + if (pipelineConfig.$usePreviousEnvironment && environments.indexOf(environment) > 0) { + environment = environments[environments.indexOf(environment) - 1]; + } + if (environment != null) { + return environment; + } + throw new DataProviderError_1.DataProviderError(`Unable to find environment with environment id - ${pipelineConfig.$environmentId} in release - ${release.id}`); + } + getPhases(environment) { + var releaseDeployPhases = EnvironmentExtensions_1.EnvironmentExtensions.getPhases(environment); + return releaseDeployPhases.map(r => new PhaseModel_1.PhaseModel(r.name, this.getJobModelsFromPhase(r.deploymentJobs), ReleaseInterfaces_1.DeployPhaseStatus[r.status], r.rank)); + } + getJobModelsFromPhase(deploymentJobs) { + const jobModels = deploymentJobs.map(job => { + const issues = job.job.issues.map(i => new IssueModel_1.IssueModel(i.issueType, i.message)); + const tasks = job.tasks.map(t => { + const issues = t.issues.map(i => new IssueModel_1.IssueModel(i.issueType, i.message)); + return new TaskModel_1.TaskModel(t.name, t.status, issues, t.agentName, t.finishTime, t.startTime); + }); + return new JobModel_1.JobModel(job.job.name, job.job.status, issues, tasks); + }); + return jobModels; + } + getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment) { + return __awaiter(this, void 0, void 0, function* () { + let branchId = null; + if (release.artifacts != null && release.artifacts.length > 0) { + const primaryArtifact = release.artifacts.filter(a => a.isPrimary)[0]; + const defRef = primaryArtifact.definitionReference["branch"]; + branchId = defRef != null ? defRef.id : null; + } + console.log(`Fetching last release by completed environment id - ${pipelineConfig.$environmentId} and branch id ${branchId}`); + const lastRelease = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { + return this.pipelineRestClient.getLastPipelineAsync(release.releaseDefinition.id, environment.definitionEnvironmentId, branchId, null); + }), "GetLastCompletedPipeline"); //Bug in API - release.createdOn); + return lastRelease; + }); + } +} +exports.ReleaseDataProvider = ReleaseDataProvider; +//# sourceMappingURL=ReleaseDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js.map new file mode 100644 index 00000000..6ea3a56a --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseDataProvider.js","sourceRoot":"","sources":["ReleaseDataProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,kFAA+E;AAC/E,0FAA6I;AAE7I,0EAAuE;AACvE,uDAAoD;AACpD,6EAA0E;AAC1E,mDAAgD;AAChD,qDAAkD;AAClD,uDAAoD;AAIpD,6DAA0D;AAC1D,sEAAmE;AACnE,+BAAyC;AAEzC,MAAa,mBAAmB;IAI9B,YAAY,kBAAuC;QACjD,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAEK,kBAAkB,CAAC,cAAqC,EAAE,uBAAgD;;YAC9G,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,cAAc,CAAkB,CAAC;YAC9E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAC3D,IAAI,OAAO,IAAI,IAAI,EAAE;gBACnB,MAAM,IAAI,6CAAqB,CAAC,cAAc,cAAc,CAAC,UAAU,KAAK,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;aAC3G;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,yCAAyC,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAExH,IAAI,OAAO,GAAkB,EAAE,CAAC;YAChC,8EAA8E;YAC9E,IAAI,oBAAoB,IAAI,IAAI,IAAI,oBAAoB,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE;gBACxE,OAAO,CAAC,GAAG,CAAC,oCAAoC,OAAO,CAAC,EAAE,MAAM,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3F,IAAI;oBACF,OAAO,GAAG,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA,GAAA,EAAE,oBAAoB,CAAC,CAAC;iBACzJ;gBAAC,OAAM,GAAG,EAAE;oBACX,oHAAoH;oBACpH,OAAO,CAAC,IAAI,CAAC,4CAA4C,OAAO,CAAC,EAAE,0BAA0B,oBAAoB,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;iBAClI;aACF;iBACI;gBACH,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;aAC1D;YAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAEnF,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEa,eAAe,CAAC,cAAqC;;YACjE,IAAI,OAAO,GAAG,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAA,GAAA,EAAE,aAAa,CAAC,CAAC;YACvH,IAAG,wBAAiB,CAAC,OAAO,CAAC,EAAE;gBAC7B,MAAM,IAAI,qCAAiB,CAAC,2CAA2C,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;aACtG;YACD,OAAO,OAAkB,CAAC;QAC5B,CAAC;KAAA;IAEO,cAAc,CAAC,OAAgB,EAAE,cAAqC;QAC5E,IAAI,WAA+B,CAAC;QACpC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpD,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,cAAc,CAAC,cAAc,EAAE;gBACvD,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM;aACP;SACF;QAED,IAAI,cAAc,CAAC,uBAAuB,IAAI,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;YACnF,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;SACnE;QAED,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,OAAO,WAAW,CAAC;SACpB;QAED,MAAM,IAAI,qCAAiB,CAAC,oDAAoD,cAAc,CAAC,cAAc,iBAAiB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9I,CAAC;IAEO,SAAS,CAAC,WAA+B;QAC/C,IAAI,mBAAmB,GAAG,6CAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACvE,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,uBAAU,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,qCAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjJ,CAAC;IAEO,qBAAqB,CAAC,cAA+B;QAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACzC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,uBAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,uBAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzE,OAAO,IAAI,qBAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YACzF,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,mBAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAEa,yCAAyC,CAAC,cAAqC,EAAE,OAAgB,EAAE,WAA+B;;YAC9I,IAAI,QAAQ,GAAW,IAAI,CAAC;YAE5B,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7D,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtE,MAAM,MAAM,GAAG,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC7D,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAC9C;YAED,OAAO,CAAC,GAAG,CAAC,uDAAuD,cAAc,CAAC,cAAc,kBAAkB,QAAQ,EAAE,CAAC,CAAC;YAC9H,MAAM,WAAW,GAAG,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE;gBAAC,OAAA,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EACzI,WAAW,CAAC,uBAAuB,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;cAAA,EAAE,0BAA0B,CAAC,CAAC,CAAC,kCAAkC;YAEvH,OAAO,WAAsB,CAAC;QAChC,CAAC;KAAA;CACF;AArGD,kDAqGC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.d.ts new file mode 100644 index 00000000..d47f0af1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.d.ts @@ -0,0 +1,13 @@ +import { WebApi } from "azure-devops-node-api"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export declare abstract class AbstractClient { + protected connection: WebApi; + protected pipelineConfig: PipelineConfiguration; + constructor(pipelineConfig: PipelineConfiguration); + /** + * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api + * @param uri Default URL + * @param accessToken token to get credentials with access to Api calls + */ + private createConnection; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js new file mode 100644 index 00000000..6b4925cb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AbstractClient = void 0; +const azure_devops_node_api_1 = require("azure-devops-node-api"); +class AbstractClient { + constructor(pipelineConfig) { + this.connection = this.createConnection(pipelineConfig.$teamUri, pipelineConfig.$accessKey); + this.pipelineConfig = pipelineConfig; + } + /** + * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api + * @param uri Default URL + * @param accessToken token to get credentials with access to Api calls + */ + createConnection(uri, accessToken) { + const creds = azure_devops_node_api_1.getPersonalAccessTokenHandler(accessToken); + return new azure_devops_node_api_1.WebApi(uri, creds); + } +} +exports.AbstractClient = AbstractClient; +//# sourceMappingURL=AbstractClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js.map new file mode 100644 index 00000000..4680d5a2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbstractClient.js","sourceRoot":"","sources":["AbstractClient.ts"],"names":[],"mappings":";;;AACA,iEAG+B;AAG/B,MAAsB,cAAc;IAKlC,YAAY,cAAqC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5F,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CAAC,GAAW,EAAE,WAAmB;QACvD,MAAM,KAAK,GAAG,qDAA6B,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,IAAI,8BAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;CACF;AAnBD,wCAmBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.d.ts new file mode 100644 index 00000000..60e99da5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.d.ts @@ -0,0 +1,28 @@ +import { AbstractClient } from "./AbstractClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ITestApi } from "azure-devops-node-api/TestApi"; +import { TestResultsDetails, TestResultSummary, TestOutcome, TestResultsQuery, TestCaseResult, ResultsFilter, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +export declare abstract class AbstractTestResultsClient extends AbstractClient implements ITestResultsClient { + private readonly MaxItemsSupported; + protected testApiPromise: Promise; + constructor(pipelineConfig: PipelineConfiguration); + queryTestResultBugs(automatedTestName: string, resultId: number): Promise; + getTestResultById(testRunId: number, resultId: number): Promise; + queryTestResultsReportAsync(parameterConfig?: PipelineConfiguration): Promise; + getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; + getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], parameterConfig?: PipelineConfiguration): Promise; + getTestResultSummaryAsync(includeFailures: boolean, parameterConfig?: PipelineConfiguration): Promise; + getTestResultsByQueryAsync(query: TestResultsQuery): Promise; + protected abstract getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; + protected abstract queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; + protected getOutcomeFilter(outcomes: TestOutcome[]): string; + private getUniqueName; + private isValid; +} +export declare class TestResultsQueryImpl implements TestResultsQuery { + fields: string[]; + results: TestCaseResult[]; + resultsFilter: ResultsFilter; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js new file mode 100644 index 00000000..710c8de9 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js @@ -0,0 +1,104 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsQueryImpl = exports.AbstractTestResultsClient = void 0; +const AbstractClient_1 = require("./AbstractClient"); +const RetryablePromise_1 = require("./RetryablePromise"); +class AbstractTestResultsClient extends AbstractClient_1.AbstractClient { + constructor(pipelineConfig) { + super(pipelineConfig); + this.MaxItemsSupported = 100; + this.testApiPromise = this.connection.getTestApi(); + } + queryTestResultBugs(automatedTestName, resultId) { + return __awaiter(this, void 0, void 0, function* () { + const testApi = yield this.testApiPromise; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { + return testApi.queryTestResultWorkItems(this.pipelineConfig.$projectName, "Microsoft.BugCategory", automatedTestName, resultId); + }), "QueryTestResultBugs"); + }); + } + getTestResultById(testRunId, resultId) { + return __awaiter(this, void 0, void 0, function* () { + const testApi = yield this.testApiPromise; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return testApi.getTestResultById(this.pipelineConfig.$projectName, testRunId, resultId); }), "GetTestResultById"); + }); + } + queryTestResultsReportAsync(parameterConfig = null) { + return __awaiter(this, void 0, void 0, function* () { + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.queryTestResultsReportForPipelineAsync(config); }), "QueryTestResultsReport"); + }); + } + getTestResultOwnersAsync(resultsToFetch) { + return __awaiter(this, void 0, void 0, function* () { + var query = new TestResultsQueryImpl(); + query.fields = ["Owner"]; + const results = []; + const testApi = yield this.testApiPromise; + for (let i = 0, j = resultsToFetch.length; i < j; i += this.MaxItemsSupported) { + const tempArray = resultsToFetch.slice(i, i + this.MaxItemsSupported); + query.results = tempArray; + let queryResult = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return testApi.getTestResultsByQuery(query, this.pipelineConfig.$projectName); }), "GetTestResultOwners"); + results.push(...queryResult.results); + } + const ownerMap = new Map(); + results.forEach(r => { + if (this.isValid(r.owner)) { + const key = this.getUniqueName(r.owner); + if (!ownerMap.has(key)) { + ownerMap.set(key, r.owner); + } + } + }); + const identities = []; + ownerMap.forEach((value, key) => identities.push(value)); + return identities; + }); + } + getTestResultsDetailsAsync(groupBy, outcomeFilters, parameterConfig = null) { + return __awaiter(this, void 0, void 0, function* () { + const filter = this.getOutcomeFilter(outcomeFilters); + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.getTestResultsDetailsForPipelineAsync(config, groupBy, filter); }), "GetTestResultsDetails"); + }); + } + getTestResultSummaryAsync(includeFailures, parameterConfig = null) { + return __awaiter(this, void 0, void 0, function* () { + const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; + return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.queryTestResultsReportForPipelineAsync(config, includeFailures); }), "GetTestResultSummary"); + }); + } + getTestResultsByQueryAsync(query) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).getTestResultsByQuery(query, this.pipelineConfig.$projectId); + }); + } + getOutcomeFilter(outcomes) { + let filter = null; + if (outcomes != null && outcomes.length > 0) { + const outComeString = Array.from(new Set(outcomes.map(o => Number(o)))).join(","); + filter = `Outcome eq ${outComeString}`; + } + return filter; + } + getUniqueName(identity) { + return identity.uniqueName == null ? identity.displayName : identity.uniqueName; + } + isValid(identity) { + return identity != null && (identity.displayName != null || identity.uniqueName != null); + } +} +exports.AbstractTestResultsClient = AbstractTestResultsClient; +class TestResultsQueryImpl { +} +exports.TestResultsQueryImpl = TestResultsQueryImpl; +//# sourceMappingURL=AbstractTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js.map new file mode 100644 index 00000000..5e8d40ff --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbstractTestResultsClient.js","sourceRoot":"","sources":["AbstractTestResultsClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.d.ts new file mode 100644 index 00000000..453a236e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.d.ts @@ -0,0 +1,13 @@ +import { IPipelineRestClient } from "./IPipelineRestClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Build, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { ChangeModel } from "../../model/ChangeModel"; +import { AbstractClient } from "./AbstractClient"; +export declare class BuildRestClient extends AbstractClient implements IPipelineRestClient { + private buildApi; + constructor(pipelineConfig: PipelineConfiguration); + getPipelineAsync(): Promise; + getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; + getPipelineChangesAsync(prevPipelineId: number): Promise; + getPipelineTimelineAsync(pipelineId: number): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js new file mode 100644 index 00000000..57849fc2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js @@ -0,0 +1,53 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildRestClient = void 0; +const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); +const ChangeModel_1 = require("../../model/ChangeModel"); +const AbstractClient_1 = require("./AbstractClient"); +class BuildRestClient extends AbstractClient_1.AbstractClient { + constructor(pipelineConfig) { + super(pipelineConfig); + this.buildApi = this.connection.getBuildApi(); + } + getPipelineAsync() { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.buildApi).getBuild(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); + }); + } + getLastPipelineAsync(pipelineDefId, envDefId, sourceBranchFilter, maxCreatedDate) { + return __awaiter(this, void 0, void 0, function* () { + const builds = yield (yield this.buildApi).getBuilds(this.pipelineConfig.$projectId, [pipelineDefId], null, null, null, maxCreatedDate, null, null, null, BuildInterfaces_1.BuildResult.Succeeded | BuildInterfaces_1.BuildResult.PartiallySucceeded | BuildInterfaces_1.BuildResult.Failed | BuildInterfaces_1.BuildResult.Canceled, null, null, 1, null, null, null, BuildInterfaces_1.BuildQueryOrder.FinishTimeDescending, sourceBranchFilter); + if (builds != null && builds.length > 0) { + return builds[0]; + } + console.log(`Unable to find any build for definition id - ${pipelineDefId}`); + return null; + }); + } + getPipelineChangesAsync(prevPipelineId) { + return __awaiter(this, void 0, void 0, function* () { + const changes = yield (yield this.buildApi).getBuildChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); + if (changes == null || changes.length < 1) { + console.log(`No changes found for pipelineId - ${this.pipelineConfig.$pipelineId}`); + return []; + } + return changes.map(item => new ChangeModel_1.ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); + }); + } + getPipelineTimelineAsync(pipelineId) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.buildApi).getBuildTimeline(this.pipelineConfig.$projectId, pipelineId); + }); + } +} +exports.BuildRestClient = BuildRestClient; +//# sourceMappingURL=BuildClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js.map new file mode 100644 index 00000000..ce1c3b65 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildClient.js","sourceRoot":"","sources":["BuildClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,sFAAiH;AACjH,yDAAsD;AACtD,qDAAkD;AAGlD,MAAa,eAAgB,SAAQ,+BAAc;IAIjD,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAEY,gBAAgB;;YAC3B,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC/G,CAAC;KAAA;IAEY,oBAAoB,CAAC,aAAqB,EAAE,QAAgB,EAAE,kBAA0B,EAAE,cAAqB;;YAC1H,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAClD,IAAI,CAAC,cAAc,CAAC,UAAU,EAC9B,CAAC,aAAa,CAAC,EACf,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,6BAAW,CAAC,SAAS,GAAG,6BAAW,CAAC,kBAAkB,GAAG,6BAAW,CAAC,MAAM,GAAG,6BAAW,CAAC,QAAQ,EAClG,IAAI,EACJ,IAAI,EACJ,CAAC,EACD,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,iCAAe,CAAC,oBAAoB,EACpC,kBAAkB,CAAC,CAAC;YACtB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;aAClB;YACD,OAAO,CAAC,GAAG,CAAC,gDAAgD,aAAa,EAAE,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEY,uBAAuB,CAAC,cAAsB;;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC7H,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpF,OAAO,EAAE,CAAC;aACX;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,yBAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjH,CAAC;KAAA;IAEY,wBAAwB,CAAC,UAAkB;;YACtD,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClG,CAAC;KAAA;CACF;AApDD,0CAoDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/BuildClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/BuildClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.d.ts new file mode 100644 index 00000000..f7811c61 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.d.ts @@ -0,0 +1,9 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; +export declare class BuildTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { + constructor(pipelineConfig: PipelineConfiguration); + queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; + getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js new file mode 100644 index 00000000..8bbc626c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js @@ -0,0 +1,30 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BuildTestResultsClient = void 0; +const AbstractTestResultsClient_1 = require("./AbstractTestResultsClient"); +class BuildTestResultsClient extends AbstractTestResultsClient_1.AbstractTestResultsClient { + constructor(pipelineConfig) { + super(pipelineConfig); + } + queryTestResultsReportForPipelineAsync(config, includeFailures) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).queryTestResultsReportForBuild(config.$projectName, config.$pipelineId, null, includeFailures); + }); + } + getTestResultsDetailsForPipelineAsync(config, groupBy, filter) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).getTestResultDetailsForBuild(config.$projectName, config.$pipelineId, null, groupBy, filter); + }); + } +} +exports.BuildTestResultsClient = BuildTestResultsClient; +//# sourceMappingURL=BuildTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js.map new file mode 100644 index 00000000..9d63a129 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BuildTestResultsClient.js","sourceRoot":"","sources":["BuildTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2EAAwE;AAExE,MAAa,sBAAuB,SAAQ,qDAAyB;IAEnE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAEY,sCAAsC,CAAC,MAA6B,EAAE,eAAyB;;YAC1G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,8BAA8B,CACrE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,IAAI,EACJ,eAAe,CAAC,CAAC;QACrB,CAAC;KAAA;IAEY,qCAAqC,CAAC,MAA6B,EAAE,OAAgB,EAAE,MAAe;;YACjH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,4BAA4B,CACnE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,IAAI,EACJ,OAAO,EACP,MAAM,CAAC,CAAC;QACZ,CAAC;KAAA;CACF;AAtBD,wDAsBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.d.ts new file mode 100644 index 00000000..ed7a5b4d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.d.ts @@ -0,0 +1,8 @@ +import { Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; +import { ChangeModel } from "../../model/ChangeModel"; +export interface IPipelineRestClient { + getPipelineAsync(): Promise; + getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; + getPipelineChangesAsync(prevPipelineId: number): Promise; + getPipelineTimelineAsync(pipelineId: number): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js new file mode 100644 index 00000000..84a6db77 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IPipelineRestClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js.map new file mode 100644 index 00000000..cd6b91b4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IPipelineRestClient.js","sourceRoot":"","sources":["IPipelineRestClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.d.ts new file mode 100644 index 00000000..74404ca3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.d.ts @@ -0,0 +1,12 @@ +import { TestResultsDetails, TestResultSummary, TestOutcome, TestCaseResult, WorkItemReference, TestResultsQuery } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +export interface ITestResultsClient { + queryTestResultBugs(automatedTestName: string, resultId: number): Promise; + getTestResultById(testRunId: number, resultId: number): Promise; + queryTestResultsReportAsync(config?: PipelineConfiguration): Promise; + getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; + getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], config?: PipelineConfiguration): Promise; + getTestResultSummaryAsync(includeFailures: boolean, config?: PipelineConfiguration): Promise; + getTestResultsByQueryAsync(query: TestResultsQuery): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js new file mode 100644 index 00000000..b07895ab --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=ITestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js.map new file mode 100644 index 00000000..79df6b69 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ITestResultsClient.js","sourceRoot":"","sources":["ITestResultsClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ITestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ITestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.d.ts new file mode 100644 index 00000000..28259330 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.d.ts @@ -0,0 +1,4 @@ +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +export interface IWorkItemClient { + getWorkItemsAsync(workItemIds: number[]): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js new file mode 100644 index 00000000..058bea92 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=IWorkItemClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js.map new file mode 100644 index 00000000..37f3ef71 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IWorkItemClient.js","sourceRoot":"","sources":["IWorkItemClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/IWorkItemClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/IWorkItemClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.d.ts new file mode 100644 index 00000000..a40b9e67 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.d.ts @@ -0,0 +1,12 @@ +import { Release } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +import { AbstractClient } from "./AbstractClient"; +import { IPipelineRestClient } from "./IPipelineRestClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { ChangeModel } from "../../model/ChangeModel"; +export declare class ReleaseRestClient extends AbstractClient implements IPipelineRestClient { + constructor(pipelineConfig: PipelineConfiguration); + getPipelineAsync(): Promise; + getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; + getPipelineChangesAsync(prevPipelineId: number): Promise; + getPipelineTimelineAsync(pipelineId: number): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js new file mode 100644 index 00000000..89c786bb --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js @@ -0,0 +1,68 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseRestClient = void 0; +const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); +const AbstractClient_1 = require("./AbstractClient"); +const ChangeModel_1 = require("../../model/ChangeModel"); +const util_1 = require("util"); +class ReleaseRestClient extends AbstractClient_1.AbstractClient { + constructor(pipelineConfig) { + super(pipelineConfig); + } + getPipelineAsync() { + return __awaiter(this, void 0, void 0, function* () { + return (yield this.connection.getReleaseApi()).getRelease(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); + }); + } + getLastPipelineAsync(pipelineDefId, envDefId, sourceBranchFilter, maxCreatedDate) { + return __awaiter(this, void 0, void 0, function* () { + const releaseApi = yield this.connection.getReleaseApi(); + let lastRelease = null; + const releaseStatusFilter = ReleaseInterfaces_1.ReleaseStatus.Active; + const envStatusFilter = ReleaseInterfaces_1.EnvironmentStatus.Succeeded | ReleaseInterfaces_1.EnvironmentStatus.PartiallySucceeded | ReleaseInterfaces_1.EnvironmentStatus.Rejected | ReleaseInterfaces_1.EnvironmentStatus.Canceled; + const releases = yield releaseApi.getReleases(this.pipelineConfig.$projectId, pipelineDefId, envDefId, null, null, releaseStatusFilter, envStatusFilter, null, maxCreatedDate, ReleaseInterfaces_1.ReleaseQueryOrder.Descending, null, null, ReleaseInterfaces_1.ReleaseExpands.Environments, null, null, null, sourceBranchFilter); + if (!util_1.isNullOrUndefined(releases) && releases.length > 0) { + // Ideally, first one should be last completed one. Unless someone's running the report after the release has completed for some reason. + console.log(`Considering one of [${releases.map(r => r.id).join(",")}] as previous completed release for ${this.pipelineConfig.$pipelineId}`); + for (let i = 0; i < releases.length; i++) { + if (releases[i].id < this.pipelineConfig.$pipelineId) { + lastRelease = releases[i]; + break; + } + } + } + if (util_1.isNullOrUndefined(lastRelease)) { + console.log(`Unable to fetch last completed release for release definition:${pipelineDefId} and environmentid: ${envDefId}`); + } + else if (lastRelease.id < this.pipelineConfig.$pipelineId) { + return yield releaseApi.getRelease(this.pipelineConfig.$projectId, lastRelease.id); + } + return lastRelease; + }); + } + getPipelineChangesAsync(prevPipelineId) { + return __awaiter(this, void 0, void 0, function* () { + console.log(`Fetching changes between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); + const changes = yield (yield this.connection.getReleaseApi()).getReleaseChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId, prevPipelineId); + if (changes == null || changes.length < 1) { + console.log(`No changes found between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); + return []; + } + return changes.map(item => new ChangeModel_1.ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); + }); + } + getPipelineTimelineAsync(pipelineId) { + throw new Error("Method not supported."); + } +} +exports.ReleaseRestClient = ReleaseRestClient; +//# sourceMappingURL=ReleaseClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js.map new file mode 100644 index 00000000..1c5d68f8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseClient.js","sourceRoot":"","sources":["ReleaseClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ReleaseClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ReleaseClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.d.ts new file mode 100644 index 00000000..4aa8b06e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.d.ts @@ -0,0 +1,9 @@ +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; +import { ITestResultsClient } from "./ITestResultsClient"; +import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; +export declare class ReleaseTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { + constructor(pipelineConfig: PipelineConfiguration); + queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; + getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js new file mode 100644 index 00000000..0550db87 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js @@ -0,0 +1,30 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReleaseTestResultsClient = void 0; +const AbstractTestResultsClient_1 = require("./AbstractTestResultsClient"); +class ReleaseTestResultsClient extends AbstractTestResultsClient_1.AbstractTestResultsClient { + constructor(pipelineConfig) { + super(pipelineConfig); + } + queryTestResultsReportForPipelineAsync(config, includeFailures) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).queryTestResultsReportForRelease(config.$projectName, config.$pipelineId, config.$environmentId, null, includeFailures); + }); + } + getTestResultsDetailsForPipelineAsync(config, groupBy, filter) { + return __awaiter(this, void 0, void 0, function* () { + return yield (yield this.testApiPromise).getTestResultDetailsForRelease(config.$projectName, config.$pipelineId, config.$environmentId, null, groupBy, filter); + }); + } +} +exports.ReleaseTestResultsClient = ReleaseTestResultsClient; +//# sourceMappingURL=ReleaseTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js.map new file mode 100644 index 00000000..2ea0d33f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReleaseTestResultsClient.js","sourceRoot":"","sources":["ReleaseTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2EAAwE;AAExE,MAAa,wBAAyB,SAAQ,qDAAyB;IAErE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAEY,sCAAsC,CAAC,MAA6B,EAAE,eAAyB;;YAC1G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,gCAAgC,CACvE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,eAAe,CAAC,CAAC;QACrB,CAAC;KAAA;IAEY,qCAAqC,CAAC,MAA6B,EAAE,OAAgB,EAAE,MAAe;;YACjH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,8BAA8B,CACrE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,OAAO,EACP,MAAM,CAAC,CAAC;QACZ,CAAC;KAAA;CACF;AAxBD,4DAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.d.ts new file mode 100644 index 00000000..2237a73c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.d.ts @@ -0,0 +1,4 @@ +export declare class RetryablePromise { + private static defaultRetryCount; + static RetryAsync(executor: () => Promise, executorName: string, times?: number): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js new file mode 100644 index 00000000..3f13ad1e --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js @@ -0,0 +1,50 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RetryablePromise = void 0; +const TelemetryLogger_1 = require("../../telemetry/TelemetryLogger"); +const now = require('performance-now'); +class RetryablePromise { + static RetryAsync(executor, executorName, times = this.defaultRetryCount) { + return __awaiter(this, void 0, void 0, function* () { + const perfStart = now(); + let attemptNumber = 1; + let lastError; + try { + do { + try { + let returnVal = yield executor(); + if (attemptNumber > 1) { + console.log(`Completed on Retry attempt: ${attemptNumber}`); + } + return returnVal; + } + catch (err) { + lastError = err; + console.log(`Retry <${executorName}>: ${attemptNumber} : ${err}`); + } + attemptNumber++; + } while (attemptNumber <= times); + console.log(`All Retries exhausted. Throwing error: ${lastError}`); + throw lastError; + } + finally { + if (attemptNumber > 1) { + // Log time taken after all retries + TelemetryLogger_1.TelemetryLogger.LogModulePerf(executorName, now() - perfStart); + } + } + }); + } +} +exports.RetryablePromise = RetryablePromise; +RetryablePromise.defaultRetryCount = 3; +//# sourceMappingURL=RetryablePromise.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js.map new file mode 100644 index 00000000..fcc42ea8 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RetryablePromise.js","sourceRoot":"","sources":["RetryablePromise.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qEAAkE;AAClE,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAa,gBAAgB;IAIlB,MAAM,CAAO,UAAU,CAAI,QAA0B,EAAE,YAAoB,EAAE,QAAgB,IAAI,CAAC,iBAAiB;;YACtH,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACxB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,SAAgB,CAAC;YACrB,IAAI;gBACA,GAAG;oBACC,IAAI;wBACA,IAAI,SAAS,GAAG,MAAM,QAAQ,EAAE,CAAC;wBACjC,IAAI,aAAa,GAAG,CAAC,EAAE;4BACnB,OAAO,CAAC,GAAG,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;yBAC/D;wBACD,OAAO,SAAS,CAAC;qBACpB;oBACD,OAAO,GAAG,EAAE;wBACR,SAAS,GAAG,GAAG,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,UAAU,YAAY,MAAM,aAAa,MAAM,GAAG,EAAE,CAAC,CAAC;qBACrE;oBACD,aAAa,EAAE,CAAC;iBACnB,QAAQ,aAAa,IAAI,KAAK,EAAE;gBAEjC,OAAO,CAAC,GAAG,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;gBACnE,MAAM,SAAS,CAAC;aACnB;oBACO;gBACJ,IAAI,aAAa,GAAG,CAAC,EAAE;oBACnB,mCAAmC;oBACnC,iCAAe,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;iBAClE;aACJ;QACL,CAAC;KAAA;;AAjCL,4CAkCC;AAhCkB,kCAAiB,GAAW,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/RetryablePromise.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/RetryablePromise.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.d.ts new file mode 100644 index 00000000..1283d408 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.d.ts @@ -0,0 +1,9 @@ +import { AbstractClient } from "./AbstractClient"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { IWorkItemClient } from "./IWorkItemClient"; +import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; +export declare class WorkItemClient extends AbstractClient implements IWorkItemClient { + private workApiPromise; + constructor(pipelineConfig: PipelineConfiguration); + getWorkItemsAsync(workItemIds: number[]): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js new file mode 100644 index 00000000..bcff8bf2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js @@ -0,0 +1,37 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkItemClient = void 0; +const AbstractClient_1 = require("./AbstractClient"); +class WorkItemClient extends AbstractClient_1.AbstractClient { + constructor(pipelineConfig) { + super(pipelineConfig); + this.workApiPromise = this.connection.getWorkItemTrackingApi(); + } + getWorkItemsAsync(workItemIds) { + return __awaiter(this, void 0, void 0, function* () { + const chunks = []; + var i, j, temparray, chunk = 100; + for (i = 0, j = workItemIds.length; i < j; i += chunk) { + temparray = workItemIds.slice(i, i + chunk); + chunks.push(temparray); + } + const workApi = yield this.workApiPromise; + const chunkResults = chunks.map(chunk => workApi.getWorkItems(chunk)); + const workItems = yield Promise.all(chunkResults); + const flatItemList = []; + workItems.forEach(wlist => flatItemList.push(...wlist)); + return flatItemList; + }); + } +} +exports.WorkItemClient = WorkItemClient; +//# sourceMappingURL=WorkItemClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js.map new file mode 100644 index 00000000..60fed502 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"WorkItemClient.js","sourceRoot":"","sources":["WorkItemClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkD;AAMlD,MAAa,cAAe,SAAQ,+BAAc;IAIhD,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC;IACjE,CAAC;IAEY,iBAAiB,CAAC,WAAqB;;YAElD,MAAM,MAAM,GAAe,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,GAAG,GAAG,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE;gBACrD,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aACxB;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,YAAY,GAAe,EAAE,CAAC;YACpC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACxD,OAAO,YAAY,CAAC;QACtB,CAAC;KAAA;CACF;AA1BD,wCA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/WorkItemClient.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/restclients/WorkItemClient.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.d.ts new file mode 100644 index 00000000..a7c5ae6c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.d.ts @@ -0,0 +1,9 @@ +import { TestOutcome, TestCaseResult, CustomTestField } from "azure-devops-node-api/interfaces/TestInterfaces"; +export declare class TcmHelper { + static readonly OutcomeConfidenceValue: Number; + static exceptOutcomes(outcomesToExclude: TestOutcome[]): TestOutcome[]; + static parseOutcome(outcomeString: string): TestOutcome; + static isTestFlaky(result: TestCaseResult): boolean; + static getCustomField(result: TestCaseResult, fieldName: string): CustomTestField; + static Merge(source: Array>): T[]; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js new file mode 100644 index 00000000..585e4aea --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js @@ -0,0 +1,67 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TcmHelper = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +class TcmHelper { + static exceptOutcomes(outcomesToExclude) { + const otherOutComes = []; + for (let outcome in TestInterfaces_1.TestOutcome) { + var outcomeNum = Number(outcome); + if (!isNaN(outcomeNum) && !outcomesToExclude.includes(outcomeNum)) { + otherOutComes.push(outcomeNum); + } + } + return otherOutComes; + } + static parseOutcome(outcomeString) { + let result; + switch (outcomeString) { + case "Passed": + result = TestInterfaces_1.TestOutcome.Passed; + break; + case "Failed": + result = TestInterfaces_1.TestOutcome.Failed; + break; + case "Inconclusive": + result = TestInterfaces_1.TestOutcome.Inconclusive; + break; + case "NotExecuted": + result = TestInterfaces_1.TestOutcome.NotExecuted; + break; + default: + result = TestInterfaces_1.TestOutcome.None; + break; + } + return result; + } + static isTestFlaky(result) { + var outcomeConfidenceField = TcmHelper.getCustomField(result, "OutcomeConfidence"); + if (outcomeConfidenceField != null + && outcomeConfidenceField.value != null) { + const outcomeFieldValue = Number.parseFloat(outcomeConfidenceField.value); + if (!isNaN(outcomeFieldValue)) { + return outcomeFieldValue == TcmHelper.OutcomeConfidenceValue; + } + } + return false; + } + static getCustomField(result, fieldName) { + if (result.customFields == null) { + return null; + } + var cf = result.customFields.filter(c => c.fieldName.toLowerCase() == fieldName.toLowerCase()); + return cf.length > 0 ? cf[0] : null; + } + static Merge(source) { + const mergedResults = []; + source.forEach(item => { + if (item != null) { + mergedResults.push(...item); + } + }); + return mergedResults; + } +} +exports.TcmHelper = TcmHelper; +TcmHelper.OutcomeConfidenceValue = 0.0; +//# sourceMappingURL=TcmHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js.map new file mode 100644 index 00000000..032d716d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TcmHelper.js","sourceRoot":"","sources":["TcmHelper.ts"],"names":[],"mappings":";;;AAAA,oFAA+G;AAE/G,MAAa,SAAS;IAIb,MAAM,CAAC,cAAc,CAAC,iBAAgC;QAC3D,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,KAAK,IAAI,OAAO,IAAI,4BAAW,EAAE;YAC/B,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBACjE,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAChC;SACF;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,aAAqB;QAC9C,IAAI,MAAmB,CAAC;QACxB,QAAQ,aAAa,EAAE;YACrB,KAAK,QAAQ;gBAAE,MAAM,GAAG,4BAAW,CAAC,MAAM,CAAC;gBAAC,MAAM;YAClD,KAAK,QAAQ;gBAAE,MAAM,GAAG,4BAAW,CAAC,MAAM,CAAC;gBAAC,MAAM;YAClD,KAAK,cAAc;gBAAE,MAAM,GAAG,4BAAW,CAAC,YAAY,CAAC;gBAAC,MAAM;YAC9D,KAAK,aAAa;gBAAE,MAAM,GAAG,4BAAW,CAAC,WAAW,CAAC;gBAAC,MAAM;YAC5D;gBAAS,MAAM,GAAG,4BAAW,CAAC,IAAI,CAAC;gBAAC,MAAM;SAC3C;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,MAAsB;QAC9C,IAAI,sBAAsB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACnF,IAAI,sBAAsB,IAAI,IAAI;eAC7B,sBAAsB,CAAC,KAAK,IAAI,IAAI,EAAE;YACzC,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE;gBAC7B,OAAO,iBAAiB,IAAI,SAAS,CAAC,sBAAsB,CAAC;aAC9D;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,MAAsB,EAAE,SAAiB;QACpE,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;QAED,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAI,MAAuB;QAC5C,MAAM,aAAa,GAAQ,EAAE,CAAC;QAE9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACpB,IAAI,IAAI,IAAI,IAAI,EAAE;gBAChB,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;aAC7B;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;;AA5DH,8BA8DC;AA5DwB,gCAAsB,GAAW,GAAG,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.d.ts new file mode 100644 index 00000000..46e1f987 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.d.ts @@ -0,0 +1,10 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +export declare class TestOwnersDataProvider implements IDataProvider { + private testResultsClient; + constructor(testResultsClient: ITestResultsClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js new file mode 100644 index 00000000..124e9e8b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js @@ -0,0 +1,35 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestOwnersDataProvider = void 0; +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const ReportFactory_1 = require("../../model/ReportFactory"); +class TestOwnersDataProvider { + constructor(testResultsClient) { + this.testResultsClient = testResultsClient; + } + getReportDataAsync(pipelineConfig, reportDataConfig) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + const failedTestResultDetails = yield this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestInterfaces_1.TestOutcome.Failed]); + const resultsToFetch = []; + failedTestResultDetails.resultsForGroup.forEach(r => { + resultsToFetch.push(...r.results); + }); + const failedOwners = yield this.testResultsClient.getTestResultOwnersAsync(resultsToFetch); + report.$failedTestOwners.push(...failedOwners); + console.log("Fetched test owners data"); + return report; + }); + } +} +exports.TestOwnersDataProvider = TestOwnersDataProvider; +//# sourceMappingURL=TestOwnersDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js.map new file mode 100644 index 00000000..0cc5a285 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestOwnersDataProvider.js","sourceRoot":"","sources":["TestOwnersDataProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAKA,oFAA8F;AAC9F,6DAA0D;AAE1D,MAAa,sBAAsB;IAIjC,YAAY,iBAAqC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEY,kBAAkB,CAAC,cAAqC,EAAE,gBAAyC;;YAC9G,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAC7D,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,SAAS,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAEzH,MAAM,cAAc,GAAqB,EAAE,CAAC;YAC5C,uBAAuB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClD,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAC3F,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YAE/C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CACF;AAvBD,wDAuBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.d.ts new file mode 100644 index 00000000..daee1718 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.d.ts @@ -0,0 +1,19 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +import { IWorkItemClient } from "../restclients/IWorkItemClient"; +export declare class TestResultsDataProvider implements IDataProvider { + private testResultsClient; + private workItemClient; + constructor(testResultsClient: ITestResultsClient, workItemClient: IWorkItemClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise; + private setFilteredTestResults; + private getTestResultsWithWorkItems; + private getTestResultsForResultsGroupWithWorkItemsAsync; + private getWorkItemsAsync; + private getTestResultsWithBugRefs; + private filterTestResults; + private getIncludedOutcomes; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js new file mode 100644 index 00000000..e02bdc0c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js @@ -0,0 +1,177 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestResultsDataProvider = void 0; +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TcmHelper_1 = require("./TcmHelper"); +const TestResultGroupModel_1 = require("../../model/testresults/TestResultGroupModel"); +const TestResultModel_1 = require("../../model/testresults/TestResultModel"); +const TestResultDetailsParserFactory_1 = require("../helpers/TestResultDetailsParserFactory"); +const ReportFactory_1 = require("../../model/ReportFactory"); +const util_1 = require("util"); +class TestResultsDataProvider { + constructor(testResultsClient, workItemClient) { + this.testResultsClient = testResultsClient; + this.workItemClient = workItemClient; + } + getReportDataAsync(pipelineConfig, reportDataConfig) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + // This is to make sure the failing since information is computed before we fetch test results + yield this.testResultsClient.queryTestResultsReportAsync(); + yield this.setFilteredTestResults(pipelineConfig, reportDataConfig.$testResultsConfig, report); + return report; + }); + } + setFilteredTestResults(config, testResultsConfiguration, report) { + return __awaiter(this, void 0, void 0, function* () { + if (testResultsConfiguration.$includeFailedTests || testResultsConfiguration.$includeOtherTests || testResultsConfiguration.$includePassedTests) { + const groupBy = testResultsConfiguration.$groupTestResultsBy == GroupTestResultsBy_1.GroupTestResultsBy.Run ? "TestRun" : "Priority"; + const includedOutcomes = this.getIncludedOutcomes(testResultsConfiguration); + const resultIdsToFetch = yield this.testResultsClient.getTestResultsDetailsAsync(groupBy, includedOutcomes); + report.hasFilteredTests = this.filterTestResults(resultIdsToFetch, testResultsConfiguration.$maxItemsToShow); + const filteredTestResultGroups = yield this.getTestResultsWithWorkItems(resultIdsToFetch); + report.filteredResults = filteredTestResultGroups; + } + }); + } + getTestResultsWithWorkItems(resultIdsToFetch) { + return __awaiter(this, void 0, void 0, function* () { + const testResultDetailsParser = TestResultDetailsParserFactory_1.TestResultDetailsParserFactory.getParser(resultIdsToFetch); + const filteredTestResultGroups = resultIdsToFetch.resultsForGroup + .map(resultsForGroup => this.getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, testResultDetailsParser)); + const results = yield Promise.all(filteredTestResultGroups); + return results; + }); + } + getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, parser) { + return __awaiter(this, void 0, void 0, function* () { + var resultGroup = new TestResultGroupModel_1.TestResultsGroupModel(); + resultGroup.groupName = parser.getGroupByValue(resultsForGroup); + const bugsRefs = []; + const results = yield this.getTestResultsWithBugRefs(resultsForGroup, bugsRefs); + try { + const workItemDictionary = yield this.getWorkItemsAsync(bugsRefs); + results.forEach(result => { + if (result.associatedBugRefs != null && result.associatedBugRefs.length > 0) { + result.associatedBugRefs.forEach(workItemReference => { + result.associatedBugs.push(workItemDictionary.get(Number.parseInt(workItemReference.id))); + }); + } + }); + } + catch (ex) { + // ignore + console.warn(`Error while fetching workitems for bugrefs: ${bugsRefs.map(b => b.id)}`); + } + results.forEach(result => { + if (result.testResult.outcome != null) { + const testOutcome = TcmHelper_1.TcmHelper.parseOutcome(result.testResult.outcome); + if (!resultGroup.testResults.has(testOutcome)) { + resultGroup.testResults.set(testOutcome, []); + } + resultGroup.testResults.get(testOutcome).push(result); + } + else { + console.log(`Found test with outcome as null. Test result id ${result.testResult.id} in Test run ${result.testResult.testRun.id}`); + } + }); + return resultGroup; + }); + } + getWorkItemsAsync(bugsRefs) { + return __awaiter(this, void 0, void 0, function* () { + const workItemDictionary = new Map(); + if (bugsRefs != null && bugsRefs.length > 0) { + const workItems = yield this.workItemClient.getWorkItemsAsync(bugsRefs.map(bugRef => Number.parseInt(bugRef.id))); + workItems.forEach(workItem => { + if (workItem.id != null) { + workItemDictionary.set(workItem.id, workItem); + } + else { + console.log(`Unable to get id for a work item`); + } + }); + } + return workItemDictionary; + }); + } + getTestResultsWithBugRefs(resultsForGroup, bugReferencesInGroup) { + return __awaiter(this, void 0, void 0, function* () { + const resultModels = []; + for (var i = 0; i < resultsForGroup.results.length; i++) { + const resultIdObj = resultsForGroup.results[i]; + const testResult = yield this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); + // Remove flaky tests + if (util_1.isNullOrUndefined(testResult) || TcmHelper_1.TcmHelper.isTestFlaky(testResult)) { + continue; + } + const associatedBugRefs = yield this.testResultsClient.queryTestResultBugs(testResult.automatedTestName, testResult.id); + const resultModel = new TestResultModel_1.TestResultModel(); + resultModel.testResult = testResult; + resultModel.associatedBugRefs = associatedBugRefs; + resultModels.push(resultModel); + } + // let results = resultsForGroup.results + // .map(async resultIdObj => + // { + // const resultModel = new TestResultModel(); + // resultModel.testResult = await this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); + // // Remove flaky tests + // if (TcmHelper.isTestFlaky(resultModel.testResult)) + // { + // return null; + // } + // resultModel.associatedBugRefs = await this.testResultsClient.queryTestResultBugs(resultModel.testResult.automatedTestName, resultModel.testResult.id); + // return resultModel; + // }); + //Remove all null values from array + //results = results.filter(r => r != null); + //results.forEach(async result => resultModels.push((await result))); + resultModels.forEach(result => bugReferencesInGroup.push(...result.associatedBugRefs)); + return resultModels; + }); + } + filterTestResults(resultIdsToFetch, maxItems) { + var hasFiltered = false; + var remainingItems = maxItems; + for (let i = 0; i < resultIdsToFetch.resultsForGroup.length; i++) { + const group = resultIdsToFetch.resultsForGroup[i]; + var currentItemsSize = group.results.length; + if (currentItemsSize > remainingItems) { + hasFiltered = true; + const results = []; + results.push(...group.results); + group.results = results.splice(0, remainingItems); + break; + } + remainingItems -= group.results.length; + } + resultIdsToFetch.resultsForGroup = resultIdsToFetch.resultsForGroup.filter(group => group.results.length > 0); + return hasFiltered; + } + getIncludedOutcomes(testResultsConfiguration) { + const includedOutcomes = []; + if (testResultsConfiguration.$includeFailedTests) { + includedOutcomes.push(TestInterfaces_1.TestOutcome.Failed); + } + if (testResultsConfiguration.$includeOtherTests) { + includedOutcomes.push(...TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed])); + } + if (testResultsConfiguration.$includePassedTests) { + includedOutcomes.push(TestInterfaces_1.TestOutcome.Passed); + } + return includedOutcomes; + } +} +exports.TestResultsDataProvider = TestResultsDataProvider; +//# sourceMappingURL=TestResultsDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js.map new file mode 100644 index 00000000..66c98667 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestResultsDataProvider.js","sourceRoot":"","sources":["TestResultsDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.d.ts new file mode 100644 index 00000000..9e3f97cc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.d.ts @@ -0,0 +1,14 @@ +import { IDataProvider } from "../IDataProvider"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { Report } from "../../model/Report"; +import { ITestResultsClient } from "../restclients/ITestResultsClient"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +export declare class TestSummaryDataProvider implements IDataProvider { + private testResultsClient; + constructor(testResultsClient: ITestResultsClient); + getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; + private getTestSummaryByPriorityAsync; + private getTestRunSummaryWithPriorityAsync; + private getSummaryByRun; + private getTestSummaryDataByPriorityAsync; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js new file mode 100644 index 00000000..985ef1d5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js @@ -0,0 +1,120 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TestSummaryDataProvider = void 0; +const TestSummaryGroupModel_1 = require("../../model/testresults/TestSummaryGroupModel"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +const TestResultDetailsParserForRun_1 = require("../helpers/TestResultDetailsParserForRun"); +const TestOutcomeForPriority_1 = require("../../model/testresults/TestOutcomeForPriority"); +const TestResultDetailsParserForPriority_1 = require("../helpers/TestResultDetailsParserForPriority"); +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); +const TcmHelper_1 = require("./TcmHelper"); +const ReportFactory_1 = require("../../model/ReportFactory"); +class TestSummaryDataProvider { + constructor(testResultsClient) { + this.testResultsClient = testResultsClient; + } + getReportDataAsync(pipelineConfig, reportDataConfiguration) { + return __awaiter(this, void 0, void 0, function* () { + const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); + const testSummaryGroups = []; + const testSummaryGroupModelForRun = yield this.getTestRunSummaryWithPriorityAsync(pipelineConfig); + testSummaryGroups.push(testSummaryGroupModelForRun); + report.testResultSummary = yield this.testResultsClient.getTestResultSummaryAsync(true); + // Hack - above testresultsummary is incomplete - bug filed + //const passedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Passed]); + //const failedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Failed]); + //this.setOutComeData(report, testSummaryGroups, TestOutcome.Passed, passedResults); + //this.setOutComeData(report, testSummaryGroups, TestOutcome.Failed, failedResults); + if (reportDataConfiguration.$groupTestSummaryBy.includes(GroupTestResultsBy_1.GroupTestResultsBy.Priority)) { + testSummaryGroups.push(yield this.getTestSummaryByPriorityAsync()); + } + report.$testSummaryGroups.push(...testSummaryGroups); + return report; + }); + } + getTestSummaryByPriorityAsync() { + return __awaiter(this, void 0, void 0, function* () { + const testSummaryItemsByRuns = yield this.testResultsClient.getTestResultsDetailsAsync("Priority"); + var testResultDetailsParserForPriority = new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(testSummaryItemsByRuns); + const testSummaryByPriority = new TestSummaryGroupModel_1.TestSummaryGroupModel(); + testSummaryByPriority.groupedBy = GroupTestResultsBy_1.GroupTestResultsBy.Priority; + const summaryItems = testResultDetailsParserForPriority.getSummaryItems(); + testSummaryByPriority.runs.push(...summaryItems); + return testSummaryByPriority; + }); + } + getTestRunSummaryWithPriorityAsync(config) { + return __awaiter(this, void 0, void 0, function* () { + const testSummaryByRun = new TestSummaryGroupModel_1.TestSummaryGroupModel(); + testSummaryByRun.groupedBy = GroupTestResultsBy_1.GroupTestResultsBy.Run; + if (config.$pipelineType == PipelineType_1.PipelineType.Release) { + const testResultsDetailsByTestRun = yield this.testResultsClient.getTestResultsDetailsAsync("TestRun"); + const summaryDataByPriority = yield this.getTestSummaryDataByPriorityAsync(); + const summaryByRun = new TestResultDetailsParserForRun_1.TestResultDetailsParserForRun(testResultsDetailsByTestRun); + const summaryItems = yield this.getSummaryByRun(summaryByRun, summaryDataByPriority); + testSummaryByRun.runs.push(...summaryItems); + } + return testSummaryByRun; + }); + } + getSummaryByRun(testResultByRun, testResultsForPriorityByOutcome) { + const summaryItemByRun = testResultByRun.getSummaryItems(); + summaryItemByRun.forEach(summaryItem => { + testResultsForPriorityByOutcome.forEach((value, supportedTestOutcome) => { + const resultCountByPriority = value.getTestResultsForRun(Number.parseInt(summaryItem.$id)); + resultCountByPriority.forEach((resultCount, priority) => { + if (!summaryItem.$testCountForOutcomeByPriority.has(priority)) { + summaryItem.$testCountForOutcomeByPriority.set(priority, new Map()); + } + const testCountByOutcome = summaryItem.$testCountForOutcomeByPriority.get(priority); + if (!testCountByOutcome.has(supportedTestOutcome)) { + testCountByOutcome.set(supportedTestOutcome, 0); + } + testCountByOutcome.set(supportedTestOutcome, testCountByOutcome.get(supportedTestOutcome) + resultCountByPriority.get(priority)); + }); + }); + }); + return summaryItemByRun; + } + getTestSummaryDataByPriorityAsync() { + return __awaiter(this, void 0, void 0, function* () { + var outcomeFilters = new Map(); + outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed, [TestInterfaces_1.TestOutcome.Passed]); + outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Inconclusive, [TestInterfaces_1.TestOutcome.Inconclusive]); + outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.NotExecuted, [TestInterfaces_1.TestOutcome.NotExecuted]); + outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Other, TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed, TestInterfaces_1.TestOutcome.Inconclusive, TestInterfaces_1.TestOutcome.NotExecuted])); + var testResultDetailsForOutcomes = new Map(); + const outcomeMap = new Map(); + const keys = Array.from(outcomeFilters.keys()); + for (var i = 0; i < keys.length; i++) { + const outcome = keys[i]; + const resultsForOutCome = yield this.testResultsClient.getTestResultsDetailsAsync("Priority", outcomeFilters.get(outcome)); + outcomeMap.set(outcome, resultsForOutCome); + } + outcomeMap.forEach((value, key) => { + testResultDetailsForOutcomes.set(key, new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(value)); + }); + return testResultDetailsForOutcomes; + }); + } +} +exports.TestSummaryDataProvider = TestSummaryDataProvider; +// export class AggregatedResultsByOutcomeImpl implements AggregatedResultsByOutcome { +// count?: number; +// duration?: any; +// groupByField?: string; +// groupByValue?: any; +// outcome?: TestOutcome; +// rerunResultCount?: number; +// } +//# sourceMappingURL=TestSummaryDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js.map new file mode 100644 index 00000000..c7f76611 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TestSummaryDataProvider.js","sourceRoot":"","sources":["TestSummaryDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/task.dev.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/task.dev.json similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/task.dev.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/task.dev.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/task.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/task.json similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/task.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/task.json diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.d.ts new file mode 100644 index 00000000..103d2e9d --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.d.ts @@ -0,0 +1,17 @@ +import { ReportConfiguration } from "../config/ReportConfiguration"; +export declare class TelemetryLogger { + static readonly TELEMETRY_LINE = "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; + private static instance; + private static reportConfig; + /** + * Formats and sends all telemetry collected to be published + */ + static LogTaskConfig(reportConfiguration: ReportConfiguration): void; + static LogModulePerf(moduleName: string, timeTaken: number, numRetries?: Number): void; + /** + * Publishes an object as a string as telemetry + * @param telemetryToLog Object to be logged as a string + */ + private static logTelemetry; + static InvokeWithPerfLogger(executor: () => Promise, executorName: string): Promise; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js new file mode 100644 index 00000000..44e8c5ad --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js @@ -0,0 +1,103 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TelemetryLogger = void 0; +const PipelineType_1 = require("../config/pipeline/PipelineType"); +const EnumUtils_1 = require("../utils/EnumUtils"); +const now = require("performance-now"); +class TelemetryLogger { + /** + * Formats and sends all telemetry collected to be published + */ + static LogTaskConfig(reportConfiguration) { + this.reportConfig = reportConfiguration; + const pipelineConfig = this.reportConfig.$pipelineConfiguration; + const mailConfig = this.reportConfig.$mailConfiguration; + const reportDataConfig = this.reportConfig.$reportDataConfiguration; + let pipelineTypeString = "Release"; + let environmentId = 0; + if (pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build) { + pipelineTypeString = "Build"; + } + else { + environmentId = pipelineConfig.$environmentId; + } + const groupTestSummary = reportDataConfig.$groupTestSummaryBy.map(g => EnumUtils_1.EnumUtils.GetGroupTestResultsByString(g)); + let groupTestSummaryString = groupTestSummary[0]; + if (groupTestSummary.length > 0) { + groupTestSummaryString = groupTestSummary.join(","); + } + this.logTelemetry({ + pipelineId: pipelineConfig.$pipelineId, + pipelineType: pipelineTypeString, + projectId: pipelineConfig.$projectId, + projectName: pipelineConfig.$projectName, + environmentId: environmentId, + taskConfiguration: { + sendMailCondition: EnumUtils_1.EnumUtils.GetMailConditionString(this.reportConfig.$sendMailCondition), + smtpHost: mailConfig.$smtpConfig.$smtpHost, + smtpUserName: mailConfig.$smtpConfig.$userName, + enableTLs: mailConfig.$smtpConfig.$enableTLS, + includeCommits: reportDataConfig.$includeCommits, + includeOthersInTotal: reportDataConfig.$includeOthersInTotal, + groupTestSummaryBy: groupTestSummaryString, + testResultsConfiguration: { + includeFailedTests: reportDataConfig.$testResultsConfig.$includeFailedTests, + includeInconclusiveTests: reportDataConfig.$testResultsConfig.$includeInconclusiveTests, + includeNotExecutedTests: reportDataConfig.$testResultsConfig.$includeNotExecutedTests, + includeOtherTests: reportDataConfig.$testResultsConfig.$includeOtherTests, + includePassedTests: reportDataConfig.$testResultsConfig.$includePassedTests, + maxItemsToShow: reportDataConfig.$testResultsConfig.$maxItemsToShow + } + } + }); + } + static LogModulePerf(moduleName, timeTaken, numRetries = 0) { + const timeTakenString = timeTaken.toFixed(2); + if (numRetries < 1) { + this.logTelemetry({ + "ModuleName": `${moduleName}`, + "PERF": `${timeTakenString}` + }); + } + else { + this.logTelemetry({ + "ModuleName": `${moduleName}`, + "PERF": `${timeTakenString}`, + "Retries": `${numRetries}` + }); + } + } + /** + * Publishes an object as a string as telemetry + * @param telemetryToLog Object to be logged as a string + */ + static logTelemetry(telemetryToLog) { + console.log(TelemetryLogger.TELEMETRY_LINE + JSON.stringify(telemetryToLog)); + } + static InvokeWithPerfLogger(executor, executorName) { + return __awaiter(this, void 0, void 0, function* () { + const perfStart = now(); + let returnVal; + try { + returnVal = yield executor(); + } + finally { + // Log time taken by the dataprovider + TelemetryLogger.LogModulePerf(executorName, now() - perfStart); + } + return returnVal; + }); + } +} +exports.TelemetryLogger = TelemetryLogger; +TelemetryLogger.TELEMETRY_LINE = "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; +//# sourceMappingURL=TelemetryLogger.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js.map new file mode 100644 index 00000000..80c01ab2 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TelemetryLogger.js","sourceRoot":"","sources":["TelemetryLogger.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/telemetry/TelemetryLogger.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/telemetry/TelemetryLogger.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.d.ts new file mode 100644 index 00000000..a95ad04b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.d.ts @@ -0,0 +1,14 @@ +import { IConfigurationProvider } from "../../config/IConfigurationProvider"; +import { SendMailCondition } from "../../config/report/SendMailCondition"; +import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; +import { MailConfiguration } from "../../config/mail/MailConfiguration"; +import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; +export declare class FileWriter { + static writeToFile(content: string, fileName: string): void; +} +export declare class MockConfigProvider implements IConfigurationProvider { + getPipelineConfiguration(): PipelineConfiguration; + getMailConfiguration(): MailConfiguration; + getReportDataConfiguration(): ReportDataConfiguration; + getSendMailCondition(): SendMailCondition; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js new file mode 100644 index 00000000..895b94fd --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js @@ -0,0 +1,80 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MockConfigProvider = exports.FileWriter = void 0; +const SendMailCondition_1 = require("../../config/report/SendMailCondition"); +const PipelineConfiguration_1 = require("../../config/pipeline/PipelineConfiguration"); +const MailConfiguration_1 = require("../../config/mail/MailConfiguration"); +const ReportDataConfiguration_1 = require("../../config/report/ReportDataConfiguration"); +const ReportConfiguration_1 = require("../../config/ReportConfiguration"); +const ReportManager_1 = require("../../ReportManager"); +const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); +const TestResultsConfiguration_1 = require("../../config/report/TestResultsConfiguration"); +const RecipientsConfiguration_1 = require("../../config/mail/RecipientsConfiguration"); +const SmtpConfiguration_1 = require("../../config/mail/SmtpConfiguration"); +const PipelineType_1 = require("../../config/pipeline/PipelineType"); +const ReportProvider_1 = require("../../providers/ReportProvider"); +const DataProviderFactory_1 = require("../../providers/DataProviderFactory"); +const HTMLReportCreator_1 = require("../../htmlreport/HTMLReportCreator"); +const util_1 = require("util"); +const EmailSender_1 = require("../../EmailSender"); +const TelemetryLogger_1 = require("../../telemetry/TelemetryLogger"); +const fs = require("fs"); +const accessKey = process.env.AccessKey; +const smtpUser = process.env.SMTPUSER; +const smtpPassword = process.env.SMTPPASSWORD; +class FileWriter { + static writeToFile(content, fileName) { + const currDir = __dirname; + console.log(`CurrentDir: ${currDir}`); + var msgPath = `${currDir}\\${fileName}`; + fs.writeFile(msgPath, content, (err) => { + if (err) { + return console.log(err); + } + console.log("File saved successfully!"); + }); + } +} +exports.FileWriter = FileWriter; +class MockConfigProvider { + getPipelineConfiguration() { + return new PipelineConfiguration_1.PipelineConfiguration(PipelineType_1.PipelineType.Release, 13942411, "ProjectId", "ProjectName", 160977787, 9462, false, "https://dev.azure.com/{account}/", accessKey); + } + getMailConfiguration() { + return new MailConfiguration_1.MailConfiguration("[{environmentStatus}] {passPercentage} tests passed", new RecipientsConfiguration_1.RecipientsConfiguration("xyz@email.com", false, false, false, false), new RecipientsConfiguration_1.RecipientsConfiguration("", false, false, false, false), new SmtpConfiguration_1.SmtpConfiguration(smtpUser, smtpPassword, "smtp.live.com", true), "test.com"); + } + getReportDataConfiguration() { + const testResultsConfig = new TestResultsConfiguration_1.TestResultsConfiguration(true, false, false, false, false, GroupTestResultsBy_1.GroupTestResultsBy.Run, 10); + return new ReportDataConfiguration_1.ReportDataConfiguration(true, false, true, [GroupTestResultsBy_1.GroupTestResultsBy.Priority, GroupTestResultsBy_1.GroupTestResultsBy.Run], testResultsConfig); + } + getSendMailCondition() { + return SendMailCondition_1.SendMailCondition.Always; + } +} +exports.MockConfigProvider = MockConfigProvider; +function run() { + return __awaiter(this, void 0, void 0, function* () { + console.log('Node Version: ' + process.version); + const configProvider = new MockConfigProvider(); + const reportConfiguration = new ReportConfiguration_1.ReportConfiguration(configProvider); + TelemetryLogger_1.TelemetryLogger.LogTaskConfig(reportConfiguration); + const reportManager = new ReportManager_1.ReportManager(new ReportProvider_1.ReportProvider(new DataProviderFactory_1.DataProviderFactory(configProvider.getPipelineConfiguration())), new HTMLReportCreator_1.HTMLReportCreator(), new EmailSender_1.EmailSender()); + reportManager.sendReportAsync(reportConfiguration); + }); +} +if (util_1.isNullOrUndefined(accessKey)) { + console.error("Set Environment Vars for AccessKey."); +} +else { + run(); +} +//# sourceMappingURL=InvokeTest.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js.map new file mode 100644 index 00000000..626265a1 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"InvokeTest.js","sourceRoot":"","sources":["InvokeTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js new file mode 100644 index 00000000..1627cca4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js @@ -0,0 +1,32 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const sinon_1 = __importDefault(require("sinon")); +const ReportFactory_1 = require("../../model/ReportFactory"); +const ReportProvider_1 = require("../../providers/ReportProvider"); +const ReportManager_1 = require("../../ReportManager"); +const MissingDataError_1 = require("../../exceptions/MissingDataError"); +describe("ReportManager Tests", () => { + let reportProvider = sinon_1.default.createStubInstance(ReportProvider_1.ReportProvider); + beforeEach(() => { + const report = ReportFactory_1.ReportFactory.createNewReport(null); + sinon_1.default.stub(reportProvider, "createReportAsync").returns(Promise.resolve(report)); + sinon_1.default.stub(report, "$dataMissing").returns(true); + }); + test("ReportManager throws error when datamissing from report", () => __awaiter(void 0, void 0, void 0, function* () { + let reportManager = new ReportManager_1.ReportManager(reportProvider, null, null); + expect(reportManager.sendReportAsync(null)).rejects.toThrow(MissingDataError_1.MissingDataError); + })); +}); +//# sourceMappingURL=ReportManagerTests.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js.map new file mode 100644 index 00000000..0e8a5585 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportManagerTests.js","sourceRoot":"","sources":["ReportManagerTests.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,6DAA0D;AAE1D,mEAAgE;AAChE,uDAAoD;AACpD,wEAAqE;AAErE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IAEnC,IAAI,cAAc,GAAoB,eAAK,CAAC,kBAAkB,CAAC,+BAAc,CAAC,CAAC;IAE/E,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACnD,eAAK,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,eAAK,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAS,EAAE;QACzE,IAAI,aAAa,GAAG,IAAI,6BAAa,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAgB,CAAC,CAAC;IAChF,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/tsconfig.json b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tsconfig.json similarity index 74% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/tsconfig.json rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tsconfig.json index a164d1e0..e1989e99 100644 --- a/Extensions/emailReportTask/Tasks/emailReportTaskV2/tsconfig.json +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tsconfig.json @@ -12,7 +12,6 @@ "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ "moduleResolution": "node", "resolveJsonModule": true, - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - "outDir": "../../../dist/Tasks/emailReportTask/emailReportTaskV2" + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ } } \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.d.ts new file mode 100644 index 00000000..0199d3d5 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.d.ts @@ -0,0 +1,3 @@ +export declare class DisplayNameHelper { + static getPriorityDisplayName(priority: string): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js new file mode 100644 index 00000000..76a207cc --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DisplayNameHelper = void 0; +class DisplayNameHelper { + static getPriorityDisplayName(priority) { + const priorityInt = Number.parseInt(priority); + if (!isNaN(priorityInt) && priorityInt == 255) { + return "Priority unspecified"; + } + return `Priority: ${priority}`; + } +} +exports.DisplayNameHelper = DisplayNameHelper; +//# sourceMappingURL=DisplayNameHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js.map new file mode 100644 index 00000000..cd10b401 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DisplayNameHelper.js","sourceRoot":"","sources":["DisplayNameHelper.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAErB,MAAM,CAAC,sBAAsB,CAAC,QAAgB;QACnD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE;YAC7C,OAAO,sBAAsB,CAAC;SAC/B;QACD,OAAO,aAAa,QAAQ,EAAE,CAAC;IACjC,CAAC;CACF;AATD,8CASC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/DisplayNameHelper.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/DisplayNameHelper.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.d.ts new file mode 100644 index 00000000..c233622f --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.d.ts @@ -0,0 +1,6 @@ +import { SendMailCondition } from "../config/report/SendMailCondition"; +import { GroupTestResultsBy } from "../config/report/GroupTestResultsBy"; +export declare class EnumUtils { + static GetMailConditionString(condition: SendMailCondition): string; + static GetGroupTestResultsByString(condition: GroupTestResultsBy): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js new file mode 100644 index 00000000..6f71fe91 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js @@ -0,0 +1,45 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EnumUtils = void 0; +const SendMailCondition_1 = require("../config/report/SendMailCondition"); +const GroupTestResultsBy_1 = require("../config/report/GroupTestResultsBy"); +class EnumUtils { + static GetMailConditionString(condition) { + let index = 0; + for (let val in SendMailCondition_1.SendMailCondition) { + if (!isNaN(Number(val)) && condition == Number(val)) { + break; + } + index++; + } + let index2 = 0; + for (let val in SendMailCondition_1.SendMailCondition) { + if (isNaN(Number(val))) { + if (index2 == index) + return val; + index2++; + } + } + return null; + } + static GetGroupTestResultsByString(condition) { + let index = 0; + for (let val in GroupTestResultsBy_1.GroupTestResultsBy) { + if (!isNaN(Number(val)) && condition == Number(val)) { + break; + } + index++; + } + let index2 = 0; + for (let val in GroupTestResultsBy_1.GroupTestResultsBy) { + if (isNaN(Number(val))) { + if (index2 == index) + return val; + index2++; + } + } + return null; + } +} +exports.EnumUtils = EnumUtils; +//# sourceMappingURL=EnumUtils.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js.map new file mode 100644 index 00000000..4777777b --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EnumUtils.js","sourceRoot":"","sources":["EnumUtils.ts"],"names":[],"mappings":";;;AAAA,0EAAuE;AACvE,4EAAyE;AAEzE,MAAa,SAAS;IAEb,MAAM,CAAC,sBAAsB,CAAC,SAA4B;QAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAI,IAAI,GAAG,IAAI,qCAAiB,EAAE;YAChC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM;aACP;YACD,KAAK,EAAE,CAAC;SACT;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAI,IAAI,GAAG,IAAI,qCAAiB,EAAE;YAChC,IAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAG,MAAM,IAAI,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM,CAAC,2BAA2B,CAAC,SAA6B;QACrE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAI,IAAI,GAAG,IAAI,uCAAkB,EAAE;YACjC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM;aACP;YACD,KAAK,EAAE,CAAC;SACT;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAI,IAAI,GAAG,IAAI,uCAAkB,EAAE;YACjC,IAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAG,MAAM,IAAI,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAzCD,8BAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/EnumUtils.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/EnumUtils.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.d.ts new file mode 100644 index 00000000..6e9dd614 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.d.ts @@ -0,0 +1,4 @@ +import { ReleaseDeployPhase, ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; +export declare class EnvironmentExtensions { + static getPhases(environment: ReleaseEnvironment): Array; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js new file mode 100644 index 00000000..0daa1050 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EnvironmentExtensions = void 0; +class EnvironmentExtensions { + static getPhases(environment) { + const phases = new Array(); + if (environment.deploySteps != null && environment.deploySteps.length > 0) { + let attempt = 0; + let latestDeploySteps = environment.deploySteps[0]; + for (var i = 0; i < environment.deploySteps.length; i++) { + if (environment.deploySteps[i].attempt > attempt) { + latestDeploySteps = environment.deploySteps[i]; + } + } + phases.push(...latestDeploySteps.releaseDeployPhases); + } + return phases; + } +} +exports.EnvironmentExtensions = EnvironmentExtensions; +//# sourceMappingURL=EnvironmentExtensions.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js.map new file mode 100644 index 00000000..d47af3f4 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EnvironmentExtensions.js","sourceRoot":"","sources":["EnvironmentExtensions.ts"],"names":[],"mappings":";;;AAEA,MAAa,qBAAqB;IAChC,MAAM,CAAC,SAAS,CAAC,WAA+B;QAC9C,MAAM,MAAM,GAAG,IAAI,KAAK,EAAsB,CAAC;QAC/C,IAAI,WAAW,CAAC,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACzE,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,iBAAiB,GAAsB,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACtE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/D,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE;oBAChD,iBAAiB,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;iBAChD;aACF;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;SACvD;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAhBD,sDAgBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/EnvironmentExtensions.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/EnvironmentExtensions.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.d.ts new file mode 100644 index 00000000..ca46ba16 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.d.ts @@ -0,0 +1,7 @@ +export declare class StringUtils { + static isNullOrWhiteSpace(input: string): boolean; + static CompressNewLines(content: string): string; + private static getNonEmptyLines; + static ReplaceNewlineWithBrTag(content: string): string; + static getFirstNLines(content: string, lineCount: number): string; +} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js new file mode 100644 index 00000000..2593a00c --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StringUtils = void 0; +class StringUtils { + static isNullOrWhiteSpace(input) { + if (typeof input === 'undefined' || input == null) + return true; + return input.replace("/\s/g", '').length < 1; + } + static CompressNewLines(content) { + if (content != null) { + const lines = this.getNonEmptyLines(content); + content = lines.join("\n"); + } + return content; + } + static getNonEmptyLines(s) { + s = s.replace("\r", ""); + return s.split('\n') + .filter(str => !this.isNullOrWhiteSpace(str)) + .map(str => str.trim()); + } + static ReplaceNewlineWithBrTag(content) { + if (content == null) { + return null; + } + const lines = this.getNonEmptyLines(content); + return lines.join("
"); + } + static getFirstNLines(content, lineCount) { + if (content != null) { + var lines = this.getNonEmptyLines(content); + return lines.slice(0, lineCount).join("\n"); + } + return null; + } +} +exports.StringUtils = StringUtils; +//# sourceMappingURL=StringUtils.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js.map new file mode 100644 index 00000000..b390e763 --- /dev/null +++ b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"StringUtils.js","sourceRoot":"","sources":["StringUtils.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACf,MAAM,CAAC,kBAAkB,CAAC,KAAa;QAE5C,IAAI,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/D,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAAC,OAAe;QAC5C,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC7C,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5B;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,CAAS;QACvC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;aACjB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;aAC5C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,uBAAuB,CAAC,OAAe;QACnD,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,OAAe,EAAE,SAAiB;QAC7D,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7C;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAvCD,kCAuCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/StringUtils.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.ts similarity index 100% rename from Extensions/emailReportTask/Tasks/emailReportTaskV2/utils/StringUtils.ts rename to Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTaskV1/vss-extension.json b/Extensions/emailReportTask/Tasks/emailReportTaskV1/vss-extension.json deleted file mode 100644 index 3f83bbdb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTaskV1/vss-extension.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "manifestVersion": 1, - "id": "EmailReportExtension", - "name": "Email Report Extension", - "version": "1.1.9", - "publisher": "epsteam", - "public": true, - "targets": [ - { - "id": "Microsoft.VisualStudio.Services" - } - ], - "description": "Sends Detailed email report for a build or release pipeline", - "categories": [ - "Azure Pipelines" - ], - "icons": { - "default": "images/icon.png" - }, - "tags": [], - "scopes": [], - "files": [ - { - "path": "emailReportTask" - }, - { - "path": "images", - "addressable": true - } - ], - "content": { - "details": { - "path": "README.md" - }, - "license": { - "path": "LICENSE" - } - }, - "repository": { - "type": "git", - "uri": "https://github.com/microsoft/azure-devops-engineering-extensions" - }, - "contributions": [ - { - "id": "EmailReport", - "type": "ms.vss-distributed-task.task", - "targets": [ - "ms.vss-distributed-task.tasks" - ], - "properties": { - "name": "emailReportTask" - } - } - ] -} \ No newline at end of file diff --git a/Extensions/emailReportTask/azure-devops-extensions.json b/Extensions/emailReportTask/azure-devops-extensions.json index 4ccce5fc..141dae11 100644 --- a/Extensions/emailReportTask/azure-devops-extensions.json +++ b/Extensions/emailReportTask/azure-devops-extensions.json @@ -48,7 +48,7 @@ "ms.vss-distributed-task.tasks" ], "properties": { - "name": "emailReportTask" + "name": "Tasks/emailReportTask" } } ] diff --git a/package.json b/package.json index 4fc2cbc9..bcc9d86d 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,11 @@ "prebuild": "npm install --no-optional", "build:release": "npm run clean && npm run prebuild && npm run deps:npm:tasks && npm run compile && npm run deps:prune:tasks && webpack", - "deps:npm:tasks": "glob-exec --parallel --foreach \"Extensions/emailReportTask/Tasks/*/tsconfig.json\" -- \"cd {{file.dir}} && npm install --no-update-notifier --no-progress\"", - "deps:prune:tasks": "glob-exec --parallel --foreach \"Extensions/emailReportTask/Tasks/*/tsconfig.json\" -- \"cd {{file.dir}} && npm prune --production --no-update-notifier --no-progress\"", + "deps:npm:tasks": "glob-exec --parallel --foreach \"Extensions/emailReportTask/Tasks/emailReportTask/*/tsconfig.json\" -- \"cd {{file.dir}} && npm install --no-update-notifier --no-progress\"", + "deps:prune:tasks": "glob-exec --parallel --foreach \"Extensions/emailReportTask/Tasks/emailReportTask/*/tsconfig.json\" -- \"cd {{file.dir}} && npm prune --production --no-update-notifier --no-progress\"", "webpack": "webpack --config webpack.config.js --progress", "compile": "npm run compile:tasks", - "compile:tasks": "glob-exec \"Extensions/emailReportTask/Tasks/*/tsconfig.json\" -- \"tsc -b {{files.join(' ')}}\"", + "compile:tasks": "glob-exec \"Extensions/emailReportTask/Tasks/emailReportTask/*/tsconfig.json\" -- \"tsc -b {{files.join(' ')}}\"", "package:dev": "tfx extension create --rev-version --manifest-globs azure-devops-extension.json task.json --overrides-file ./configs/dev.json --root ./dist", "package:release": "", diff --git a/webpack.config.js b/webpack.config.js index d3f9c481..85ea994f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -18,7 +18,7 @@ module.exports = { { from: "./LICENSE", to: "." }, { from: "./Extensions/emailReportTask/azure-devops-extensions.json", to: "azure-devops-extension.json" }, { - from: "./Extensions/dist/Tasks", + from: "./Extensions/emailReportTask/Tasks", globOptions: { dot: true, gitignore: false, From dbc125832985868b3d5f3e01b758d88993e19711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Wed, 13 Sep 2023 16:26:41 +0200 Subject: [PATCH 07/11] add initial pipeline to build, package and deploy emailReporting extension --- .azure-pipelines/azure-pipeline.yml | 92 +++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 .azure-pipelines/azure-pipeline.yml diff --git a/.azure-pipelines/azure-pipeline.yml b/.azure-pipelines/azure-pipeline.yml new file mode 100644 index 00000000..5b40a3c4 --- /dev/null +++ b/.azure-pipelines/azure-pipeline.yml @@ -0,0 +1,92 @@ +variables: + - name: major + value: "1" + - name: minor + value: "1" + - name: extensionName + value: "EmailReportExtension" + - name: marketplaceServiceConnection + value: "marketplaceServiceConnection" + - name: publisherId + value: "ms-devlabs" + - name: publicExtensionName + value: "Email Report Extension" + - name: extensionId + value: "EmailReportExtension" + +name: $(major).$(minor)$(rev:.r) + +trigger: + branches: + include: + - master + +pr: none + +resources: + repositories: + - repository: pipeline-templates + type: git + name: Sage/pipeline-template + ref: main + +stages: + - stage: "Build" + jobs: + - job: "BuildPack" + displayname: "Build and package" + pool: + vmImage: "ubuntu-latest" + steps: + - task: NodeTool@0 + inputs: + versionSpec: "16.x" + displayName: "Install Node.js" + - template: build.yml@pipeline-templates + - template: package.yml@pipeline-templates + parameters: + extensionName: $(extensionName) + outputPath: "out" + + - stage: "DeployDev" + displayName: "Deploy to Dev" + dependsOn: "Build" + condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) + jobs: + - template: deploy.yml@pipeline-templates + parameters: + environment: "dev" + extensionName: $(extensionName) + marketplaceServiceConnection: $(marketplaceServiceConnection) + publisherId: $(publisherId) + publicExtensionName: $(publicExtensionName) + - stage: "DeployTest" + displayName: "Deploy to Test" + dependsOn: "DeployDev" + condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) + jobs: + - template: deploy.yml@pipeline-templates + parameters: + environment: "test" + extensionName: $(extensionName) + marketplaceServiceConnection: $(marketplaceServiceConnection) + publisherId: $(publisherId) + publicExtensionName: $(publicExtensionName) + updateTaskVersion: true + extensionId: $(extensionId) + + - stage: "DeployRelease" + displayName: "Deploy to Public" + dependsOn: "DeployTest" + condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) + jobs: + - template: deploy.yml@pipeline-templates + parameters: + environment: "public" + extensionName: $(extensionName) + marketplaceServiceConnection: $(marketplaceServiceConnection) + publisherId: $(publisherId) + publicExtensionName: $(publicExtensionName) + extensionVisibility: "public" + updateTaskVersion: true + extensionId: $(extensionId) From 7a90a2d96314e54af8400f4d448f8ba6895a157b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Wed, 4 Oct 2023 09:33:37 +0300 Subject: [PATCH 08/11] add missing scripts --- package.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bcc9d86d..144356e4 100644 --- a/package.json +++ b/package.json @@ -13,15 +13,11 @@ "compile": "npm run compile:tasks", "compile:tasks": "glob-exec \"Extensions/emailReportTask/Tasks/emailReportTask/*/tsconfig.json\" -- \"tsc -b {{files.join(' ')}}\"", "package:dev": "tfx extension create --rev-version --manifest-globs azure-devops-extension.json task.json --overrides-file ./configs/dev.json --root ./dist", - "package:release": "", + "package:release": "tfx extension create --rev-version --manifest-globs azure-devops-extension.json task.json --overrides-file ./configs/release.json --root ./dist", + "build": "npm run prebuild && npm run deps:npm:tasks && npm run compile", - "build": "npm run prebuild && npm run build:prinsights", - "build:t2": "npm run prebuild && npm run build:prinsights", - "pack:t2": "npm run clean && npm run build:t2 && npm run pack:prinsights", "e2e:t1": "npm run e2e:emailreport", "e2e:t2": "npm run e2e:prinsights", - "build:prinsights": "tsc -p Tasks/pullRequestInsightsTask/tsconfig.json", - "pack:prinsights": "node ./commands/package.js pullRequestInsights", "e2e:emailreport": "node js/emailReportExtension/emailReportTask/tests/__e_to_e_tests__/InvokeTest.js", "e2e:prinsights": "node js/pullRequestInsightsExtension/pullRequestInsightsTask/tests/__e_to_e_tests__/InvokeTest.js", "clean": "rimraf dist" From 43117e1570f6278164ae44f1d2c99495768204cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Thu, 5 Oct 2023 11:24:10 +0300 Subject: [PATCH 09/11] cleanup indermeintermediary files --- .../emailReportTaskV1/EmailSender.js | 94 --------- .../emailReportTaskV1/EmailSender.js.map | 1 - .../emailReportTaskV1/IReportSender.js | 3 - .../emailReportTaskV1/IReportSender.js.map | 1 - .../emailReportTaskV1/ReportManager.js | 50 ----- .../emailReportTaskV1/ReportManager.js.map | 1 - .../config/ConfigurationProvider.js | 145 -------------- .../config/ConfigurationProvider.js.map | 1 - .../config/IConfigurationProvider.js | 3 - .../config/IConfigurationProvider.js.map | 1 - .../config/ReportConfiguration.js | 52 ----- .../config/ReportConfiguration.js.map | 1 - .../emailReportTaskV1/config/TaskConstants.js | 35 ---- .../config/TaskConstants.js.map | 1 - .../config/mail/MailConfiguration.js | 56 ------ .../config/mail/MailConfiguration.js.map | 1 - .../config/mail/RecipientsConfiguration.js | 49 ----- .../mail/RecipientsConfiguration.js.map | 1 - .../config/mail/SmtpConfiguration.js | 41 ---- .../config/mail/SmtpConfiguration.js.map | 1 - .../config/pipeline/PipelineConfiguration.js | 94 --------- .../pipeline/PipelineConfiguration.js.map | 1 - .../config/pipeline/PipelineType.js | 9 - .../config/pipeline/PipelineType.js.map | 1 - .../config/report/GroupTestResultsBy.js | 10 - .../config/report/GroupTestResultsBy.js.map | 1 - .../config/report/ReportDataConfiguration.js | 49 ----- .../report/ReportDataConfiguration.js.map | 1 - .../config/report/SendMailCondition.js | 11 -- .../config/report/SendMailCondition.js.map | 1 - .../config/report/TestResultsConfiguration.js | 65 ------- .../report/TestResultsConfiguration.js.map | 1 - .../exceptions/DataProviderError.js | 12 -- .../exceptions/DataProviderError.js.map | 1 - .../exceptions/InputError.js | 12 -- .../exceptions/InputError.js.map | 1 - .../exceptions/InvalidTestResultDataError.js | 12 -- .../InvalidTestResultDataError.js.map | 1 - .../emailReportTaskV1/exceptions/MailError.js | 12 -- .../exceptions/MailError.js.map | 1 - .../exceptions/MissingDataError.js | 12 -- .../exceptions/MissingDataError.js.map | 1 - .../exceptions/PipelineNotFoundError.js | 12 -- .../exceptions/PipelineNotFoundError.js.map | 1 - .../exceptions/PostProcessorError.js | 12 -- .../exceptions/PostProcessorError.js.map | 1 - .../exceptions/ReportError.js | 27 --- .../exceptions/ReportError.js.map | 1 - .../htmlreport/HTMLReportCreator.js | 33 ---- .../htmlreport/HTMLReportCreator.js.map | 1 - .../htmlreport/IHTMLReportCreator.js | 3 - .../htmlreport/IHTMLReportCreator.js.map | 1 - .../emailReportTaskV1/index.js | 67 ------- .../emailReportTaskV1/index.js.map | 1 - .../emailReportTaskV1/model/BuildReport.js | 79 -------- .../model/BuildReport.js.map | 1 - .../emailReportTaskV1/model/ChangeModel.js | 49 ----- .../model/ChangeModel.js.map | 1 - .../emailReportTaskV1/model/IssueModel.js | 25 --- .../emailReportTaskV1/model/IssueModel.js.map | 1 - .../emailReportTaskV1/model/JobModel.js | 41 ---- .../emailReportTaskV1/model/JobModel.js.map | 1 - .../emailReportTaskV1/model/PhaseModel.js | 41 ---- .../emailReportTaskV1/model/PhaseModel.js.map | 1 - .../emailReportTaskV1/model/ReleaseReport.js | 179 ------------------ .../model/ReleaseReport.js.map | 1 - .../emailReportTaskV1/model/Report.js | 99 ---------- .../emailReportTaskV1/model/Report.js.map | 1 - .../emailReportTaskV1/model/ReportFactory.js | 73 ------- .../model/ReportFactory.js.map | 1 - .../emailReportTaskV1/model/TaskModel.js | 57 ------ .../emailReportTaskV1/model/TaskModel.js.map | 1 - .../model/helpers/LinkHelper.js | 125 ------------ .../model/helpers/LinkHelper.js.map | 1 - .../model/helpers/TestResultsHelper.js | 48 ----- .../model/helpers/TestResultsHelper.js.map | 1 - .../model/helpers/TimeFormatter.js | 79 -------- .../model/helpers/TimeFormatter.js.map | 1 - .../testresults/TestOutcomeForPriority.js | 12 -- .../testresults/TestOutcomeForPriority.js.map | 1 - .../model/testresults/TestResultGroupModel.js | 10 - .../testresults/TestResultGroupModel.js.map | 1 - .../model/testresults/TestResultModel.js | 11 -- .../model/testresults/TestResultModel.js.map | 1 - .../testresults/TestSummaryGroupModel.js | 10 - .../testresults/TestSummaryGroupModel.js.map | 1 - .../model/testresults/TestSummaryItemModel.js | 91 --------- .../testresults/TestSummaryItemModel.js.map | 1 - .../model/viewmodel/ArtifactViewModel.js | 31 --- .../model/viewmodel/ArtifactViewModel.js.map | 1 - .../viewmodel/BuildReferenceViewModel.js | 28 --- .../viewmodel/BuildReferenceViewModel.js.map | 1 - .../model/viewmodel/ChangeViewModel.js | 21 -- .../model/viewmodel/ChangeViewModel.js.map | 1 - .../model/viewmodel/DeploymentJobViewModel.js | 49 ----- .../viewmodel/DeploymentJobViewModel.js.map | 1 - .../model/viewmodel/EmailReportViewModel.js | 132 ------------- .../viewmodel/EmailReportViewModel.js.map | 1 - .../model/viewmodel/MailAddressViewModel.js | 128 ------------- .../viewmodel/MailAddressViewModel.js.map | 1 - .../model/viewmodel/PhaseIssuesViewModel.js | 31 --- .../viewmodel/PhaseIssuesViewModel.js.map | 1 - .../model/viewmodel/PhaseViewModel.js | 35 ---- .../model/viewmodel/PhaseViewModel.js.map | 1 - .../viewmodel/ReleaseEnvironmentViewModel.js | 11 -- .../ReleaseEnvironmentViewModel.js.map | 1 - .../viewmodel/ReleaseReferenceViewModel.js | 13 -- .../ReleaseReferenceViewModel.js.map | 1 - .../model/viewmodel/ReleaseViewModel.js | 25 --- .../model/viewmodel/ReleaseViewModel.js.map | 1 - .../viewmodel/TaskIssueSummaryViewModel.js | 58 ------ .../TaskIssueSummaryViewModel.js.map | 1 - .../model/viewmodel/TaskIssueViewModel.js | 15 -- .../model/viewmodel/TaskIssueViewModel.js.map | 1 - .../model/viewmodel/TaskResultViewModel.js | 82 -------- .../viewmodel/TaskResultViewModel.js.map | 1 - .../viewmodel/TestInfoByPriorityViewModel.js | 25 --- .../TestInfoByPriorityViewModel.js.map | 1 - .../viewmodel/TestResultSummaryViewModel.js | 37 ---- .../TestResultSummaryViewModel.js.map | 1 - .../model/viewmodel/TestResultViewModel.js | 70 ------- .../viewmodel/TestResultViewModel.js.map | 1 - .../viewmodel/TestResultsGroupViewModel.js | 43 ----- .../TestResultsGroupViewModel.js.map | 1 - .../viewmodel/TestSummaryGroupViewModel.js | 40 ---- .../TestSummaryGroupViewModel.js.map | 1 - .../viewmodel/TestSummaryItemViewModel.js | 37 ---- .../viewmodel/TestSummaryItemViewModel.js.map | 1 - .../model/viewmodel/WorkItemViewModel.js | 28 --- .../model/viewmodel/WorkItemViewModel.js.map | 1 - .../providers/DataProviderFactory.js | 56 ------ .../providers/DataProviderFactory.js.map | 1 - .../providers/IDataProvider.js | 3 - .../providers/IDataProvider.js.map | 1 - .../providers/IDataProviderFactory.js | 3 - .../providers/IDataProviderFactory.js.map | 1 - .../providers/IPostProcessor.js | 3 - .../providers/IPostProcessor.js.map | 1 - .../providers/IReportProvider.js | 3 - .../providers/IReportProvider.js.map | 1 - .../providers/ReportProvider.js | 86 --------- .../providers/ReportProvider.js.map | 1 - .../providers/SendMailConditionProcessor.js | 140 -------------- .../SendMailConditionProcessor.js.map | 1 - .../AbstractTestResultsDetailsParser.js | 35 ---- .../AbstractTestResultsDetailsParser.js.map | 1 - .../helpers/TestResultDetailsParserFactory.js | 20 -- .../TestResultDetailsParserFactory.js.map | 1 - .../TestResultDetailsParserForPriority.js | 64 ------- .../TestResultDetailsParserForPriority.js.map | 1 - .../helpers/TestResultDetailsParserForRun.js | 39 ---- .../TestResultDetailsParserForRun.js.map | 1 - .../providers/pipeline/BuildDataProvider.js | 101 ---------- .../pipeline/BuildDataProvider.js.map | 1 - .../providers/pipeline/ReleaseDataProvider.js | 116 ------------ .../pipeline/ReleaseDataProvider.js.map | 1 - .../providers/restclients/AbstractClient.js | 21 -- .../restclients/AbstractClient.js.map | 1 - .../restclients/AbstractTestResultsClient.js | 104 ---------- .../AbstractTestResultsClient.js.map | 1 - .../providers/restclients/BuildClient.js | 53 ------ .../providers/restclients/BuildClient.js.map | 1 - .../restclients/BuildTestResultsClient.js | 30 --- .../restclients/BuildTestResultsClient.js.map | 1 - .../restclients/IPipelineRestClient.js | 3 - .../restclients/IPipelineRestClient.js.map | 1 - .../restclients/ITestResultsClient.js | 3 - .../restclients/ITestResultsClient.js.map | 1 - .../providers/restclients/IWorkItemClient.js | 3 - .../restclients/IWorkItemClient.js.map | 1 - .../providers/restclients/ReleaseClient.js | 68 ------- .../restclients/ReleaseClient.js.map | 1 - .../restclients/ReleaseTestResultsClient.js | 30 --- .../ReleaseTestResultsClient.js.map | 1 - .../providers/restclients/RetryablePromise.js | 50 ----- .../restclients/RetryablePromise.js.map | 1 - .../providers/restclients/WorkItemClient.js | 37 ---- .../restclients/WorkItemClient.js.map | 1 - .../providers/tcmproviders/TcmHelper.js | 67 ------- .../providers/tcmproviders/TcmHelper.js.map | 1 - .../tcmproviders/TestOwnersDataProvider.js | 35 ---- .../TestOwnersDataProvider.js.map | 1 - .../tcmproviders/TestResultsDataProvider.js | 177 ----------------- .../TestResultsDataProvider.js.map | 1 - .../tcmproviders/TestSummaryDataProvider.js | 120 ------------ .../TestSummaryDataProvider.js.map | 1 - .../telemetry/TelemetryLogger.js | 103 ---------- .../telemetry/TelemetryLogger.js.map | 1 - .../tests/__e_to_e_tests__/InvokeTest.js | 80 -------- .../tests/__e_to_e_tests__/InvokeTest.js.map | 1 - .../tests/__tests__/ReportManagerTests.js | 32 ---- .../tests/__tests__/ReportManagerTests.js.map | 1 - .../utils/DisplayNameHelper.js | 14 -- .../utils/DisplayNameHelper.js.map | 1 - .../emailReportTaskV1/utils/EnumUtils.js | 45 ----- .../emailReportTaskV1/utils/EnumUtils.js.map | 1 - .../utils/EnvironmentExtensions.js | 21 -- .../utils/EnvironmentExtensions.js.map | 1 - .../emailReportTaskV1/utils/StringUtils.js | 39 ---- .../utils/StringUtils.js.map | 1 - .../emailReportTaskV2/EmailSender.js | 94 --------- .../emailReportTaskV2/EmailSender.js.map | 1 - .../emailReportTaskV2/IReportSender.js | 3 - .../emailReportTaskV2/IReportSender.js.map | 1 - .../emailReportTaskV2/ReportManager.js | 50 ----- .../emailReportTaskV2/ReportManager.js.map | 1 - .../config/ConfigurationProvider.js | 145 -------------- .../config/ConfigurationProvider.js.map | 1 - .../config/IConfigurationProvider.js | 3 - .../config/IConfigurationProvider.js.map | 1 - .../config/ReportConfiguration.js | 52 ----- .../config/ReportConfiguration.js.map | 1 - .../emailReportTaskV2/config/TaskConstants.js | 35 ---- .../config/TaskConstants.js.map | 1 - .../config/mail/MailConfiguration.js | 56 ------ .../config/mail/MailConfiguration.js.map | 1 - .../config/mail/RecipientsConfiguration.js | 49 ----- .../mail/RecipientsConfiguration.js.map | 1 - .../config/mail/SmtpConfiguration.js | 41 ---- .../config/mail/SmtpConfiguration.js.map | 1 - .../config/pipeline/PipelineConfiguration.js | 94 --------- .../pipeline/PipelineConfiguration.js.map | 1 - .../config/pipeline/PipelineType.js | 9 - .../config/pipeline/PipelineType.js.map | 1 - .../config/report/GroupTestResultsBy.js | 10 - .../config/report/GroupTestResultsBy.js.map | 1 - .../config/report/ReportDataConfiguration.js | 49 ----- .../report/ReportDataConfiguration.js.map | 1 - .../config/report/SendMailCondition.js | 11 -- .../config/report/SendMailCondition.js.map | 1 - .../config/report/TestResultsConfiguration.js | 65 ------- .../report/TestResultsConfiguration.js.map | 1 - .../exceptions/DataProviderError.js | 12 -- .../exceptions/DataProviderError.js.map | 1 - .../exceptions/InputError.js | 12 -- .../exceptions/InputError.js.map | 1 - .../exceptions/InvalidTestResultDataError.js | 12 -- .../InvalidTestResultDataError.js.map | 1 - .../emailReportTaskV2/exceptions/MailError.js | 12 -- .../exceptions/MailError.js.map | 1 - .../exceptions/MissingDataError.js | 12 -- .../exceptions/MissingDataError.js.map | 1 - .../exceptions/PipelineNotFoundError.js | 12 -- .../exceptions/PipelineNotFoundError.js.map | 1 - .../exceptions/PostProcessorError.js | 12 -- .../exceptions/PostProcessorError.js.map | 1 - .../exceptions/ReportError.js | 27 --- .../exceptions/ReportError.js.map | 1 - .../htmlreport/HTMLReportCreator.js | 33 ---- .../htmlreport/HTMLReportCreator.js.map | 1 - .../htmlreport/IHTMLReportCreator.js | 3 - .../htmlreport/IHTMLReportCreator.js.map | 1 - .../emailReportTaskV2/index.js | 67 ------- .../emailReportTaskV2/index.js.map | 1 - .../emailReportTaskV2/model/BuildReport.js | 79 -------- .../model/BuildReport.js.map | 1 - .../emailReportTaskV2/model/ChangeModel.js | 49 ----- .../model/ChangeModel.js.map | 1 - .../emailReportTaskV2/model/IssueModel.js | 25 --- .../emailReportTaskV2/model/IssueModel.js.map | 1 - .../emailReportTaskV2/model/JobModel.js | 41 ---- .../emailReportTaskV2/model/JobModel.js.map | 1 - .../emailReportTaskV2/model/PhaseModel.js | 41 ---- .../emailReportTaskV2/model/PhaseModel.js.map | 1 - .../emailReportTaskV2/model/ReleaseReport.js | 179 ------------------ .../model/ReleaseReport.js.map | 1 - .../emailReportTaskV2/model/Report.js | 99 ---------- .../emailReportTaskV2/model/Report.js.map | 1 - .../emailReportTaskV2/model/ReportFactory.js | 73 ------- .../model/ReportFactory.js.map | 1 - .../emailReportTaskV2/model/TaskModel.js | 57 ------ .../emailReportTaskV2/model/TaskModel.js.map | 1 - .../model/helpers/LinkHelper.js | 125 ------------ .../model/helpers/LinkHelper.js.map | 1 - .../model/helpers/TestResultsHelper.js | 48 ----- .../model/helpers/TestResultsHelper.js.map | 1 - .../model/helpers/TimeFormatter.js | 79 -------- .../model/helpers/TimeFormatter.js.map | 1 - .../testresults/TestOutcomeForPriority.js | 12 -- .../testresults/TestOutcomeForPriority.js.map | 1 - .../model/testresults/TestResultGroupModel.js | 10 - .../testresults/TestResultGroupModel.js.map | 1 - .../model/testresults/TestResultModel.js | 11 -- .../model/testresults/TestResultModel.js.map | 1 - .../testresults/TestSummaryGroupModel.js | 10 - .../testresults/TestSummaryGroupModel.js.map | 1 - .../model/testresults/TestSummaryItemModel.js | 91 --------- .../testresults/TestSummaryItemModel.js.map | 1 - .../model/viewmodel/ArtifactViewModel.js | 31 --- .../model/viewmodel/ArtifactViewModel.js.map | 1 - .../viewmodel/BuildReferenceViewModel.js | 28 --- .../viewmodel/BuildReferenceViewModel.js.map | 1 - .../model/viewmodel/ChangeViewModel.js | 21 -- .../model/viewmodel/ChangeViewModel.js.map | 1 - .../model/viewmodel/DeploymentJobViewModel.js | 49 ----- .../viewmodel/DeploymentJobViewModel.js.map | 1 - .../model/viewmodel/EmailReportViewModel.js | 132 ------------- .../viewmodel/EmailReportViewModel.js.map | 1 - .../model/viewmodel/MailAddressViewModel.js | 128 ------------- .../viewmodel/MailAddressViewModel.js.map | 1 - .../model/viewmodel/PhaseIssuesViewModel.js | 31 --- .../viewmodel/PhaseIssuesViewModel.js.map | 1 - .../model/viewmodel/PhaseViewModel.js | 35 ---- .../model/viewmodel/PhaseViewModel.js.map | 1 - .../viewmodel/ReleaseEnvironmentViewModel.js | 11 -- .../ReleaseEnvironmentViewModel.js.map | 1 - .../viewmodel/ReleaseReferenceViewModel.js | 13 -- .../ReleaseReferenceViewModel.js.map | 1 - .../model/viewmodel/ReleaseViewModel.js | 25 --- .../model/viewmodel/ReleaseViewModel.js.map | 1 - .../viewmodel/TaskIssueSummaryViewModel.js | 58 ------ .../TaskIssueSummaryViewModel.js.map | 1 - .../model/viewmodel/TaskIssueViewModel.js | 15 -- .../model/viewmodel/TaskIssueViewModel.js.map | 1 - .../model/viewmodel/TaskResultViewModel.js | 82 -------- .../viewmodel/TaskResultViewModel.js.map | 1 - .../viewmodel/TestInfoByPriorityViewModel.js | 25 --- .../TestInfoByPriorityViewModel.js.map | 1 - .../viewmodel/TestResultSummaryViewModel.js | 37 ---- .../TestResultSummaryViewModel.js.map | 1 - .../model/viewmodel/TestResultViewModel.js | 70 ------- .../viewmodel/TestResultViewModel.js.map | 1 - .../viewmodel/TestResultsGroupViewModel.js | 43 ----- .../TestResultsGroupViewModel.js.map | 1 - .../viewmodel/TestSummaryGroupViewModel.js | 40 ---- .../TestSummaryGroupViewModel.js.map | 1 - .../viewmodel/TestSummaryItemViewModel.js | 37 ---- .../viewmodel/TestSummaryItemViewModel.js.map | 1 - .../model/viewmodel/WorkItemViewModel.js | 28 --- .../model/viewmodel/WorkItemViewModel.js.map | 1 - .../providers/DataProviderFactory.js | 56 ------ .../providers/DataProviderFactory.js.map | 1 - .../providers/IDataProvider.js | 3 - .../providers/IDataProvider.js.map | 1 - .../providers/IDataProviderFactory.js | 3 - .../providers/IDataProviderFactory.js.map | 1 - .../providers/IPostProcessor.js | 3 - .../providers/IPostProcessor.js.map | 1 - .../providers/IReportProvider.js | 3 - .../providers/IReportProvider.js.map | 1 - .../providers/ReportProvider.js | 86 --------- .../providers/ReportProvider.js.map | 1 - .../providers/SendMailConditionProcessor.js | 140 -------------- .../SendMailConditionProcessor.js.map | 1 - .../AbstractTestResultsDetailsParser.js | 35 ---- .../AbstractTestResultsDetailsParser.js.map | 1 - .../helpers/TestResultDetailsParserFactory.js | 20 -- .../TestResultDetailsParserFactory.js.map | 1 - .../TestResultDetailsParserForPriority.js | 64 ------- .../TestResultDetailsParserForPriority.js.map | 1 - .../helpers/TestResultDetailsParserForRun.js | 39 ---- .../TestResultDetailsParserForRun.js.map | 1 - .../providers/pipeline/BuildDataProvider.js | 101 ---------- .../pipeline/BuildDataProvider.js.map | 1 - .../providers/pipeline/ReleaseDataProvider.js | 116 ------------ .../pipeline/ReleaseDataProvider.js.map | 1 - .../providers/restclients/AbstractClient.js | 21 -- .../restclients/AbstractClient.js.map | 1 - .../restclients/AbstractTestResultsClient.js | 104 ---------- .../AbstractTestResultsClient.js.map | 1 - .../providers/restclients/BuildClient.js | 53 ------ .../providers/restclients/BuildClient.js.map | 1 - .../restclients/BuildTestResultsClient.js | 30 --- .../restclients/BuildTestResultsClient.js.map | 1 - .../restclients/IPipelineRestClient.js | 3 - .../restclients/IPipelineRestClient.js.map | 1 - .../restclients/ITestResultsClient.js | 3 - .../restclients/ITestResultsClient.js.map | 1 - .../providers/restclients/IWorkItemClient.js | 3 - .../restclients/IWorkItemClient.js.map | 1 - .../providers/restclients/ReleaseClient.js | 68 ------- .../restclients/ReleaseClient.js.map | 1 - .../restclients/ReleaseTestResultsClient.js | 30 --- .../ReleaseTestResultsClient.js.map | 1 - .../providers/restclients/RetryablePromise.js | 50 ----- .../restclients/RetryablePromise.js.map | 1 - .../providers/restclients/WorkItemClient.js | 37 ---- .../restclients/WorkItemClient.js.map | 1 - .../providers/tcmproviders/TcmHelper.js | 67 ------- .../providers/tcmproviders/TcmHelper.js.map | 1 - .../tcmproviders/TestOwnersDataProvider.js | 35 ---- .../TestOwnersDataProvider.js.map | 1 - .../tcmproviders/TestResultsDataProvider.js | 177 ----------------- .../TestResultsDataProvider.js.map | 1 - .../tcmproviders/TestSummaryDataProvider.js | 120 ------------ .../TestSummaryDataProvider.js.map | 1 - .../telemetry/TelemetryLogger.js | 103 ---------- .../telemetry/TelemetryLogger.js.map | 1 - .../tests/__e_to_e_tests__/InvokeTest.js | 80 -------- .../tests/__e_to_e_tests__/InvokeTest.js.map | 1 - .../tests/__tests__/ReportManagerTests.js | 32 ---- .../tests/__tests__/ReportManagerTests.js.map | 1 - .../utils/DisplayNameHelper.js | 14 -- .../utils/DisplayNameHelper.js.map | 1 - .../emailReportTaskV2/utils/EnumUtils.js | 45 ----- .../emailReportTaskV2/utils/EnumUtils.js.map | 1 - .../utils/EnvironmentExtensions.js | 21 -- .../utils/EnvironmentExtensions.js.map | 1 - .../emailReportTaskV2/utils/StringUtils.js | 39 ---- .../utils/StringUtils.js.map | 1 - 400 files changed, 9704 deletions(-) delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js.map delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js.map diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js deleted file mode 100644 index e3f84dab..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js +++ /dev/null @@ -1,94 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EmailSender = void 0; -const MailAddressViewModel_1 = require("./model/viewmodel/MailAddressViewModel"); -const MailError_1 = require("./exceptions/MailError"); -const util_1 = require("util"); -const nodemailer = require("nodemailer"); -const url = require("url"); -class EmailSender { - sendReportAsync(report, htmlReportMessage, mailConfiguration) { - return __awaiter(this, void 0, void 0, function* () { - const mailAddressViewModel = new MailAddressViewModel_1.MailAddressViewModel(report, mailConfiguration); - let smtpUrlProvided = mailConfiguration.$smtpConfig.$smtpHost; - console.log(`Using SmtpHost URL: ${smtpUrlProvided}`); - smtpUrlProvided = smtpUrlProvided.includes("://") ? smtpUrlProvided : "smtp://" + smtpUrlProvided; - console.log(`Parsed Url: ${smtpUrlProvided}`); - let smtpUrl = url.parse(smtpUrlProvided, true); - console.log(`Host: ${smtpUrl.host}`); - console.log(`HostName: ${smtpUrl.hostname}`); - console.log(`Port: ${smtpUrl.port}`); - console.log(`Protocol: ${smtpUrl.protocol}`); - const smtpHost = smtpUrl.hostname; - let smtpPort = smtpUrl.port; - smtpPort = util_1.isNullOrUndefined(smtpUrl.port) ? 587 : smtpUrl.port; - console.log(`Using HostName: ${smtpHost} and port: ${smtpPort}`); - let transporter; - if (mailConfiguration.$smtpConfig.$enableTLS) { - transporter = nodemailer.createTransport({ - host: smtpHost, - port: smtpPort, - tls: { - maxVersion: 'TLSv1.2', - minVersion: 'TLSv1.2', - rejectUnauthorized: false - }, - requireTLS: true, - auth: { - user: mailConfiguration.$smtpConfig.$userName, - pass: mailConfiguration.$smtpConfig.$password - } - }); - } - else { - transporter = nodemailer.createTransport({ - host: smtpHost, - port: smtpPort, - auth: { - user: mailConfiguration.$smtpConfig.$userName, - pass: mailConfiguration.$smtpConfig.$password - } - }); - } - try { - const result = yield this.sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, htmlReportMessage); - console.log(`Mail Sent Successfully: ${result.response}`); - return true; - } - catch (err) { - throw new MailError_1.MailError(err); - } - }); - } - sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, message) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - yield transporter.sendMail({ - from: mailAddressViewModel.from, - to: mailAddressViewModel.to.join(","), - cc: util_1.isNullOrUndefined(mailAddressViewModel.cc) || mailAddressViewModel.cc.length < 1 ? null : mailAddressViewModel.cc.join(","), - subject: mailConfiguration.$mailSubject, - html: message - }, (err, response) => { - if (err) { - reject(err); - } - else { - resolve(response); - } - }); - })); - }); - } -} -exports.EmailSender = EmailSender; -//# sourceMappingURL=EmailSender.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js.map deleted file mode 100644 index ae6f1e15..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EmailSender.js","sourceRoot":"","sources":["EmailSender.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js deleted file mode 100644 index 71c2bb2b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IReportSender.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js.map deleted file mode 100644 index 8b73c789..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IReportSender.js","sourceRoot":"","sources":["IReportSender.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js deleted file mode 100644 index 43d04bff..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportManager = void 0; -const ReportError_1 = require("./exceptions/ReportError"); -const MissingDataError_1 = require("./exceptions/MissingDataError"); -const EnumUtils_1 = require("./utils/EnumUtils"); -class ReportManager { - constructor(reportProvider, htmlReportCreator, reportSender) { - this.reportProvider = reportProvider; - this.reportSender = reportSender; - this.htmlReportCreator = htmlReportCreator; - } - sendReportAsync(reportConfig) { - return __awaiter(this, void 0, void 0, function* () { - let mailSent = false; - try { - console.log("Fetching data for email report"); - const report = yield this.reportProvider.createReportAsync(reportConfig); - console.log("Created report view model"); - if (report.$dataMissing) { - throw new MissingDataError_1.MissingDataError("Unable to fetch all data for generating report. Not Sending report."); - } - else if (report.$sendMailConditionSatisfied && this.reportSender != null) { - console.log("Creating report message"); - const htmlMessage = this.htmlReportCreator.createHtmlReport(report, reportConfig); - mailSent = yield this.reportSender.sendReportAsync(report, htmlMessage, reportConfig.$mailConfiguration); - } - else { - console.log(`Not sending mail, as the user send mail condition - '${EnumUtils_1.EnumUtils.GetMailConditionString(reportConfig.$sendMailCondition)}' is not satisfied.`); - } - } - catch (err) { - // Exit Task with Error to fail the task - ReportError_1.ReportError.HandleError(err, true); - } - return mailSent; - }); - } -} -exports.ReportManager = ReportManager; -//# sourceMappingURL=ReportManager.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js.map deleted file mode 100644 index d231f427..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportManager.js","sourceRoot":"","sources":["ReportManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,0DAAuD;AAGvD,oEAAiE;AACjE,iDAA8C;AAE9C,MAAa,aAAa;IAMxB,YAAY,cAA+B,EAAE,iBAAqC,EAAE,YAA2B;QAC7G,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEY,eAAe,CAAC,YAAiC;;YAC5D,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI;gBACF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBAEzC,IAAI,MAAM,CAAC,YAAY,EAAE;oBACvB,MAAM,IAAI,mCAAgB,CAAC,qEAAqE,CAAC,CAAC;iBACnG;qBACI,IAAI,MAAM,CAAC,2BAA2B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;oBACxE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACvC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;oBAClF,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;iBAC1G;qBAAM;oBACL,OAAO,CAAC,GAAG,CAAC,wDAAwD,qBAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;iBAC7J;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,wCAAwC;gBACxC,yBAAW,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;aACpC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;KAAA;CACF;AApCD,sCAoCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js deleted file mode 100644 index da9e522b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js +++ /dev/null @@ -1,145 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ConfigurationProvider = void 0; -const tl = require("azure-pipelines-task-lib"); -const TaskConstants_1 = require("./TaskConstants"); -const SendMailCondition_1 = require("./report/SendMailCondition"); -const MailConfiguration_1 = require("./mail/MailConfiguration"); -const RecipientsConfiguration_1 = require("./mail/RecipientsConfiguration"); -const SmtpConfiguration_1 = require("./mail/SmtpConfiguration"); -const InputError_1 = require("../exceptions/InputError"); -const ReportDataConfiguration_1 = require("./report/ReportDataConfiguration"); -const TestResultsConfiguration_1 = require("./report/TestResultsConfiguration"); -const GroupTestResultsBy_1 = require("./report/GroupTestResultsBy"); -const PipelineConfiguration_1 = require("./pipeline/PipelineConfiguration"); -const PipelineType_1 = require("./pipeline/PipelineType"); -const StringUtils_1 = require("../utils/StringUtils"); -const util_1 = require("util"); -class ConfigurationProvider { - constructor() { - this.initPipelineConfiguration(); - this.initMailConfiguration(); - this.initReportDataConfiguration(); - this.initSendMailCondition(); - } - getPipelineConfiguration() { - return this.pipelineConfiguration; - } - getMailConfiguration() { - return this.mailConfiguration; - } - getReportDataConfiguration() { - return this.reportDataConfiguration; - } - getSendMailCondition() { - return this.sendMailCondition; - } - /** - * Gets access token from system - */ - getAccessKey() { - return tl.getEndpointAuthorizationParameter(TaskConstants_1.TaskConstants.VSS_CONNECTION_KEY, TaskConstants_1.TaskConstants.ACCESS_PARAMETER, false); - } - initPipelineConfiguration() { - const hostType = tl.getVariable(TaskConstants_1.TaskConstants.HOST_KEY); - const pipelineType = hostType == "build" ? PipelineType_1.PipelineType.Build : PipelineType_1.PipelineType.Release; - const pipelineIdKey = pipelineType == PipelineType_1.PipelineType.Build ? TaskConstants_1.TaskConstants.BUILD_ID_KEY : TaskConstants_1.TaskConstants.RELEASE_ID_KEY; - const pipelineId = Number(tl.getVariable(pipelineIdKey)); - const projectId = tl.getVariable(TaskConstants_1.TaskConstants.PROJECTID_KEY); - const projectName = tl.getVariable(TaskConstants_1.TaskConstants.PROJECTNAME_KEY); - const envId = Number(tl.getVariable(TaskConstants_1.TaskConstants.ENVIRONMENTID_KEY)); - const envDefId = Number(tl.getVariable(TaskConstants_1.TaskConstants.ENVIRONMENTDEFID_KEY)); - const usePrevEnvironment = tl.getBoolInput(TaskConstants_1.TaskConstants.USEPREVENV_INPUTKEY); - const teamUri = tl.getVariable(TaskConstants_1.TaskConstants.TEAM_FOUNDATION_KEY); - this.pipelineConfiguration = new PipelineConfiguration_1.PipelineConfiguration(pipelineType, pipelineId, projectId, projectName, envId, envDefId, usePrevEnvironment, teamUri, this.getAccessKey()); - } - initMailConfiguration() { - const smtpConnectionId = tl.getInput(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, true); - const endPointScheme = tl.getEndpointAuthorizationScheme(smtpConnectionId, true); - if (endPointScheme != "UsernamePassword") { - throw new InputError_1.InputError(`Incorrect EndPoint Scheme Provided - '${endPointScheme}'. Only UserName and Password type Endpoints allowed.`); - } - const smtpHost = tl.getEndpointUrl(smtpConnectionId, true).replace(/(^\w+:|^)\/\//, '').replace(/\/$/, ''); - const userName = tl.getEndpointAuthorizationParameter(smtpConnectionId, "UserName", true); - const password = tl.getEndpointAuthorizationParameter(smtpConnectionId, "Password", true); - const enableTLS = tl.getBoolInput(TaskConstants_1.TaskConstants.ENABLETLS_INPUTKEY, true); - const smtpConfig = new SmtpConfiguration_1.SmtpConfiguration(userName, password, smtpHost, enableTLS); - // Mail Subject - const mailSubject = tl.getInput(TaskConstants_1.TaskConstants.SUBJECT_INPUTKEY, true); - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(mailSubject)) { - throw new InputError_1.InputError("Email subject not set"); - } - // Optional inputs - const toAddresses = tl.getInput(TaskConstants_1.TaskConstants.TOADDRESS_INPUTKEY, false); - const ccAddresses = tl.getInput(TaskConstants_1.TaskConstants.CCADDRESS_INPUTKEY, false); - const includeInToAddressesConfig = tl.getInput(TaskConstants_1.TaskConstants.INCLUDEINTO_INPUTKEY, false); - const includeInCCAddressesConfig = tl.getInput(TaskConstants_1.TaskConstants.INCLUDEINCC_INPUTKEY, false); - // Addresses Configuration - const toRecipientsConfiguration = this.getRecipientConfiguration(toAddresses, includeInToAddressesConfig); - const ccRecipientsConfiguration = this.getRecipientConfiguration(ccAddresses, includeInCCAddressesConfig); - const defaultDomain = tl.getInput(TaskConstants_1.TaskConstants.DEFAULTDOMAIN_INPUTKEY, true); - this.mailConfiguration = new MailConfiguration_1.MailConfiguration(mailSubject, toRecipientsConfiguration, ccRecipientsConfiguration, smtpConfig, defaultDomain); - } - initReportDataConfiguration() { - // required inputs - const groupResultsBy = this.getGroupTestResultsByEnumFromString(tl.getInput(TaskConstants_1.TaskConstants.GROUPTESTRESULTSBY_INPUTKEY, true)); - const includeOthersInTotal = tl.getBoolInput(TaskConstants_1.TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY, true); - const maxTestFailuresToShow = Number(tl.getInput(TaskConstants_1.TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, true)); - const includeCommits = tl.getBoolInput(TaskConstants_1.TaskConstants.INCLUDECOMMITS_INPUTKEY, true); - // optional inputs - const includeResultsStr = tl.getInput(TaskConstants_1.TaskConstants.INCLUDERESULTS_INPUTKEY, false); - const groupTestSummaryByStr = tl.getInput(TaskConstants_1.TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY, false); - const groupTestSummaryBy = new Array(); - if (!util_1.isNullOrUndefined(groupTestSummaryByStr)) { - groupTestSummaryByStr.split(",").forEach(element => { groupTestSummaryBy.push(this.getGroupTestResultsByEnumFromString(element)); }); - } - // derived input values - const includeResultsConfig = util_1.isNullOrUndefined(includeResultsStr) ? [] : includeResultsStr.split(","); - const includeFailedTests = includeResultsConfig.includes("1"); - const includeOtherTests = includeResultsConfig.includes("2"); - const includePassedTests = includeResultsConfig.includes("3"); - const includeInconclusiveTests = includeResultsConfig.includes("4"); - const includeNotExecutedTests = includeResultsConfig.includes("5"); - const testResultsConfig = new TestResultsConfiguration_1.TestResultsConfiguration(includeFailedTests, includePassedTests, includeInconclusiveTests, includeNotExecutedTests, includeOtherTests, groupResultsBy, maxTestFailuresToShow); - this.reportDataConfiguration = new ReportDataConfiguration_1.ReportDataConfiguration(includeCommits, includeOthersInTotal, true, groupTestSummaryBy, testResultsConfig); - } - initSendMailCondition() { - const sendMailConditionStr = tl.getInput(TaskConstants_1.TaskConstants.SENDMAILCONDITION_INPUTKEY); - let sendMailCondition; - switch (sendMailConditionStr) { - case "On Failure": - sendMailCondition = SendMailCondition_1.SendMailCondition.OnFailure; - break; - case "On Success": - sendMailCondition = SendMailCondition_1.SendMailCondition.OnSuccess; - break; - case "On New Failures Only": - sendMailCondition = SendMailCondition_1.SendMailCondition.OnNewFailuresOnly; - break; - default: - sendMailCondition = SendMailCondition_1.SendMailCondition.Always; - break; - } - this.sendMailCondition = sendMailCondition; - } - getRecipientConfiguration(namedRecipients, includeConfigStr) { - if (includeConfigStr != null) { - const includeConfig = includeConfigStr.split(","); - const includeChangesetOwners = includeConfig.includes("1"); - const includeTestOwners = includeConfig.includes("2"); - const includeActiveBugOwners = includeConfig.includes("3"); - const includeCreatedBy = includeConfig.includes("4"); - return new RecipientsConfiguration_1.RecipientsConfiguration(namedRecipients, includeChangesetOwners, includeTestOwners, includeActiveBugOwners, includeCreatedBy); - } - return new RecipientsConfiguration_1.RecipientsConfiguration(namedRecipients); - } - getGroupTestResultsByEnumFromString(groupResultsByStr) { - switch (groupResultsByStr) { - case "Priority": return GroupTestResultsBy_1.GroupTestResultsBy.Priority; - case "Team": return GroupTestResultsBy_1.GroupTestResultsBy.Team; - default: return GroupTestResultsBy_1.GroupTestResultsBy.Run; - } - } -} -exports.ConfigurationProvider = ConfigurationProvider; -//# sourceMappingURL=ConfigurationProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js.map deleted file mode 100644 index 96b7fe79..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ConfigurationProvider.js","sourceRoot":"","sources":["ConfigurationProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js deleted file mode 100644 index 6a116ba8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IConfigurationProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js.map deleted file mode 100644 index 916dcc67..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IConfigurationProvider.js","sourceRoot":"","sources":["IConfigurationProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js deleted file mode 100644 index a602ef99..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportConfiguration = void 0; -const InputError_1 = require("../exceptions/InputError"); -const TaskConstants_1 = require("./TaskConstants"); -const StringUtils_1 = require("../utils/StringUtils"); -class ReportConfiguration { - constructor(configProvider) { - this.sendMailCondition = configProvider.getSendMailCondition(); - this.mailConfiguration = configProvider.getMailConfiguration(); - this.reportDataConfiguration = configProvider.getReportDataConfiguration(); - this.pipelineConfiguration = configProvider.getPipelineConfiguration(); - } - validateConfiguration() { - if (this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow <= 0) { - this.throwError(TaskConstants_1.TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow, "be > 0"); - } - this.validateMailConfig(); - } - validateMailConfig() { - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$mailSubject)) { - this.throwError(TaskConstants_1.TaskConstants.SUBJECT_INPUTKEY, this.mailConfiguration.$mailSubject, "be specified"); - } - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$smtpHost)) { - this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$smtpHost, "specify SMTP Host URL"); - } - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$userName)) { - this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$userName, "specify SMTP UserName"); - } - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$password)) { - this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$password, "specify SMTP Password"); - } - } - // Getters - get $sendMailCondition() { - return this.sendMailCondition; - } - get $mailConfiguration() { - return this.mailConfiguration; - } - get $reportDataConfiguration() { - return this.reportDataConfiguration; - } - get $pipelineConfiguration() { - return this.pipelineConfiguration; - } - throwError(prefix, suffix, expectation) { - throw new InputError_1.InputError(`${prefix} should ${expectation}. Actual Input value: '${suffix}'`); - } -} -exports.ReportConfiguration = ReportConfiguration; -//# sourceMappingURL=ReportConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js.map deleted file mode 100644 index 77e9fd87..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportConfiguration.js","sourceRoot":"","sources":["ReportConfiguration.ts"],"names":[],"mappings":";;;AAKA,yDAAsD;AACtD,mDAAgD;AAChD,sDAAmD;AAEnD,MAAa,mBAAmB;IAM9B,YAAY,cAAsC;QAChD,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,uBAAuB,GAAG,cAAc,CAAC,0BAA0B,EAAE,CAAC;QAC3E,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC,wBAAwB,EAAE,CAAC;IACzE,CAAC;IAED,qBAAqB;QACnB,IAAI,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,eAAe,IAAI,CAAC,EAAE;YACxE,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,8BAA8B,EAAE,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;SAC1I;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,kBAAkB;QACxB,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;YACvE,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;SACtG;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;IACH,CAAC;IAED,UAAU;IACV,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,MAAW,EAAE,WAAmB;QACjE,MAAM,IAAI,uBAAU,CAAC,GAAG,MAAM,WAAW,WAAW,0BAA0B,MAAM,GAAG,CAAC,CAAC;IAC3F,CAAC;CACF;AA3DD,kDA2DC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js deleted file mode 100644 index 8faed453..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskConstants = void 0; -class TaskConstants { -} -exports.TaskConstants = TaskConstants; -TaskConstants.SUBJECT_INPUTKEY = "subject"; -TaskConstants.SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; -TaskConstants.INCLUDECOMMITS_INPUTKEY = "includeCommits"; -TaskConstants.GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; -TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; -TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; -TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; -TaskConstants.INCLUDERESULTS_INPUTKEY = "includeResultsStr"; -TaskConstants.TOADDRESS_INPUTKEY = "toAddress"; -TaskConstants.CCADDRESS_INPUTKEY = "ccAddress"; -TaskConstants.INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; -TaskConstants.INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; -TaskConstants.SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; -// Inputkey value should be "enableTLS" - however changing that will break the task for everyone. See task.dev.json or task.prod.json for the confusion. -// For now -inputkey has to be enableSSL... until AzureDevOps marketplace supports a way to rename params in json -TaskConstants.ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; -TaskConstants.USEPREVENV_INPUTKEY = "usePreviousEnvironment"; -TaskConstants.DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; -TaskConstants.TEAM_FOUNDATION_KEY = "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"; -TaskConstants.VSS_CONNECTION_KEY = "SYSTEMVSSCONNECTION"; -TaskConstants.ACCESS_PARAMETER = "ACCESSTOKEN"; -TaskConstants.PROJECTNAME_KEY = "SYSTEM_TEAMPROJECT"; -TaskConstants.PROJECTID_KEY = "SYSTEM_TEAMPROJECTID"; -TaskConstants.BUILD_ID_KEY = "BUILD_BUILDID"; -TaskConstants.RELEASE_ID_KEY = "RELEASE_RELEASEID"; -TaskConstants.HOST_KEY = "SYSTEM_HOSTTYPE"; -TaskConstants.ENVIRONMENTID_KEY = "RELEASE_ENVIRONMENTID"; -TaskConstants.ENVIRONMENTDEFID_KEY = "RELEASE_DEFINITIONENVIRONMENTID"; -//# sourceMappingURL=TaskConstants.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js.map deleted file mode 100644 index c88ee1c5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskConstants.js","sourceRoot":"","sources":["TaskConstants.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;;AAA1B,sCAgCC;AA/BwB,8BAAgB,GAAG,SAAS,CAAC;AAC7B,wCAA0B,GAAG,yBAAyB,CAAC;AACvD,qCAAuB,GAAG,gBAAgB,CAAC;AAC3C,yCAA2B,GAAG,oBAAoB,CAAC;AACnD,2CAA6B,GAAG,sBAAsB,CAAC;AACvD,4CAA8B,GAAG,uBAAuB,CAAC;AACzD,yCAA2B,GAAG,uBAAuB,CAAC;AACtD,qCAAuB,GAAG,mBAAmB,CAAC;AAC9C,gCAAkB,GAAG,WAAW,CAAC;AACjC,gCAAkB,GAAG,WAAW,CAAC;AACjC,kCAAoB,GAAG,uBAAuB,CAAC;AAC/C,kCAAoB,GAAG,uBAAuB,CAAC;AAC/C,qCAAuB,GAAG,wBAAwB,CAAC;AAC1E,wJAAwJ;AACxJ,iHAAiH;AAC1F,gCAAkB,GAAG,2BAA2B,CAAC;AACjD,iCAAmB,GAAG,wBAAwB,CAAC;AAC/C,oCAAsB,GAAG,eAAe,CAAC;AAEzC,iCAAmB,GACxC,oCAAoC,CAAC;AAChB,gCAAkB,GAAW,qBAAqB,CAAC;AACnD,8BAAgB,GAAW,aAAa,CAAC;AACzC,6BAAe,GAAW,oBAAoB,CAAC;AAC/C,2BAAa,GAAW,sBAAsB,CAAC;AAC/C,0BAAY,GAAW,eAAe,CAAC;AACvC,4BAAc,GAAW,mBAAmB,CAAC;AAC7C,sBAAQ,GAAW,iBAAiB,CAAC;AAErC,+BAAiB,GAAW,uBAAuB,CAAC;AACpD,kCAAoB,GAAW,iCAAiC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js deleted file mode 100644 index b92224fc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MailConfiguration = void 0; -class MailConfiguration { - constructor($mailSubject, $toRecipientsConfig, $ccRecipientsConfig, $smtpConfig, $defaultDomain) { - this.mailSubject = $mailSubject; - this.toRecipientsConfig = $toRecipientsConfig; - this.ccRecipientsConfig = $ccRecipientsConfig; - this.smtpConfig = $smtpConfig; - this.defaultDomain = $defaultDomain; - } - /** - * Getter $defaultDomain - * @return {string} - */ - get $defaultDomain() { - return this.defaultDomain; - } - /** - * Getter $mailSubject - * @return {string} - */ - get $mailSubject() { - return this.mailSubject; - } - /** - * Getter $ccRecipientsConfig - * @return {RecipientsConfiguration} - */ - get $ccRecipientsConfig() { - return this.ccRecipientsConfig; - } - /** - * Getter $smtpConfig - * @return {SmtpConfiguration} - */ - get $smtpConfig() { - return this.smtpConfig; - } - /** - * Getter $toRecipientsConfig - * @return {RecipientsConfiguration} - */ - get $toRecipientsConfig() { - return this.toRecipientsConfig; - } - /** - * Setter $mailSubject - * @param {string} value - */ - set $mailSubject(value) { - this.mailSubject = value; - } -} -exports.MailConfiguration = MailConfiguration; -//# sourceMappingURL=MailConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js.map deleted file mode 100644 index 29e7bf96..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MailConfiguration.js","sourceRoot":"","sources":["MailConfiguration.ts"],"names":[],"mappings":";;;AAGA,MAAa,iBAAiB;IAQ5B,YAAY,YAAoB,EAAE,mBAA4C,EAAE,mBAA4C,EAAE,WAA8B,EAAE,cAAsB;QAClL,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;KAGC;IACD,IAAW,YAAY,CAAC,KAAa;QACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CAEF;AAhED,8CAgEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js deleted file mode 100644 index a13ce410..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RecipientsConfiguration = void 0; -class RecipientsConfiguration { - constructor($defaultRecipients, $includeChangesetOwners, $includeTestOwners, $includeActiveBugOwners, $includeCreatedBy) { - this.defaultRecipients = $defaultRecipients; - this.includeChangesetOwners = $includeChangesetOwners; - this.includeTestOwners = $includeTestOwners; - this.includeActiveBugOwners = $includeActiveBugOwners; - this.includeCreatedBy = $includeCreatedBy; - } - /** - * Getter $defaultRecipients - * @return {string} - */ - get $defaultRecipients() { - return this.defaultRecipients; - } - /** - * Getter $includeChangesetOwners - * @return {boolean} - */ - get $includeChangesetOwners() { - return this.includeChangesetOwners; - } - /** - * Getter $includeTestOwners - * @return {boolean} - */ - get $includeTestOwners() { - return this.includeTestOwners; - } - /** - * Getter $includeActiveBugOwners - * @return {boolean} - */ - get $includeActiveBugOwners() { - return this.includeActiveBugOwners; - } - /** - * Getter $includeCreatedBy - * @return {boolean} - */ - get $includeCreatedBy() { - return this.includeCreatedBy; - } -} -exports.RecipientsConfiguration = RecipientsConfiguration; -//# sourceMappingURL=RecipientsConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js.map deleted file mode 100644 index f69f3fbe..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"RecipientsConfiguration.js","sourceRoot":"","sources":["RecipientsConfiguration.ts"],"names":[],"mappings":";;;AAAA,MAAa,uBAAuB;IAOlC,YAAY,kBAA0B,EAAE,uBAAiC,EAAE,kBAA4B,EAAE,uBAAiC,EAAE,iBAA2B;QACrK,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAtDD,0DAsDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js deleted file mode 100644 index 10c87f7d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.SmtpConfiguration = void 0; -class SmtpConfiguration { - constructor($userName, $password, $smtpHost, $enableTLS) { - this.userName = $userName; - this.password = $password; - this.smtpHost = $smtpHost; - this.enableTLS = $enableTLS; - } - /** - * Getter $userName - * @return {string} - */ - get $userName() { - return this.userName; - } - /** - * Getter $password - * @return {string} - */ - get $password() { - return this.password; - } - /** - * Getter $smtpHost - * @return {string} - */ - get $smtpHost() { - return this.smtpHost; - } - /** - * Getter $enableSSL - * @return {boolean} - */ - get $enableTLS() { - return this.enableTLS; - } -} -exports.SmtpConfiguration = SmtpConfiguration; -//# sourceMappingURL=SmtpConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js.map deleted file mode 100644 index 445b4fd3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SmtpConfiguration.js","sourceRoot":"","sources":["SmtpConfiguration.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAM5B,YAAY,SAAiB,EAAE,SAAiB,EAAE,SAAiB,EAAE,UAAmB;QACtF,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;KAGC;IACD,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA5CD,8CA4CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js deleted file mode 100644 index c8844b9f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js +++ /dev/null @@ -1,94 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PipelineConfiguration = void 0; -const PipelineType_1 = require("./PipelineType"); -const LinkHelper_1 = require("../../model/helpers/LinkHelper"); -class PipelineConfiguration { - constructor($pipelineType, $pipelineId, $projectId, $projectName, $environmentId, $environmentDefinitionId, $usePreviousEnvironment, $teamUri, $accessKey) { - this.pipelineType = $pipelineType; - this.pipelineId = $pipelineId; - this.projectId = $projectId; - this.projectName = $projectName; - this.environmentId = $environmentId; - this.environmentDefinitionId = $environmentDefinitionId; - this.usePreviousEnvironment = $usePreviousEnvironment; - this.teamUri = $teamUri; - this.accessKey = $accessKey; - } - /** - * Getter $pipelineId - * @return {number} - */ - get $pipelineType() { - return this.pipelineType; - } - /** - * Getter $pipelineId - * @return {number} - */ - get $pipelineId() { - return this.pipelineId; - } - /** - * Getter $projectId - * @return {string} - */ - get $projectId() { - return this.projectId; - } - /** - * Getter $projectName - * @return {string} - */ - get $projectName() { - return this.projectName; - } - /** - * Getter $environmentId - * @return {number} - */ - get $environmentId() { - return this.environmentId; - } - /** - * Getter $environmentDefinitionId - * @return {number} - */ - get $environmentDefinitionId() { - return this.environmentDefinitionId; - } - /** - * Getter $usePreviousEnvironment - * @return {boolean} - */ - get $usePreviousEnvironment() { - return this.usePreviousEnvironment; - } - /** - * Getter $teamUri - * @return {string} - */ - get $teamUri() { - return this.teamUri; - } - /** - * Getter $accessKey - * @return {string} - */ - get $accessKey() { - return this.accessKey; - } - getTestTabLink() { - if (this.testTabLink == null) { - if (this.pipelineType == PipelineType_1.PipelineType.Release) { - this.testTabLink = LinkHelper_1.LinkHelper.getTestTabLinkInRelease(this); - } - else if (this.pipelineType == PipelineType_1.PipelineType.Build) { - this.testTabLink = LinkHelper_1.LinkHelper.getTestTabLinkInBuild(this); - } - } - return this.testTabLink; - } -} -exports.PipelineConfiguration = PipelineConfiguration; -//# sourceMappingURL=PipelineConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js.map deleted file mode 100644 index 57b349db..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PipelineConfiguration.js","sourceRoot":"","sources":["PipelineConfiguration.ts"],"names":[],"mappings":";;;AAAA,iDAA8C;AAC9C,+DAA4D;AAE5D,MAAa,qBAAqB;IAYhC,YAAY,aAA2B,EACrC,WAAmB,EACnB,UAAkB,EAClB,YAAoB,EACpB,cAAsB,EACtB,wBAAgC,EAChC,uBAAgC,EAChC,QAAgB,EAChB,UAAkB;QAClB,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;QACpC,IAAI,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;QACxD,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;KAGC;IACD,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;IAGA;IACA,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;YAC5B,IAAI,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC,OAAO,EAAE;gBAC7C,IAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;aAC7D;iBAAM,IAAI,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC,KAAK,EAAE;gBAClD,IAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;aAC3D;SACF;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAlHD,sDAkHC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js deleted file mode 100644 index 630d9589..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PipelineType = void 0; -var PipelineType; -(function (PipelineType) { - PipelineType[PipelineType["Build"] = 0] = "Build"; - PipelineType[PipelineType["Release"] = 1] = "Release"; -})(PipelineType = exports.PipelineType || (exports.PipelineType = {})); -//# sourceMappingURL=PipelineType.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js.map deleted file mode 100644 index a7c978d9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PipelineType.js","sourceRoot":"","sources":["PipelineType.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,iDAAK,CAAA;IACL,qDAAO,CAAA;AACT,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js deleted file mode 100644 index e5a1d7b0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GroupTestResultsBy = void 0; -var GroupTestResultsBy; -(function (GroupTestResultsBy) { - GroupTestResultsBy[GroupTestResultsBy["Priority"] = 0] = "Priority"; - GroupTestResultsBy[GroupTestResultsBy["Run"] = 1] = "Run"; - GroupTestResultsBy[GroupTestResultsBy["Team"] = 2] = "Team"; -})(GroupTestResultsBy = exports.GroupTestResultsBy || (exports.GroupTestResultsBy = {})); -//# sourceMappingURL=GroupTestResultsBy.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js.map deleted file mode 100644 index fa15639d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"GroupTestResultsBy.js","sourceRoot":"","sources":["GroupTestResultsBy.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC5B,mEAAY,CAAA;IACZ,yDAAG,CAAA;IACH,2DAAI,CAAA;AACN,CAAC,EAJW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAI7B"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js deleted file mode 100644 index 770aad71..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportDataConfiguration = void 0; -class ReportDataConfiguration { - constructor($includeCommits, $includeOthersInTotal, $includeEnvironmentInfo, $groupTestSummaryBy, $testResultsConfig) { - this.includeCommits = $includeCommits; - this.includeOthersInTotal = $includeOthersInTotal; - this.includeEnvironmentInfo = $includeEnvironmentInfo; - this.groupTestSummaryBy = $groupTestSummaryBy; - this.testResultsConfig = $testResultsConfig; - } - /** - * Getter $includeCommits - * @return {boolean} - */ - get $includeCommits() { - return this.includeCommits; - } - /** - * Getter $includeOthersInTotal - * @return {boolean} - */ - get $includeOthersInTotal() { - return this.includeOthersInTotal; - } - /** - * Getter $includeEnvironmentInfo - * @return {boolean} - */ - get $includeEnvironmentInfo() { - return this.includeEnvironmentInfo; - } - /** - * Getter $groupTestSummaryBy - * @return {GroupTestResultsBy[]} - */ - get $groupTestSummaryBy() { - return this.groupTestSummaryBy; - } - /** - * Getter $testResultsConfig - * @return {TestResultsConfiguration} - */ - get $testResultsConfig() { - return this.testResultsConfig; - } -} -exports.ReportDataConfiguration = ReportDataConfiguration; -//# sourceMappingURL=ReportDataConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js.map deleted file mode 100644 index 2b4825c2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportDataConfiguration.js","sourceRoot":"","sources":["ReportDataConfiguration.ts"],"names":[],"mappings":";;;AAGA,MAAa,uBAAuB;IAYlC,YAAY,eAAwB,EAAE,qBAA8B,EAAE,uBAAgC,EAAE,mBAAyC,EAAE,kBAA4C;QAC7L,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;QACtC,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC;QAClD,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AA3DD,0DA2DC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js deleted file mode 100644 index faa08b3e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.SendMailCondition = void 0; -var SendMailCondition; -(function (SendMailCondition) { - SendMailCondition[SendMailCondition["Always"] = 0] = "Always"; - SendMailCondition[SendMailCondition["OnFailure"] = 1] = "OnFailure"; - SendMailCondition[SendMailCondition["OnSuccess"] = 2] = "OnSuccess"; - SendMailCondition[SendMailCondition["OnNewFailuresOnly"] = 3] = "OnNewFailuresOnly"; -})(SendMailCondition = exports.SendMailCondition || (exports.SendMailCondition = {})); -//# sourceMappingURL=SendMailCondition.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js.map deleted file mode 100644 index 36ca9571..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SendMailCondition.js","sourceRoot":"","sources":["SendMailCondition.ts"],"names":[],"mappings":";;;AAAA,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,6DAAU,CAAA;IACV,mEAAS,CAAA;IACT,mEAAS,CAAA;IACT,mFAAiB,CAAA;AACnB,CAAC,EALW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAK5B"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js deleted file mode 100644 index 24fb9a79..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js +++ /dev/null @@ -1,65 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsConfiguration = void 0; -class TestResultsConfiguration { - constructor($includeFailedTests, $includePassedTests, $includeInconclusiveTests, $includeNotExecutedTests, $includeOtherTests, $groupTestResultsBy, $maxItemsToShow) { - this.includeFailedTests = $includeFailedTests; - this.includePassedTests = $includePassedTests; - this.includeInconclusiveTests = $includeInconclusiveTests; - this.includeNotExecutedTests = $includeNotExecutedTests; - this.includeOtherTests = $includeOtherTests; - this.groupTestResultsBy = $groupTestResultsBy; - this.maxItemsToShow = $maxItemsToShow; - } - /** - * Getter $includeFailedTests - * @return {boolean} - */ - get $includeFailedTests() { - return this.includeFailedTests; - } - /** - * Getter $includePassedTests - * @return {boolean} - */ - get $includePassedTests() { - return this.includePassedTests; - } - /** - * Getter $includeInconclusiveTests - * @return {boolean} - */ - get $includeInconclusiveTests() { - return this.includeInconclusiveTests; - } - /** - * Getter $includeNotExecutedTests - * @return {boolean} - */ - get $includeNotExecutedTests() { - return this.includeNotExecutedTests; - } - /** - * Getter $includeOtherTests - * @return {boolean} - */ - get $includeOtherTests() { - return this.includeOtherTests; - } - /** - * Getter $groupTestResultsBy - * @return {GroupTestResultsBy} - */ - get $groupTestResultsBy() { - return this.groupTestResultsBy; - } - /** - * Getter $maxItemsToShow - * @return {number} - */ - get $maxItemsToShow() { - return this.maxItemsToShow; - } -} -exports.TestResultsConfiguration = TestResultsConfiguration; -//# sourceMappingURL=TestResultsConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js.map deleted file mode 100644 index 0e9bbf3b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultsConfiguration.js","sourceRoot":"","sources":["TestResultsConfiguration.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAwB;IASnC,YAAY,mBAA4B,EAAE,mBAA4B,EAAE,yBAAkC,EAAE,wBAAiC,EAAE,kBAA2B,EAAE,mBAAuC,EAAE,eAAuB;QAC1O,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,wBAAwB,GAAG,yBAAyB,CAAC;QAC1D,IAAI,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;QACxD,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,yBAAyB;QAClC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AA1ED,4DA0EC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js deleted file mode 100644 index bfb8da0a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DataProviderError = void 0; -const ReportError_1 = require("./ReportError"); -class DataProviderError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = DataProviderError.name; - } -} -exports.DataProviderError = DataProviderError; -//# sourceMappingURL=DataProviderError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js.map deleted file mode 100644 index c033f135..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DataProviderError.js","sourceRoot":"","sources":["DataProviderError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,iBAAkB,SAAQ,yBAAW;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;IACrC,CAAC;CACF;AALD,8CAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js deleted file mode 100644 index 14470419..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.InputError = void 0; -const ReportError_1 = require("./ReportError"); -class InputError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = InputError.name; - } -} -exports.InputError = InputError; -//# sourceMappingURL=InputError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js.map deleted file mode 100644 index f852e88d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"InputError.js","sourceRoot":"","sources":["InputError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,UAAW,SAAQ,yBAAW;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AALD,gCAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js deleted file mode 100644 index d29437eb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.InvalidTestResultDataError = void 0; -const ReportError_1 = require("./ReportError"); -class InvalidTestResultDataError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = InvalidTestResultDataError.name; - } -} -exports.InvalidTestResultDataError = InvalidTestResultDataError; -//# sourceMappingURL=InvalidTestResultDataError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js.map deleted file mode 100644 index 8dc89501..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"InvalidTestResultDataError.js","sourceRoot":"","sources":["InvalidTestResultDataError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,0BAA2B,SAAQ,yBAAW;IACzD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC;IAC9C,CAAC;CACF;AALD,gEAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js deleted file mode 100644 index d068d533..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MailError = void 0; -const ReportError_1 = require("./ReportError"); -class MailError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = MailError.name; - } -} -exports.MailError = MailError; -//# sourceMappingURL=MailError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js.map deleted file mode 100644 index bf6960bb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MailError.js","sourceRoot":"","sources":["MailError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,SAAU,SAAQ,yBAAW;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF;AALD,8BAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js deleted file mode 100644 index 7545c9e6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MissingDataError = void 0; -const ReportError_1 = require("./ReportError"); -class MissingDataError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = MissingDataError.name; - } -} -exports.MissingDataError = MissingDataError; -//# sourceMappingURL=MissingDataError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js.map deleted file mode 100644 index 5977fecc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MissingDataError.js","sourceRoot":"","sources":["MissingDataError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,gBAAiB,SAAQ,yBAAW;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AALD,4CAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js deleted file mode 100644 index 8ce54ee2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PipelineNotFoundError = void 0; -const ReportError_1 = require("./ReportError"); -class PipelineNotFoundError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = "PipelineNotFoundError"; - } -} -exports.PipelineNotFoundError = PipelineNotFoundError; -//# sourceMappingURL=PipelineNotFoundError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js.map deleted file mode 100644 index 1c02cf11..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PipelineNotFoundError.js","sourceRoot":"","sources":["PipelineNotFoundError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,qBAAsB,SAAQ,yBAAW;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js deleted file mode 100644 index 0402641d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PostProcessorError = void 0; -const ReportError_1 = require("./ReportError"); -class PostProcessorError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = PostProcessorError.name; - } -} -exports.PostProcessorError = PostProcessorError; -//# sourceMappingURL=PostProcessorError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js.map deleted file mode 100644 index 7c84fb52..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PostProcessorError.js","sourceRoot":"","sources":["PostProcessorError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,kBAAmB,SAAQ,yBAAW;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACtC,CAAC;CACF;AALD,gDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js deleted file mode 100644 index ab69ab25..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js +++ /dev/null @@ -1,27 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportError = void 0; -const util_1 = require("util"); -class ReportError extends Error { - constructor(message) { - super(message); - } - getMessage() { - const stack = util_1.isNullOrUndefined(this.innerError) || util_1.isNullOrUndefined(this.innerError.stack) ? this.stack : - `${this.stack}\r\nInnerError:${this.innerError.message}: ${this.innerError.stack}`; - return `${this.name}: ${this.message}\r\n ${stack}`; - } - static HandleError(err, rethrow = false) { - if (err instanceof ReportError) { - console.error(err.getMessage()); - } - else { - console.error(err); - } - if (rethrow) { - throw err; - } - } -} -exports.ReportError = ReportError; -//# sourceMappingURL=ReportError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js.map deleted file mode 100644 index 505bc060..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportError.js","sourceRoot":"","sources":["ReportError.ts"],"names":[],"mappings":";;;AAAA,+BAAyC;AAEzC,MAAsB,WAAY,SAAQ,KAAK;IAE7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAEM,UAAU;QACf,MAAM,KAAK,GAAG,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzG,GAAG,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACpF,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,QAAQ,KAAK,EAAE,CAAC;IACtD,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,GAAU,EAAE,UAAmB,KAAK;QAC5D,IAAG,GAAG,YAAY,WAAW,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAE,GAAmB,CAAC,UAAU,EAAE,CAAC,CAAC;SAClD;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpB;QAED,IAAG,OAAO,EAAE;YACV,MAAM,GAAG,CAAC;SACX;IACH,CAAC;CACF;AAvBD,kCAuBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js deleted file mode 100644 index 859c6c18..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.HTMLReportCreator = void 0; -const EmailReportViewModel_1 = require("../model/viewmodel/EmailReportViewModel"); -const fs = require("fs"); -const o2x = require('object-to-xml'); -const xsltProcessor = require("xslt-processor"); -const { xmlParse, xsltProcess } = xsltProcessor; -class HTMLReportCreator { - createHtmlReport(report, reportConfiguration) { - const currDir = __dirname; - console.log(`CurrentDir: ${currDir}`); - var xsltTemplatePath = `${currDir}\\EmailTemplate.xslt`; - console.log("Loading Email Template: " + xsltTemplatePath); - // Create a view model object before serialize to xml - const reportViewModel = new EmailReportViewModel_1.EmailReportViewModel(report, reportConfiguration); - // Serialize gathered data into xml - const xmlString = "" + o2x(reportViewModel) + ""; - // Read XSLT email template - const buffer = fs.readFileSync(xsltTemplatePath); - // Parse the xml string as XmlDocument/Node - const xmlDoc = xmlParse(xmlString, "text/xml"); - // Parse XSLT as XMLDocument - const xsltDoc = xmlParse(buffer.toString(), "application/xml"); - // Fill the XSLT document template with the xml doc data - let outXmlString = xsltProcess(xmlDoc, xsltDoc); - // XML parsing changes
to special chars if they are part of xml nodevalues. Do string replace to fix the jankiness for HTML. - outXmlString = outXmlString.split("<br/>").join("
"); - return outXmlString; - } -} -exports.HTMLReportCreator = HTMLReportCreator; -//# sourceMappingURL=HTMLReportCreator.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js.map deleted file mode 100644 index a6461dec..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"HTMLReportCreator.js","sourceRoot":"","sources":["HTMLReportCreator.ts"],"names":[],"mappings":";;;AAAA,kFAA+E;AAI/E,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AACrC,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAChD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;AAEhD,MAAa,iBAAiB;IAE5B,gBAAgB,CAAC,MAAc,EAAE,mBAAwC;QACvE,MAAM,OAAO,GAAG,SAAS,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QACtC,IAAI,gBAAgB,GAAG,GAAG,OAAO,sBAAsB,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,gBAAgB,CAAC,CAAC;QAE3D,qDAAqD;QACrD,MAAM,eAAe,GAAG,IAAI,2CAAoB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC9E,oCAAoC;QACpC,MAAM,SAAS,GAAW,wBAAwB,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,yBAAyB,CAAC;QACtG,4BAA4B;QAC5B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACjD,2CAA2C;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC/C,4BAA4B;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAC/D,wDAAwD;QACxD,IAAI,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,kIAAkI;QAClI,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAxBD,8CAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js deleted file mode 100644 index f626ba20..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IHTMLReportCreator.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js.map deleted file mode 100644 index 9ec8a16e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IHTMLReportCreator.js","sourceRoot":"","sources":["IHTMLReportCreator.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js deleted file mode 100644 index 239f955d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const ReportConfiguration_1 = require("./config/ReportConfiguration"); -const ConfigurationProvider_1 = require("./config/ConfigurationProvider"); -const ReportManager_1 = require("./ReportManager"); -const ReportProvider_1 = require("./providers/ReportProvider"); -const DataProviderFactory_1 = require("./providers/DataProviderFactory"); -const HTMLReportCreator_1 = require("./htmlreport/HTMLReportCreator"); -const EmailSender_1 = require("./EmailSender"); -const ReportError_1 = require("./exceptions/ReportError"); -const TelemetryLogger_1 = require("./telemetry/TelemetryLogger"); -function run() { - return __awaiter(this, void 0, void 0, function* () { - try { - console.log('Node Version: ' + process.version); - const configProvider = new ConfigurationProvider_1.ConfigurationProvider(); - const reportConfiguration = new ReportConfiguration_1.ReportConfiguration(configProvider); - const reportProvider = new ReportProvider_1.ReportProvider(new DataProviderFactory_1.DataProviderFactory(configProvider.getPipelineConfiguration())); - // Log telemetry: Task Inputs and Configuration - TelemetryLogger_1.TelemetryLogger.LogTaskConfig(reportConfiguration); - const reportManager = new ReportManager_1.ReportManager(reportProvider, new HTMLReportCreator_1.HTMLReportCreator(), new EmailSender_1.EmailSender()); - const mailSent = yield reportManager.sendReportAsync(reportConfiguration); - if (mailSent) { - // Wait for 10 sec and timeout - let val = yield Promise.race([sleep(10000), setEmailSentVariable(mailSent)]); - if (!val) { - console.log("Unable to set variable value in 10 sec. Exiting task."); - } - } - } - catch (err) { - if (err instanceof ReportError_1.ReportError) { - console.log(err.getMessage()); - } - else { - console.log(err); - } - // Fail task - throw err; - } - finally { - console.log("Task Processing Complete."); - } - }); -} -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms, false)); -} -function setEmailSentVariable(mailSent) { - return __awaiter(this, void 0, void 0, function* () { - console.log("Setting EmailReportTask.EmailSent Variable value."); - console.log(`##vso[task.setvariable variable=EmailReportTask.EmailSent;]${mailSent}`); - console.log(`EmailReportTask.EmailSent Variable value set as ${mailSent}`); - return true; - }); -} -run(); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js.map deleted file mode 100644 index c285d1a8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,sEAAmE;AACnE,0EAAuE;AACvE,mDAAgD;AAChD,+DAA4D;AAC5D,yEAAsE;AACtE,sEAAmE;AACnE,+CAA4C;AAC5C,0DAAuD;AACvD,iEAA8D;AAE9D,SAAe,GAAG;;QAChB,IAAI;YAEF,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAEhD,MAAM,cAAc,GAAG,IAAI,6CAAqB,EAAE,CAAC;YACnD,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,CAAC,cAAc,CAAC,CAAC;YACpE,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,yCAAmB,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAE9G,+CAA+C;YAC/C,iCAAe,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YAEnD,MAAM,aAAa,GAAG,IAAI,6BAAa,CACrC,cAAc,EACd,IAAI,qCAAiB,EAAE,EACvB,IAAI,yBAAW,EAAE,CAAC,CAAC;YAErB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YAC1E,IAAG,QAAQ,EAAE;gBACX,8BAA8B;gBAC9B,IAAI,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAG,CAAC,GAAG,EAAE;oBACP,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;iBACtE;aACF;SACF;QACD,OAAO,GAAG,EAAE;YACV,IAAI,GAAG,YAAY,yBAAW,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;aAC/B;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClB;YACD,YAAY;YACZ,MAAM,GAAG,CAAC;SACX;gBACO;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;SAC1C;IACH,CAAC;CAAA;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAe,oBAAoB,CAAC,QAAiB;;QACnD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,8DAA8D,QAAQ,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;CAAA;AAED,GAAG,EAAE,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js deleted file mode 100644 index 90c7aa30..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js +++ /dev/null @@ -1,79 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildReport = void 0; -const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); -const Report_1 = require("./Report"); -const util_1 = require("util"); -const PipelineConfiguration_1 = require("../config/pipeline/PipelineConfiguration"); -const PipelineType_1 = require("../config/pipeline/PipelineType"); -const BuildReferenceViewModel_1 = require("./viewmodel/BuildReferenceViewModel"); -class BuildReport extends Report_1.Report { - setBuildData($build, $timeline, $lastCompletedBuild, $lastCompletedTimeline, $phases, $changes) { - this.build = $build; - this.timeline = $timeline; - this.lastCompletedBuild = $lastCompletedBuild; - this.lastCompletedTimeline = $lastCompletedTimeline; - this.phases = $phases; - this.associatedChanges = $changes; - } - hasPrevGotSameFailures() { - if (this.lastCompletedBuild == null) { - return false; - } - console.log(`Using Last Completed Build: '${this.lastCompletedBuild.id}'.`); - if (this.lastCompletedBuild.id > this.build.id) { - // We are in a situation where current build completed latter compared to the newer one - // Newer one would have already evaluated the failures and sent a mail to committers anyway - // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer - // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line - return true; - } - return null; - } - hasFailedTasks() { - return this.timelineHasFailedTasks(this.timeline); - } - hasPrevFailedTasks() { - return this.timelineHasFailedTasks(this.lastCompletedTimeline); - } - arePrevFailedTasksSame() { - var prevfailedTask = this.getTasksByResultinTimeline(this.lastCompletedTimeline, BuildInterfaces_1.TaskResult.Failed)[0]; - var currentFailedTask = this.getTasksByResultinTimeline(this.timeline, BuildInterfaces_1.TaskResult.Failed)[0]; - // if both releases failed without executing any tasks, then they can be null - // otherwise, use name matching - return (prevfailedTask == null && currentFailedTask == null) - || (!util_1.isNullOrUndefined(prevfailedTask) && !util_1.isNullOrUndefined(currentFailedTask) && prevfailedTask.name.toLowerCase() == currentFailedTask.name.toLowerCase()); - } - getPrevConfig(config) { - var buildConfig = new PipelineConfiguration_1.PipelineConfiguration(PipelineType_1.PipelineType.Build, this.lastCompletedBuild.id, config.$projectId, config.$projectName, null, null, config.$usePreviousEnvironment, config.$teamUri, config.$accessKey); - return buildConfig; - } - getEnvironmentStatus() { - if (this.hasFailedTasks()) { - return "Failed"; - } - else if (this.getTasksByResultinTimeline(this.timeline, BuildInterfaces_1.TaskResult.SucceededWithIssues).length > 0) { - return "Partially Succeeded"; - } - else { - return "Succeeded"; - } - } - getPipelineViewModel(config) { - return new BuildReferenceViewModel_1.BuildReferenceViewModel(config, null, this.build); - } - getArtifactViewModels(config) { - return []; - } - hasCanceledPhases() { - return false; - } - timelineHasFailedTasks(timeLine) { - return this.getTasksByResultinTimeline(timeLine, BuildInterfaces_1.TaskResult.Failed).length > 0; - } - getTasksByResultinTimeline(timeLine, taskResult) { - return this.timeline == null || this.timeline.records == null ? [] : this.timeline.records.filter(r => r.result == taskResult); - } -} -exports.BuildReport = BuildReport; -//# sourceMappingURL=BuildReport.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js.map deleted file mode 100644 index 3811e9f5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildReport.js","sourceRoot":"","sources":["BuildReport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js deleted file mode 100644 index 615c8481..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ChangeModel = void 0; -class ChangeModel { - constructor($id, $author, $location, $timeStamp, $message) { - this.id = $id; - this.author = $author; - this.location = $location; - this.timeStamp = $timeStamp; - this.message = $message; - } - /** - * Getter $id - * @return {string} - */ - get $id() { - return this.id; - } - /** - * Getter $author - * @return {IdentityRef} - */ - get $author() { - return this.author; - } - /** - * Getter $location - * @return {string} - */ - get $location() { - return this.location; - } - /** - * Getter $timeStamp - * @return {Date} - */ - get $timeStamp() { - return this.timeStamp; - } - /** - * Getter $message - * @return {string} - */ - get $message() { - return this.message; - } -} -exports.ChangeModel = ChangeModel; -//# sourceMappingURL=ChangeModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js.map deleted file mode 100644 index 590feb10..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ChangeModel.js","sourceRoot":"","sources":["ChangeModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,WAAW;IAQtB,YAAY,GAAW,EAAE,OAAoB,EAAE,SAAiB,EAAE,UAAgB,EAAE,QAAgB;QAClG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAvDD,kCAuDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js deleted file mode 100644 index 957d866e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.IssueModel = void 0; -class IssueModel { - constructor($issueType, $message) { - this.message = $message; - this.issueType = $issueType; - } - /** - * Getter $message - * @return {string} - */ - get $message() { - return this.message; - } - /** - * Getter $issueType - * @return {string} - */ - get $issueType() { - return this.issueType; - } -} -exports.IssueModel = IssueModel; -//# sourceMappingURL=IssueModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js.map deleted file mode 100644 index e1100e93..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IssueModel.js","sourceRoot":"","sources":["IssueModel.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;IAKrB,YAAY,UAAkB,EAAE,QAAgB;QAC9C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAzBD,gCAyBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js deleted file mode 100644 index 8c8162b7..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.JobModel = void 0; -class JobModel { - constructor($jobName, $jobStatus, $issues, $tasks) { - this.tasks = $tasks; - this.jobStatus = $jobStatus; - this.issues = $issues; - this.jobName = $jobName; - } - /** - * Getter $jobName - * @return {string} - */ - get $jobName() { - return this.jobName; - } - /** - * Getter $issues - * @return {IssueModel[]} - */ - get $issues() { - return this.issues; - } - /** - * Getter $tasks - * @return {TaskModel[]} - */ - get $tasks() { - return this.tasks; - } - /** - * Getter $jobStatus - * @return {TaskStatus} - */ - get $jobStatus() { - return this.jobStatus; - } -} -exports.JobModel = JobModel; -//# sourceMappingURL=JobModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js.map deleted file mode 100644 index 600b4903..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"JobModel.js","sourceRoot":"","sources":["JobModel.ts"],"names":[],"mappings":";;;AAIA,MAAa,QAAQ;IAOnB,YAAY,QAAgB,EAAE,UAAsB,EAAE,OAAqB,EAAE,MAAmB;QAC9F,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACD,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;KAGC;IACD,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA7CD,4BA6CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js deleted file mode 100644 index 28608efa..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PhaseModel = void 0; -class PhaseModel { - constructor($name, $jobs, $status, $rank) { - this.name = $name; - this.jobs = $jobs; - this.status = $status; - this.rank = $rank; - } - /** - * Getter $name - * @return {string} - */ - get $name() { - return this.name; - } - /** - * Getter $jobs - * @return {JobModel[]} - */ - get $jobs() { - return this.jobs; - } - /** - * Getter $status - * @return {string} - */ - get $status() { - return this.status; - } - /** - * Getter $rank - * @return {number} - */ - get $rank() { - return this.rank; - } -} -exports.PhaseModel = PhaseModel; -//# sourceMappingURL=PhaseModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js.map deleted file mode 100644 index 18d51840..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PhaseModel.js","sourceRoot":"","sources":["PhaseModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAOrB,YAAY,KAAa,EAAE,KAAiB,EAAE,OAAe,EAAE,KAAa;QAC1E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AA7CD,gCA6CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js deleted file mode 100644 index 6f58a957..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js +++ /dev/null @@ -1,179 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseReport = void 0; -const Report_1 = require("./Report"); -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const PipelineConfiguration_1 = require("../config/pipeline/PipelineConfiguration"); -const ArtifactViewModel_1 = require("./viewmodel/ArtifactViewModel"); -const ReleaseViewModel_1 = require("./viewmodel/ReleaseViewModel"); -const util_1 = require("util"); -class ReleaseReport extends Report_1.Report { - constructor() { - super(...arguments); - this.artifacts = []; - } - setReleaseData($release, $environment, $lastCompletedRelease, $phases, $changes, $lastCompletedEnvironment) { - this.artifacts = $release.artifacts == null ? [] : $release.artifacts; - this.createdBy = $release.createdBy; - this.phases = $phases; - this.associatedChanges = $changes; - this.release = $release; - this.environment = $environment; - this.lastCompletedRelease = $lastCompletedRelease; - if ($lastCompletedEnvironment == null) { - if ($lastCompletedRelease != null && $lastCompletedRelease.environments != null) { - var lastEnvironments = $lastCompletedRelease.environments.filter(e => e.definitionEnvironmentId == $environment.definitionEnvironmentId); - if (lastEnvironments != null && lastEnvironments.length > 0) { - this.lastCompletedEnvironment = lastEnvironments[0]; - } - } - } - else { - this.lastCompletedEnvironment = $lastCompletedEnvironment; - } - } - /** - * Getter $artifacts - * @return {Artifact[]} - */ - get $artifacts() { - return this.artifacts; - } - /** - * Getter $release - * @return {Release} - */ - get $release() { - return this.release; - } - /** - * Getter $environment - * @return {ReleaseEnvironment} - */ - get $environment() { - return this.environment; - } - /** - * Getter $lastCompletedRelease - * @return {Release} - */ - get $lastCompletedRelease() { - return this.lastCompletedRelease; - } - /** - * Getter $lastCompletedEnvironment - * @return {ReleaseEnvironment} - */ - get $lastCompletedEnvironment() { - return this.lastCompletedEnvironment; - } - hasPrevGotSameFailures() { - const lastId = this.lastCompletedRelease == null ? "null" : this.lastCompletedRelease.id; - console.log(`Using Last Completed Release: '${lastId}'`); - if (this.lastCompletedRelease == null || this.$lastCompletedEnvironment == null) { - return false; - } - if (lastId > this.release.id) { - // We are in a situation where current build completed latter compared to the newer one - // Newer one would have already evaluated the failures and sent a mail to committers anyway - // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer - // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line - return true; - } - return null; - } - hasFailedTasks() { - const tasks = this.getReleaseTasks(this.environment); - return tasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed).length > 0; - } - hasPrevFailedTasks() { - const tasks = this.getReleaseTasks(this.lastCompletedEnvironment); - return tasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed).length > 0; - } - arePrevFailedTasksSame() { - const lastTasks = this.getReleaseTasks(this.lastCompletedEnvironment); - const lastFailedTasks = lastTasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed); - var prevfailedTask = lastFailedTasks.length > 0 ? lastFailedTasks[0] : null; - const currentTasks = this.getReleaseTasks(this.environment); - const currentFailedTasks = currentTasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed); - var currfailedTask = currentFailedTasks.length > 0 ? currentFailedTasks[0] : null; - const prevfailedTaskName = prevfailedTask == null ? "" : prevfailedTask.name; - const currfailedTaskName = currfailedTask == null ? "" : currfailedTask.name; - // if both releases failed without executing any tasks, then they can be null - // otherwise, use name matching - return (prevfailedTask == null && currfailedTask == null) || prevfailedTaskName == currfailedTaskName; - } - getPrevConfig(config) { - if (util_1.isNullOrUndefined(this.lastCompletedRelease) || util_1.isNullOrUndefined(this.lastCompletedEnvironment)) { - return null; - } - var prevConfig = new PipelineConfiguration_1.PipelineConfiguration(config.$pipelineType, this.lastCompletedRelease.id, config.$projectId, config.$projectName, this.lastCompletedEnvironment.id, this.lastCompletedEnvironment.definitionEnvironmentId, config.$usePreviousEnvironment, config.$teamUri, config.$accessKey); - return prevConfig; - } - getEnvironmentStatus() { - if (this.hasFailedTasks() || this.hasCanceledPhases()) { - return "Failed"; - } - else if (this.hasPartiallySucceededTasks(this.environment)) { - return "Partially Succeeded"; - } - else { - return "Succeeded"; - } - } - hasPartiallySucceededTasks(source) { - if (source == null) { - return false; - } - const tasks = this.getReleaseTasks(source); - return tasks.filter(t => t.status == ReleaseInterfaces_1.TaskStatus.PartiallySucceeded).length > 0; - } - hasCanceledPhases() { - if (this.phases == null) { - return false; - } - const jobs = []; - this.phases.forEach(p => { - if (p.$jobs != null) { - p.$jobs.forEach(j => { - if (j.$jobStatus == ReleaseInterfaces_1.TaskStatus.Canceled) { - jobs.push(j); - } - }); - } - }); - return jobs.length > 0; - } - getPipelineViewModel(config) { - return new ReleaseViewModel_1.ReleaseViewModel(this.environment, config); - } - getArtifactViewModels(config) { - var artifacts = []; - if (this.artifacts != null && this.artifacts.length > 0) { - this.artifacts.forEach(artifact => { - artifacts.push(new ArtifactViewModel_1.ArtifactViewModel(artifact, config)); - }); - } - return artifacts; - } - getReleaseTasks(source) { - const tasks = []; - if (source != null && source.deploySteps != null && source.deploySteps.length > 0) { - let attempt = 0; - let deploymentAttempt = source.deploySteps[0]; - for (var i = 0; i < source.deploySteps.length; i++) { - if (source.deploySteps[i].attempt > attempt) { - deploymentAttempt = source.deploySteps[i]; - } - } - deploymentAttempt.releaseDeployPhases.forEach(releaseDeployPhase => { - releaseDeployPhase.deploymentJobs.forEach(deploymentJob => { - tasks.push(...deploymentJob.tasks); - }); - }); - } - return tasks; - } -} -exports.ReleaseReport = ReleaseReport; -//# sourceMappingURL=ReleaseReport.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js.map deleted file mode 100644 index f45029cf..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseReport.js","sourceRoot":"","sources":["ReleaseReport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js deleted file mode 100644 index acded510..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js +++ /dev/null @@ -1,99 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Report = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const util_1 = require("util"); -class Report { - constructor() { - this.dataMissing = false; - this.sendMailConditionSatisfied = false; - this.associatedChanges = []; - this.phases = []; - this.failedTestOwners = []; - this.filteredResults = []; - this.hasFilteredTests = false; - this.testSummaryGroups = []; - } - /** - * Getter $dataMissing - * @return {boolean} - */ - get $dataMissing() { - return this.dataMissing; - } - /** - * Getter $associatedChanges - * @return {ChangeModel[]} - */ - get $associatedChanges() { - return this.associatedChanges; - } - /** - * Getter $associatedChanges - * @return {ChangeModel[]} - */ - get $phases() { - return this.phases; - } - /** - * Getter $sendMailConditionSatisfied - * @return {boolean} - */ - get $sendMailConditionSatisfied() { - return this.sendMailConditionSatisfied; - } - /** - * Setter $dataMissing - * @param {boolean} value - */ - set $dataMissing(value) { - this.dataMissing = value; - } - /** - * Setter $sendMailConditionSatisfied - * @param {boolean} value - */ - set $sendMailConditionSatisfied(value) { - this.sendMailConditionSatisfied = value; - } - /** - * Getter $testSummaryGroups - * @return {TestSummaryGroupModel[]} - */ - get $testSummaryGroups() { - return this.testSummaryGroups; - } - /** - * Getter $failedTestOwners - * @return {IdentityRef[] } - */ - get $failedTestOwners() { - return this.failedTestOwners; - } - hasFailedTests(includeOthersInTotal) { - if (util_1.isNullOrUndefined(this.testResultSummary)) { - return false; - } - if (!includeOthersInTotal) { - return this.getTestCountForOutcome(TestInterfaces_1.TestOutcome.Failed) > 0; - } - // Others need to be included - Calculate failed as (total - passed) - const passedCount = this.getTestCountForOutcome(TestInterfaces_1.TestOutcome.Passed); - if (passedCount > 0) { - return (this.testResultSummary.aggregatedResultsAnalysis.totalTests - passedCount) > 0; - } - // If no passed tests, then anything ran should be considered as failed since "other" outcomes need to be considered as failures - // if no tests ran, then we don't have failed tests - return this.testResultSummary.aggregatedResultsAnalysis.totalTests > 0; - } - getTestCountForOutcome(outcome) { - const resultsByOutcome = this.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome; - let testsForOutcome = 0; - if (!util_1.isNullOrUndefined(resultsByOutcome) && !util_1.isNullOrUndefined(resultsByOutcome[outcome])) { - testsForOutcome += resultsByOutcome[outcome].count; - } - return testsForOutcome; - } -} -exports.Report = Report; -//# sourceMappingURL=Report.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js.map deleted file mode 100644 index 7d2f9b8c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Report.js","sourceRoot":"","sources":["Report.ts"],"names":[],"mappings":";;;AAIA,oFAA6H;AAG7H,+BAAyC;AAKzC,MAAsB,MAAM;IAA5B;QACU,gBAAW,GAAY,KAAK,CAAC;QAE7B,+BAA0B,GAAY,KAAK,CAAC;QAI1C,sBAAiB,GAAkB,EAAE,CAAC;QAEtC,WAAM,GAAiB,EAAE,CAAC;QAE5B,qBAAgB,GAAkB,EAAE,CAAC;QAEtC,oBAAe,GAA4B,EAAE,CAAC;QAE9C,qBAAgB,GAAY,KAAK,CAAC;QAEjC,sBAAiB,GAA4B,EAAE,CAAC;IAqH1D,CAAC;IAjHC;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;IAGA;IACA,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B;QACpC,OAAO,IAAI,CAAC,0BAA0B,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B,CAAC,KAAc;QACnD,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAGD;;;OAGG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAkBM,cAAc,CAAC,oBAA6B;QACjD,IAAI,wBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;YAC7C,OAAO,KAAK,CAAC;SACd;QAED,IAAI,CAAC,oBAAoB,EAAE;YACzB,OAAO,IAAI,CAAC,sBAAsB,CAAC,4BAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC5D;QAED,oEAAoE;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,WAAW,GAAG,CAAC,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;SACxF;QAED,gIAAgI;QAChI,oDAAoD;QACpD,OAAO,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,UAAU,GAAG,CAAC,CAAC;IACzE,CAAC;IAEO,sBAAsB,CAAC,OAAoB;QACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;QAEzF,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE;YACzF,eAAe,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;SACpD;QAED,OAAO,eAAe,CAAC;IAC3B,CAAC;CAGF;AAtID,wBAsIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js deleted file mode 100644 index 1d372832..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportFactory = void 0; -const ReleaseReport_1 = require("./ReleaseReport"); -const PipelineType_1 = require("../config/pipeline/PipelineType"); -const BuildReport_1 = require("./BuildReport"); -class ReportFactory { - static createNewReport(pipelineConfig) { - return (pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build) ? new BuildReport_1.BuildReport() : new ReleaseReport_1.ReleaseReport(); - } - static mergeReports(reports) { - if (reports == null || reports.length == 0) - return null; - if (reports.length == 1) - return reports[0]; - let finalReport = reports[0]; - for (var i = 1; i < reports.length; i++) { - finalReport = ReportFactory.mergeTwoReports(finalReport, reports[i]); - } - return finalReport; - } - static mergeTwoReports(source, target) { - let associatedChanges = []; - let phases = []; - if (target.$testSummaryGroups != null) { - source.$testSummaryGroups.push(...target.$testSummaryGroups); - } - if (target.$associatedChanges != null) { - associatedChanges = target.$associatedChanges; - } - if (target.$failedTestOwners != null) { - source.$failedTestOwners.push(...target.$failedTestOwners); - } - if (target.filteredResults != null) { - source.filteredResults = target.filteredResults; - } - if (target.hasFilteredTests) { - source.hasFilteredTests = target.hasFilteredTests; - } - if (target.testResultSummary != null) { - source.testResultSummary = target.testResultSummary; - } - if (target.$phases != null) { - phases = target.$phases; - } - if (source instanceof ReleaseReport_1.ReleaseReport) { - var releaseTarget = target; - var releaseSource = source; - let targetRelease = null; - let targetEnv = null; - let targetLastRelease = null; - let targetLastEnv = null; - if (releaseTarget.$release != null) { - targetRelease = releaseTarget.$release; - } - if (releaseTarget.$environment != null) { - targetEnv = releaseTarget.$environment; - } - if (releaseTarget.$lastCompletedEnvironment != null) { - targetLastRelease = releaseTarget.$lastCompletedRelease; - } - if (releaseTarget.$lastCompletedEnvironment != null) { - targetLastEnv = releaseTarget.$lastCompletedEnvironment; - } - if (targetRelease != null) { - releaseSource.setReleaseData(targetRelease, targetEnv, targetLastRelease, phases, associatedChanges, targetLastEnv); - } - } - return source; - } -} -exports.ReportFactory = ReportFactory; -//# sourceMappingURL=ReportFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js.map deleted file mode 100644 index 46ca8c40..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportFactory.js","sourceRoot":"","sources":["ReportFactory.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js deleted file mode 100644 index 0e7a9d5c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskModel = void 0; -class TaskModel { - constructor($name, $status, $issues, $agentName, $finishTime, $startTime) { - this.name = $name; - this.status = $status; - this.issues = $issues; - this.agentName = $agentName; - this.finishTime = $finishTime; - this.startTime = $startTime; - } - /** - * Getter $name - * @return {string} - */ - get $name() { - return this.name; - } - /** - * Getter $status - * @return {TaskStatus} - */ - get $status() { - return this.status; - } - /** - * Getter $issues - * @return {IssueModel[]} - */ - get $issues() { - return this.issues; - } - /** - * Getter $agentName - * @return {string} - */ - get $agentName() { - return this.agentName; - } - /** - * Getter $finishTime - * @return {Date} - */ - get $finishTime() { - return this.finishTime; - } - /** - * Getter $startTime - * @return {Date} - */ - get $startTime() { - return this.startTime; - } -} -exports.TaskModel = TaskModel; -//# sourceMappingURL=TaskModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js.map deleted file mode 100644 index de1c9842..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskModel.js","sourceRoot":"","sources":["TaskModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,SAAS;IASpB,YAAY,KAAa,EAAE,OAAmB,EAAE,OAAqB,EAAE,UAAkB,EAAE,WAAiB,EAAE,UAAgB;QAC5H,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAjED,8BAiEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js deleted file mode 100644 index df8c399f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js +++ /dev/null @@ -1,125 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LinkHelper = void 0; -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -class LinkHelper { - static getBuildDefinitionLinkById(definitionId, config) { - var collectionUri = config.$teamUri; - var parameters = new Map(); - parameters.set("definitionId", definitionId.toString()); - parameters.set("_a", "summary"); - var uri = this.getBuildLink(config, collectionUri, parameters); - return uri; - } - static getBuildLink(config, collectionUri, parameters) { - return collectionUri + "/" + this.getBuildRelativeUrl(config.$projectName) + "/results" + this.getQueryParameter(parameters); - } - static getCommitLink(changeId, changeUri, config) { - var collectionUri = config.$teamUri; - let repoId = null; - var pos = changeUri.indexOf("repositories"); - if (pos > 0) { - repoId = changeUri.substr(pos).split("/")[1]; - } - var uri = collectionUri + `/${config.$projectName}/_git/${repoId}/commit/${changeId})`; - return uri; - } - static getCreateBugLinkForTest(config, testResult) { - const testRunId = testResult.testRun == null ? null : testResult.testRun.id; - const parameters = new Map(); - parameters.set("create-bug", "true"); - return LinkHelper.getTestResultLink(config, testRunId, testResult.id, parameters); - } - static getQueryParameter(parameterValues) { - var queryString = ""; - parameterValues.forEach((value, key) => { - queryString = (queryString == "") - ? "?" + key + "=" + value - : queryString + "&" + key + "=" + value; - }); - return queryString; - } - static getReleaseDefinitionLink(config, releaseDefinitionId) { - var collectionUri = config.$teamUri; - const parameters = new Map(); - parameters.set("definitionId", releaseDefinitionId.toString()); - parameters.set("_a", "environments-editor"); - return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseDefView + "/" + LinkHelper.getQueryParameter(parameters); - } - static getReleaseLogsTabLink(config) { - var collectionUri = config.$teamUri; - const queryParams = new Map(); - queryParams.set("releaseId", config.$pipelineId.toString()); - queryParams.set("_a", LinkHelper.ReleaseEnvironmentLogsExtension); - queryParams.set("environmentId", config.$environmentId.toString()); - return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); - } - static getReleaseSummaryLink(config) { - var collectionUri = config.$teamUri; - const queryParams = new Map(); - queryParams.set("releaseId", config.$pipelineId.toString()); - return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); - } - static getTestResultLink(config, runId, resultId, queryParams) { - var collectionUri = config.$teamUri; - const parameters = new Map(); - parameters.set("runId", runId); - parameters.set("_a", "resultSummary"); - parameters.set("resultId", resultId.toString()); - if (queryParams != null) { - queryParams.forEach((value, key) => { - 6; - parameters.set(key, value); - }); - } - return collectionUri + "\\" + LinkHelper.getTcmRelativeUrl(config.$projectName) + "\\" + LinkHelper.getQueryParameter(parameters); - } - static getTestTabLinkInRelease(config) { - var collectionUri = config.$teamUri; - const queryParams = new Map(); - queryParams.set("releaseId", config.$pipelineId.toString()); - queryParams.set("_a", LinkHelper.ReleaseEnvironmentExtension); - queryParams.set("environmentId", config.$environmentId.toString()); - queryParams.set("extensionId", LinkHelper.ReleaseLinkTestExtensionId); - return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); - } - static getWorkItemLink(config, workItemId) { - const queryParams = new Map(); - queryParams.set("id", workItemId.toString()); - return config.$teamUri + "/" + LinkHelper.getWorkItemRelativeUrl(config.$projectName) + "/" + LinkHelper.getQueryParameter(queryParams); - } - static getBuildRelativeUrl(projectName) { - return projectName + "/" + LinkHelper.BuildPipelineExtension; - } - static getTestTabLinkInBuild(config) { - var collectionUri = config.$teamUri; - var parameters = new Map([ - ["buildId", config.$pipelineId.toString()], - ["view", "ms.vss-test-web.build-test-results-tab"] - ]); - var uri = this.getBuildLink(config, collectionUri, parameters); - return uri; - } - static getTcmRelativeUrl(projectName) { - return projectName + "/" + LinkHelper.TcmPipelineExtension; - } - static getWorkItemRelativeUrl(projectName) { - return projectName + "/" + LinkHelper.WorkItemPipelineExtension; - } - static getTestTabLink(pipelineConfiguration) { - return pipelineConfiguration.$pipelineType == PipelineType_1.PipelineType.Release ? - this.getTestTabLinkInRelease(pipelineConfiguration) : - this.getTestTabLinkInBuild(pipelineConfiguration); - } -} -exports.LinkHelper = LinkHelper; -LinkHelper.TcmPipelineExtension = "_TestManagement/Runs"; -// Release related strings -LinkHelper.ReleaseProgressView = "_releaseProgress"; -LinkHelper.ReleaseDefView = "_releaseDefinition"; -LinkHelper.ReleaseEnvironmentExtension = "release-environment-extension"; -LinkHelper.ReleaseEnvironmentLogsExtension = "release-environment-logs"; -LinkHelper.ReleaseLinkTestExtensionId = "ms.vss-test-web.test-result-in-release-environment-editor-tab"; -LinkHelper.WorkItemPipelineExtension = "_workitems"; -LinkHelper.BuildPipelineExtension = "_build"; -//# sourceMappingURL=LinkHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js.map deleted file mode 100644 index bec637f7..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"LinkHelper.js","sourceRoot":"","sources":["LinkHelper.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js deleted file mode 100644 index ffb3f0a9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsHelper = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TestOutcomeForPriority_1 = require("../testresults/TestOutcomeForPriority"); -class TestResultsHelper { - static getTestOutcomePercentage(testCountForOutcome, totalTests) { - if (totalTests == 0) { - console.log("Total Test count is 0. Setting outcome percentage to 0"); - } - let testOutcomePercentage = totalTests == 0 ? - 0 : - testCountForOutcome / totalTests * 100; - return TestResultsHelper.getCustomizedDecimalValue(testOutcomePercentage); - } - static getCustomizedDecimalValue(value) { - var fixedValue = Math.pow(10, TestResultsHelper.PercentagePrecision); - return ((Math.floor(value * fixedValue)) / fixedValue); - } - static getTestOutcomePercentageString(testCountForOutcome, totalTests) { - return this.getTestOutcomePercentage(testCountForOutcome, totalTests) + "%"; - } - static getTotalTestCountBasedOnUserConfiguration(testCountsByOutcome, includeOthersInTotal) { - var totalTests = 0; - testCountsByOutcome.forEach((testCount, testOutcome) => { - var isPassedTest = testOutcome == TestInterfaces_1.TestOutcome.Passed; - var isFailedTest = testOutcome == TestInterfaces_1.TestOutcome.Failed; - if (isPassedTest || isFailedTest || includeOthersInTotal) { - totalTests += testCount; - } - }); - return totalTests; - } - static getTotalTestCountBasedOnUserConfigurationPriority(testCountsByOutcome, includeOthersInTotal) { - var totalTests = 0; - testCountsByOutcome.forEach((testCount, testOutcome) => { - var isPassedTest = testOutcome == TestOutcomeForPriority_1.TestOutcomeForPriority.Passed; - var isFailedTest = testOutcome == TestOutcomeForPriority_1.TestOutcomeForPriority.Failed; - if (isPassedTest || isFailedTest || includeOthersInTotal) { - totalTests += testCount; - } - }); - return totalTests; - } -} -exports.TestResultsHelper = TestResultsHelper; -TestResultsHelper.PercentagePrecision = 2; -//# sourceMappingURL=TestResultsHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js.map deleted file mode 100644 index f0422c22..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultsHelper.js","sourceRoot":"","sources":["TestResultsHelper.ts"],"names":[],"mappings":";;;AAAA,oFAA8E;AAC9E,kFAA+E;AAE/E,MAAa,iBAAiB;IAGrB,MAAM,CAAC,wBAAwB,CAAC,mBAA2B,EAAE,UAAkB;QACpF,IAAI,UAAU,IAAI,CAAC,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;SACvE;QAED,IAAI,qBAAqB,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,mBAAmB,GAAG,UAAU,GAAG,GAAG,CAAC;QAEzC,OAAO,iBAAiB,CAAC,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAEO,MAAM,CAAC,yBAAyB,CAAC,KAAa;QACpD,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;IACzD,CAAC;IAEM,MAAM,CAAC,8BAA8B,CAAC,mBAA2B,EAAE,UAAkB;QAC1F,OAAO,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC;IAC9E,CAAC;IAEM,MAAM,CAAC,yCAAyC,CACrD,mBAA6C,EAC7C,oBAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,WAAwB,EAAE,EAAE;YAC1E,IAAI,YAAY,GAAG,WAAW,IAAI,4BAAW,CAAC,MAAM,CAAC;YACrD,IAAI,YAAY,GAAG,WAAW,IAAI,4BAAW,CAAC,MAAM,CAAC;YAErD,IAAI,YAAY,IAAI,YAAY,IAAI,oBAAoB,EAAE;gBACxD,UAAU,IAAI,SAAS,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,MAAM,CAAC,iDAAiD,CAC7D,mBAAwD,EACxD,oBAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,WAAmC,EAAE,EAAE;YACrF,IAAI,YAAY,GAAG,WAAW,IAAI,+CAAsB,CAAC,MAAM,CAAC;YAChE,IAAI,YAAY,GAAG,WAAW,IAAI,+CAAsB,CAAC,MAAM,CAAC;YAEhE,IAAI,YAAY,IAAI,YAAY,IAAI,oBAAoB,EAAE;gBACxD,UAAU,IAAI,SAAS,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;;AAxDH,8CAyDC;AAxDwB,qCAAmB,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js deleted file mode 100644 index d7b813fc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js +++ /dev/null @@ -1,79 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TimeFormatter = void 0; -const util_1 = require("util"); -class TimeFormatter { - static ConvertTimeStringToMilliSeconds(duration) { - const timeSpanArray = duration.split("."); - let durationNum = 0; - let hmsIndex = 0; - if (timeSpanArray.length > 3) { - console.warn("cannot format time duration"); - return 0; - } - else if (timeSpanArray.length == 3) { - // Eg: 1.03:04:05.567 = 1 day, 3 hours, 4 min, 5 seconds and 567 ms. - // Days to ms - durationNum += Number(timeSpanArray[0]) * 24 * 3600; - hmsIndex = 1; - } - let timeStrArray = timeSpanArray[hmsIndex].split(":"); - if (timeStrArray.length != 3) { - console.warn("cannot format time duration properly. test run duration will not be accurate"); - } - else { - durationNum += Number(timeStrArray[2]); // secs - durationNum += Number(timeStrArray[1]) * 60; // mins to secs - durationNum += Number(timeStrArray[0]) * 3600; // hours to secs - } - return durationNum * 1000; - } - static FormatDuration(timeInMilliseconds) { - let timeStr = ""; - // 1- Convert to seconds: - var seconds = timeInMilliseconds / 1000; - // 2- Extract hours: - var hours = Math.round(seconds / 3600); // 3,600 seconds in 1 hour - seconds = seconds % 3600; // seconds remaining after extracting hours - // 3- Extract minutes: - var minutes = Math.round(seconds / 60); // 60 seconds in 1 minute - // 4- Keep only seconds not extracted to minutes: - seconds = seconds % 60; - seconds = Math.round(seconds); - if (minutes == 60) { - hours += 1; - minutes = 0; - } - return this.getCombinedTimeString(hours, minutes, seconds); - } - static FormatDurationStr(timeStr) { - let resultStr = ""; - if (!util_1.isNullOrUndefined(timeStr)) { - // strip off milliseconds if any, and then split into hh:mm:ss - const timeStrArray = timeStr.split(".")[0].split(":"); - if (timeStrArray.length != 3) { - // not supported - return timeStr; - } - // 1- Convert to seconds: - var seconds = Math.round(Number.parseInt(timeStrArray[2])); - var minutes = Math.round(Number.parseInt(timeStrArray[1])); - var hours = Math.round(Number.parseInt(timeStrArray[0])); - resultStr = this.getCombinedTimeString(hours, minutes, seconds); - } - return resultStr; - } - static getCombinedTimeString(hours, minutes, seconds) { - let timeStr = ""; - timeStr += this.getTimeUnitString(hours, "h"); - timeStr += this.getTimeUnitString(minutes, "m"); - timeStr += this.getTimeUnitString(seconds, "s"); - timeStr = timeStr.trim(); - return (timeStr == "" ? "0s" : timeStr); - } - static getTimeUnitString(timeUnit, suffix) { - return timeUnit < 1 ? "" : timeUnit + suffix + " "; - } -} -exports.TimeFormatter = TimeFormatter; -//# sourceMappingURL=TimeFormatter.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js.map deleted file mode 100644 index f96973ac..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TimeFormatter.js","sourceRoot":"","sources":["TimeFormatter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js deleted file mode 100644 index 5677cc8c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestOutcomeForPriority = void 0; -var TestOutcomeForPriority; -(function (TestOutcomeForPriority) { - TestOutcomeForPriority[TestOutcomeForPriority["Failed"] = 0] = "Failed"; - TestOutcomeForPriority[TestOutcomeForPriority["Inconclusive"] = 1] = "Inconclusive"; - TestOutcomeForPriority[TestOutcomeForPriority["NotExecuted"] = 2] = "NotExecuted"; - TestOutcomeForPriority[TestOutcomeForPriority["Passed"] = 3] = "Passed"; - TestOutcomeForPriority[TestOutcomeForPriority["Other"] = 4] = "Other"; -})(TestOutcomeForPriority = exports.TestOutcomeForPriority || (exports.TestOutcomeForPriority = {})); -//# sourceMappingURL=TestOutcomeForPriority.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js.map deleted file mode 100644 index d6f1e5c2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestOutcomeForPriority.js","sourceRoot":"","sources":["TestOutcomeForPriority.ts"],"names":[],"mappings":";;;AAAA,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,uEAAM,CAAA;IACN,mFAAY,CAAA;IACZ,iFAAW,CAAA;IACX,uEAAM,CAAA;IACN,qEAAK,CAAA;AACP,CAAC,EANW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAMjC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js deleted file mode 100644 index 9625859d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsGroupModel = void 0; -class TestResultsGroupModel { - constructor() { - this.testResults = new Map(); - } -} -exports.TestResultsGroupModel = TestResultsGroupModel; -//# sourceMappingURL=TestResultGroupModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js.map deleted file mode 100644 index f04389a5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultGroupModel.js","sourceRoot":"","sources":["TestResultGroupModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAAlC;QAGS,gBAAW,GAAwC,IAAI,GAAG,EAAkC,CAAC;IACtG,CAAC;CAAA;AAJD,sDAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js deleted file mode 100644 index 4062bcef..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultModel = void 0; -class TestResultModel { - constructor() { - this.associatedBugRefs = []; - this.associatedBugs = []; - } -} -exports.TestResultModel = TestResultModel; -//# sourceMappingURL=TestResultModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js.map deleted file mode 100644 index 2131536d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultModel.js","sourceRoot":"","sources":["TestResultModel.ts"],"names":[],"mappings":";;;AAIA,MAAa,eAAe;IAA5B;QAES,sBAAiB,GAAwB,EAAE,CAAC;QAC5C,mBAAc,GAAe,EAAE,CAAC;IACzC,CAAC;CAAA;AAJD,0CAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js deleted file mode 100644 index 957749b7..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryGroupModel = void 0; -class TestSummaryGroupModel { - constructor() { - this.runs = []; - } -} -exports.TestSummaryGroupModel = TestSummaryGroupModel; -//# sourceMappingURL=TestSummaryGroupModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js.map deleted file mode 100644 index 4b893cd0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryGroupModel.js","sourceRoot":"","sources":["TestSummaryGroupModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAAlC;QAIS,SAAI,GAA2B,EAAE,CAAC;IAC3C,CAAC;CAAA;AALD,sDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js deleted file mode 100644 index 6fc6b60f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js +++ /dev/null @@ -1,91 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryItemModel = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -class TestSummaryItemModel { - constructor($name, $id) { - this.name = $name; - this.id = $id; - this.testCountByOutcome = new Map(); - this.testCountForOutcomeByPriority = new Map(); - } - /** - * Getter $name - * @return {string} - */ - get $name() { - return this.name; - } - /** - * Getter $id - * @return {string} - */ - get $id() { - return this.id; - } - /** - * Getter $totalTestCount - * @return {number} - */ - get $totalTestCount() { - return this.totalTestCount; - } - /** - * Getter $testCountByOutcome - * @return {Map} - */ - get $testCountByOutcome() { - return this.testCountByOutcome; - } - /** - * Getter $testCountForOutcomeByPriority - * @return {Map} - */ - get $testCountForOutcomeByPriority() { - return this.testCountForOutcomeByPriority; - } - /** - * Getter $duration - * @return {any} - */ - get $duration() { - return this.duration; - } - /** - * Setter $totalTestCount - * @param {number} value - */ - set $totalTestCount(value) { - this.totalTestCount = value; - } - /** - * Setter $duration - * @param {any} value - */ - set $duration(value) { - this.duration = value; - } - getFailedTestsCount() { - return this.getTestOutcomeCount(TestInterfaces_1.TestOutcome.Failed); - } - getOtherTestsCount() { - let totalCount = 0; - this.testCountByOutcome.forEach((value, key) => { - if (key != TestInterfaces_1.TestOutcome.Passed && key != TestInterfaces_1.TestOutcome.Failed) { - totalCount += value; - } - }); - return totalCount; - } - getPassedTestsCount() { - return this.getTestOutcomeCount(TestInterfaces_1.TestOutcome.Passed); - } - getTestOutcomeCount(testOutcome) { - if (this.testCountByOutcome.has(testOutcome)) { - return this.testCountByOutcome.get(testOutcome); - } - return 0; - } -} -exports.TestSummaryItemModel = TestSummaryItemModel; -//# sourceMappingURL=TestSummaryItemModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js.map deleted file mode 100644 index a7c29bfd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryItemModel.js","sourceRoot":"","sources":["TestSummaryItemModel.ts"],"names":[],"mappings":";;;AACA,oFAA8E;AAE9E,MAAa,oBAAoB;IAQ/B,YAAY,KAAa,EAAE,GAAW;QACpC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;QACzD,IAAI,CAAC,6BAA6B,GAAG,IAAI,GAAG,EAA+C,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,8BAA8B;QACvC,OAAO,IAAI,CAAC,6BAA6B,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAGD;;;OAGG;IACH,IAAW,eAAe,CAAC,KAAa;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS,CAAC,KAAa;QAChC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEM,kBAAkB;QACvB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,GAAgB,EAAE,EAAE;YAClE,IAAI,GAAG,IAAI,4BAAW,CAAC,MAAM,IAAI,GAAG,IAAI,4BAAW,CAAC,MAAM,EAAE;gBAC1D,UAAU,IAAI,KAAK,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEO,mBAAmB,CAAC,WAAwB;QAClD,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;SACjD;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAxGD,oDAwGC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js deleted file mode 100644 index 999dcd2a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ArtifactViewModel = exports.ArtifactViewModelWrapper = void 0; -const util_1 = require("util"); -class ArtifactViewModelWrapper { -} -exports.ArtifactViewModelWrapper = ArtifactViewModelWrapper; -class ArtifactViewModel { - constructor(artifact, config) { - this.Version = this.getArtifactInfo(artifact, "version"); - this.BranchName = this.getArtifactInfo(artifact, "branch"); - this.Name = artifact.alias; - this.IsPrimary = artifact.isPrimary; - if (!util_1.isNullOrUndefined(artifact.definitionReference)) { - if (!util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl) && - !util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl.id)) { - this.ArtifactDefinitionUrl = artifact.definitionReference.artifactSourceDefinitionUrl.id; - } - if (!util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl) && - !util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl.id)) { - this.BuildSummaryUrl = artifact.definitionReference.artifactSourceVersionUrl.id; - } - } - } - getArtifactInfo(artifact, key) { - const sourceRef = artifact.definitionReference[key]; - return util_1.isNullOrUndefined(sourceRef) ? null : sourceRef.name; - } -} -exports.ArtifactViewModel = ArtifactViewModel; -//# sourceMappingURL=ArtifactViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js.map deleted file mode 100644 index d26a37f4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ArtifactViewModel.js","sourceRoot":"","sources":["ArtifactViewModel.ts"],"names":[],"mappings":";;;AAEA,+BAAyC;AAGzC,MAAa,wBAAwB;CAEpC;AAFD,4DAEC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,QAAkB,EAAE,MAA6B;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;YACpD,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC;gBAC9E,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,CAAC,EAAE;gBACjF,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,CAAC;aAC1F;YAED,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC;gBAC3E,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE;gBAC9E,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,CAAC;aACjF;SACF;IACH,CAAC;IAEO,eAAe,CAAC,QAAkB,EAAE,GAAW;QACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,wBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IAC9D,CAAC;CACF;AA/BD,8CA+BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js deleted file mode 100644 index 68ee5557..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildReferenceViewModel = void 0; -const LinkHelper_1 = require("../helpers/LinkHelper"); -const util_1 = require("util"); -class BuildReferenceViewModel { - constructor(config, buildReference, build) { - if (buildReference != null) { - this.Id = buildReference.id.toString(); - this.Number = buildReference.buildNumber; - if (!util_1.isNullOrUndefined(buildReference._links) && !util_1.isNullOrUndefined(buildReference._links.web) && !util_1.isNullOrUndefined(buildReference._links.web.href)) { - this.Url = buildReference._links.web.href; - } - } - else if (build != null) { - this.Id = build.id.toString(); - this.Number = build.buildNumber; - this.Branch = build.sourceBranch; - if (!util_1.isNullOrUndefined(build._links) && !util_1.isNullOrUndefined(build._links.web) && !util_1.isNullOrUndefined(build._links.web.href)) { - this.Url = build._links.web.href; - } - this.DefinitionUrl = LinkHelper_1.LinkHelper.getBuildDefinitionLinkById(build.definition.id, config); - this.DefinitionName = build.definition.name; - } - } -} -exports.BuildReferenceViewModel = BuildReferenceViewModel; -//# sourceMappingURL=BuildReferenceViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js.map deleted file mode 100644 index 88ab2f9d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildReferenceViewModel.js","sourceRoot":"","sources":["BuildReferenceViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,+BAAyC;AAEzC,MAAa,uBAAuB;IAQlC,YAAY,MAA6B,EAAE,cAA8B,EAAE,KAAY;QACrF,IAAG,cAAc,IAAI,IAAI,EAAE;YACzB,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC;YACzC,IAAG,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnJ,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAC3C;SACF;aAAM,IAAI,KAAK,IAAI,IAAI,EAAE;YACxB,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YACjC,IAAG,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACxH,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAClC;YACD,IAAI,CAAC,aAAa,GAAG,uBAAU,CAAC,0BAA0B,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACxF,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;SAC7C;IACH,CAAC;CACF;AA1BD,0DA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js deleted file mode 100644 index e3e7c956..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ChangeViewModel = exports.ChangeViewModelWrapper = void 0; -const StringUtils_1 = require("../../utils/StringUtils"); -const LinkHelper_1 = require("../helpers/LinkHelper"); -class ChangeViewModelWrapper { -} -exports.ChangeViewModelWrapper = ChangeViewModelWrapper; -class ChangeViewModel { - constructor(change, config) { - this.ConstHashLength = 8; - this.Id = change.$id; - this.ShortId = isNaN(Number.parseInt(this.Id)) ? this.Id : this.Id.substring(0, this.ConstHashLength); - this.Message = StringUtils_1.StringUtils.CompressNewLines(change.$message); - this.AuthorName = change.$author == null ? null : change.$author.displayName; - this.TimeStamp = change.$timeStamp.toDateString(); - this.Url = LinkHelper_1.LinkHelper.getCommitLink(change.$id, change.$location, config); - } -} -exports.ChangeViewModel = ChangeViewModel; -//# sourceMappingURL=ChangeViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js.map deleted file mode 100644 index f4fc902c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ChangeViewModel.js","sourceRoot":"","sources":["ChangeViewModel.ts"],"names":[],"mappings":";;;AAEA,yDAAsD;AACtD,sDAAmD;AAEnD,MAAa,sBAAsB;CAElC;AAFD,wDAEC;AAED,MAAa,eAAe;IAS1B,YAAY,MAAmB,EAAE,MAA6B;QAR9C,oBAAe,GAAG,CAAC,CAAC;QASlC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACtG,IAAI,CAAC,OAAO,GAAG,yBAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7E,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAElD,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;CACF;AAlBD,0CAkBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js deleted file mode 100644 index b723545f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DeploymentJobViewModel = void 0; -const TaskResultViewModel_1 = require("./TaskResultViewModel"); -class DeploymentJobViewModel { - constructor(jobs) { - this.Tasks = new TaskResultViewModel_1.TaskResultViewModelWrapper(); - this.Tasks.TaskResultViewModel = []; - if (jobs.length > 0) { - let taskIndex = 0; - let releaseTasks = []; - do { - releaseTasks = []; - jobs.forEach(job => { - // Not all jobs have same set of tasks - if (taskIndex < job.$tasks.length) { - releaseTasks.push(job.$tasks[taskIndex]); - this.MinTaskStartTime = this.getMinTime(this.MinTaskStartTime, job.$tasks[taskIndex].$startTime); - this.MaxTaskFinishTime = this.getMaxTime(this.MaxTaskFinishTime, job.$tasks[taskIndex].$finishTime); - } - }); - if (releaseTasks != null && releaseTasks.length > 0) { - this.Tasks.TaskResultViewModel.push(new TaskResultViewModel_1.TaskResultViewModel(releaseTasks)); - } - taskIndex++; - } while (releaseTasks.length > 0); - } - } - getMinTime(time1, time2) { - if (time1 == null) { - return time2; - } - else if (time2 != null && time2 < time1) { - return time2; - } - return time1; - } - getMaxTime(time1, time2) { - if (time1 == null) { - return time2; - } - else if (time2 != null && time2 > time1) { - return time2; - } - return time1; - } -} -exports.DeploymentJobViewModel = DeploymentJobViewModel; -//# sourceMappingURL=DeploymentJobViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js.map deleted file mode 100644 index bece72f8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DeploymentJobViewModel.js","sourceRoot":"","sources":["DeploymentJobViewModel.ts"],"names":[],"mappings":";;;AAEA,+DAAwF;AAExF,MAAa,sBAAsB;IAKjC,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,gDAA0B,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,YAAY,GAAgB,EAAE,CAAC;YACnC,GAAG;gBACD,YAAY,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBACjB,sCAAsC;oBACtC,IAAI,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;wBACjC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;wBACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC;wBACjG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;qBACrG;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;iBAC5E;gBAED,SAAS,EAAE,CAAC;aAEb,QAAQ,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;SACnC;IACH,CAAC;IAEO,UAAU,CAAC,KAAW,EAAE,KAAW;QACzC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;aACI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,KAAW,EAAE,KAAW;QACzC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;aACI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAtDD,wDAsDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js deleted file mode 100644 index 88dac581..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js +++ /dev/null @@ -1,132 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EmailReportViewModel = void 0; -const util_1 = require("util"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const LinkHelper_1 = require("../helpers/LinkHelper"); -const PhaseViewModel_1 = require("./PhaseViewModel"); -const PhaseIssuesViewModel_1 = require("./PhaseIssuesViewModel"); -const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); -const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); -const ArtifactViewModel_1 = require("./ArtifactViewModel"); -const ChangeViewModel_1 = require("./ChangeViewModel"); -const TestSummaryGroupViewModel_1 = require("./TestSummaryGroupViewModel"); -const TestResultsGroupViewModel_1 = require("./TestResultsGroupViewModel"); -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -class EmailReportViewModel { - constructor(report, reportConfiguration) { - this.ProjectName = reportConfiguration.$pipelineConfiguration.$projectName; - this.HasTaskFailures = report.hasFailedTasks(); - if (reportConfiguration.$pipelineConfiguration.$pipelineType == PipelineType_1.PipelineType.Build) { - this.Build = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration); - } - else { - this.Release = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration); - } - this.Artifacts = new ArtifactViewModel_1.ArtifactViewModelWrapper(); - this.Artifacts.ArtifactViewModel = report.getArtifactViewModels(reportConfiguration.$pipelineConfiguration); - this.HasCanceledPhases = report.hasCanceledPhases(); - this.InitializePhases(report); - this.SetMailSubject(report, reportConfiguration); - this.HasFailedTests = report.hasFailedTests(reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); - if (report.testResultSummary != null) { - this.AllTests = new TestResultSummaryViewModel_1.TestResultSummaryViewModel(null, report.testResultSummary, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); - } - this.InitializeSummaryGroupViewModel(report, reportConfiguration); - this.ShowAssociatedChanges = reportConfiguration.$reportDataConfiguration.$includeCommits; - if (this.ShowAssociatedChanges) { - this.InitializeAssociatedChanges(report, reportConfiguration.$pipelineConfiguration); - } - this.InitializeTestResultGroups(report, reportConfiguration); - this.TestTabLink = LinkHelper_1.LinkHelper.getTestTabLink(reportConfiguration.$pipelineConfiguration); - this.DataMissing = report.$dataMissing; - } - InitializePhases(report) { - const phases = []; - if (util_1.isNullOrUndefined(report.$phases) || report.$phases.length < 1) { - return; - } - report.$phases.forEach(phase => { - phases.push(new PhaseViewModel_1.PhaseViewModel(phase)); - }); - this.Phases = new PhaseViewModel_1.PhaseViewModelWrapper(); - this.Phases.PhaseViewModel = phases; - if (this.HasCanceledPhases) { - this.PhaseIssuesSummary = new PhaseIssuesViewModel_1.PhaseIssuesViewModel(report.$phases); - } - } - SetMailSubject(report, reportConfig) { - var subject = reportConfig.$mailConfiguration.$mailSubject; - if (subject.includes("{passPercentage}")) { - var passPercentage = this.GetPassPercentage(report, reportConfig.$reportDataConfiguration.$includeOthersInTotal); - subject = subject.replace("{passPercentage}", passPercentage); - } - if (subject.includes("{environmentStatus}")) { - subject = subject.replace("{environmentStatus}", report.getEnvironmentStatus()); - } - reportConfig.$mailConfiguration.$mailSubject = subject; - } - InitializeAssociatedChanges(report, pipelineConfig) { - if (!util_1.isNullOrUndefined(report.$associatedChanges) && report.$associatedChanges.length > 0) { - this.AssociatedChanges = new ChangeViewModel_1.ChangeViewModelWrapper(); - this.AssociatedChanges.ChangeViewModel = []; - report.$associatedChanges.forEach(associatedChange => { - this.AssociatedChanges.ChangeViewModel.push(new ChangeViewModel_1.ChangeViewModel(associatedChange, pipelineConfig)); - }); - } - } - InitializeSummaryGroupViewModel(report, reportConfiguration) { - this.SummaryGroups = new TestSummaryGroupViewModel_1.TestSummaryGroupViewModelWrapper(); - this.SummaryGroups.TestSummaryGroupViewModel = []; - if (!util_1.isNullOrUndefined(report.$testSummaryGroups)) { - report.$testSummaryGroups.forEach(summaryGroup => { - reportConfiguration.$reportDataConfiguration.$groupTestSummaryBy.forEach(group => { - if (summaryGroup.groupedBy == group) { - console.log(`Creating summary group viewmodel for ${summaryGroup.groupedBy}`); - this.SummaryGroups.TestSummaryGroupViewModel.push(new TestSummaryGroupViewModel_1.TestSummaryGroupViewModel(summaryGroup, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal)); - } - }); - }); - } - } - InitializeTestResultGroups(report, reportConfig) { - this.TestResultsGroups = new TestResultsGroupViewModel_1.TestResultsGroupViewModelWrapper(); - this.TestResultsGroups.TestResultsGroupViewModel = []; - if (report.filteredResults != null) { - report.filteredResults.forEach(testResultGroupModel => { - var testResultsGroupViewModel = new TestResultsGroupViewModel_1.TestResultsGroupViewModel(testResultGroupModel, reportConfig); - this.TestResultsGroups.TestResultsGroupViewModel.push(testResultsGroupViewModel); - }); - } - this.HasFilteredTests = report.hasFilteredTests; - if (this.TestResultsGroups.TestResultsGroupViewModel.length > 0) { - const testResultsConfig = reportConfig.$reportDataConfiguration.$testResultsConfig; - if (testResultsConfig.$includePassedTests) { - this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.PassedTests.TestResultViewModel.length > 0).length > 0; - } - if (testResultsConfig.$includeFailedTests) { - this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.FailedTests.TestResultViewModel.length > 0).length > 0; - } - if (testResultsConfig.$includeOtherTests) { - this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.OtherTests.TestResultViewModel.length > 0).length > 0; - } - } - } - GetPassPercentage(report, includeOthersInTotal) { - var summary = report.testResultSummary; - let passedTests = 0, totalTests = 0; - if (summary != null) { - const passedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Passed]; - passedTests = util_1.isNullOrUndefined(passedTestsAggregation) ? 0 : passedTestsAggregation.count; - const failedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; - const failedTests = util_1.isNullOrUndefined(failedTestsAggregation) ? 0 : failedTestsAggregation.count; - totalTests = summary.aggregatedResultsAnalysis.totalTests; - if (!includeOthersInTotal) { - totalTests = passedTests + failedTests; - } - } - return TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(passedTests, totalTests); - } -} -exports.EmailReportViewModel = EmailReportViewModel; -//# sourceMappingURL=EmailReportViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js.map deleted file mode 100644 index 88e2c7cb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EmailReportViewModel.js","sourceRoot":"","sources":["EmailReportViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js deleted file mode 100644 index f6cf22ed..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js +++ /dev/null @@ -1,128 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MailAddressViewModel = void 0; -const util_1 = require("util"); -const StringUtils_1 = require("../../utils/StringUtils"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -class MailAddressViewModel { - constructor(report, mailConfig) { - this.cc = []; - this.to = []; - this.from = mailConfig.$smtpConfig.$userName; - this.defaultDomain = mailConfig.$defaultDomain; - console.log("computing email addresses for to section"); - this.to = this.getMailAddresses(report, mailConfig.$toRecipientsConfig); - console.log("computing email addresses for Cc section"); - this.cc = this.getMailAddresses(report, mailConfig.$ccRecipientsConfig); - } - getMailAddresses(report, recipientsConfiguration) { - var addressHashSet = new Set(); - if (recipientsConfiguration.$includeTestOwners) { - const owners = this.getFailedTestOwners(report); - owners.forEach(o => addressHashSet.add(o)); - } - if (recipientsConfiguration.$includeActiveBugOwners) { - const bugOwners = this.getActiveBugOwnersForFailedTests(report); - bugOwners.forEach(o => addressHashSet.add(o)); - } - if (recipientsConfiguration.$includeChangesetOwners) { - const changesetOwners = this.getChangesetOwners(report.$associatedChanges); - changesetOwners.forEach(o => addressHashSet.add(o)); - } - if (recipientsConfiguration.$includeCreatedBy) { - if (!util_1.isNullOrUndefined(report.createdBy)) { - addressHashSet.add(report.createdBy.uniqueName); - } - } - if (!util_1.isNullOrUndefined(recipientsConfiguration.$defaultRecipients)) { - recipientsConfiguration.$defaultRecipients.split(";").forEach(a => addressHashSet.add(a)); - } - return this.filterValidMailAddresses(addressHashSet); - } - getFailedTestOwners(report) { - var mailAddresses = []; - if (!util_1.isNullOrUndefined(report.$failedTestOwners)) { - report.$failedTestOwners.forEach(identity => { - var mailAddress = this.getMailAddressFromIdentityRef(identity); - if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(mailAddress)) { - mailAddresses.push(mailAddress); - } - }); - } - console.log(`Failed Test owners - ${mailAddresses.join(",")}`); - return mailAddresses; - } - getActiveBugOwnersForFailedTests(report) { - if (report.filteredResults == null) { - return []; - } - const bugOwners = []; - report.filteredResults.forEach(group => { - if (group.testResults.has(TestInterfaces_1.TestOutcome.Failed)) { - group.testResults.forEach(tr => { - tr.forEach(tr => { - tr.associatedBugs.forEach(bug => { - const bugState = bug.fields["System.State"]; - if (!util_1.isNullOrUndefined(bugState) && bugState.toLowerCase() == "Active".toLowerCase()) { - bugOwners.push(bug.fields["System.AssignedTo"]); - } - }); - }); - }); - } - }); - console.log(`Failed Test owners - ${bugOwners.join(",")}`); - return bugOwners; - } - getChangesetOwners(associatedChanges) { - var mailAddresses = []; - if (!util_1.isNullOrUndefined(associatedChanges) && associatedChanges.length < 1) { - console.log("No changeset owner mail addresses"); - return mailAddresses; - } - associatedChanges.forEach(associatedChange => { - var mailAddress = associatedChange.$author.uniqueName; - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(mailAddress)) { - console.log(`Unable to get mail address for associated change - ${associatedChange.$id}`); - } - else { - mailAddresses.push(mailAddress); - } - }); - console.log(`Changeset owner mail addresses - ${mailAddresses.join(",")}`); - return mailAddresses; - } - filterValidMailAddresses(addressHashSet) { - var mailAddresses = []; - addressHashSet.forEach(address => { - var validAddress = this.getValidEmailAddress(address); - if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(validAddress)) { - mailAddresses.push(validAddress); - } - }); - return mailAddresses; - } - getValidEmailAddress(address) { - if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(address) && !this.isValidEmail(address)) { - console.log(`Address ${address} is not a valid email address. Adding domain: ${this.defaultDomain}`); - address = `${address}@${this.defaultDomain}`; - } - return address; - } - isValidEmail(email) { - var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(String(email)); - } - getMailAddressFromIdentityRef(identity) { - if (!identity.isContainer) { - return this.getUniqueName(identity); - } - console.log(`Not fetching email address for container - ${identity.displayName}`); - return null; - } - getUniqueName(identity) { - return identity.uniqueName == null ? identity.displayName : identity.uniqueName; - } -} -exports.MailAddressViewModel = MailAddressViewModel; -//# sourceMappingURL=MailAddressViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js.map deleted file mode 100644 index af2439d7..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MailAddressViewModel.js","sourceRoot":"","sources":["MailAddressViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js deleted file mode 100644 index 110679ef..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PhaseIssuesViewModel = void 0; -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const TaskResultViewModel_1 = require("./TaskResultViewModel"); -const TaskModel_1 = require("../TaskModel"); -class PhaseIssuesViewModel { - constructor(phases) { - /// - /// Use TaskResultViewModel as Phase level issue as the viewmodel is same - /// - this.Tasks = new TaskResultViewModel_1.TaskResultViewModelWrapper(); - this.Name = "Phase Issues"; - this.Tasks.TaskResultViewModel = []; - phases.forEach(phase => { - if (phase != null && phase.$jobs != null) { - const canceledJobs = phase.$jobs.filter(job => job.$jobStatus == ReleaseInterfaces_1.TaskStatus.Canceled); - if (canceledJobs.length > 0) { - var failedJobsAsTasks = canceledJobs.map(job => { - return new TaskModel_1.TaskModel(job.$jobName, job.$jobStatus, job.$issues, null, null, null); - }); - var taskResViewModel = new TaskResultViewModel_1.TaskResultViewModel(failedJobsAsTasks); - taskResViewModel.IssuesSummary.ErrorMessage = `Failed on ${canceledJobs.length}/${phase.$jobs.length} Agents`; - this.Tasks.TaskResultViewModel.push(taskResViewModel); - } - } - }); - } -} -exports.PhaseIssuesViewModel = PhaseIssuesViewModel; -//# sourceMappingURL=PhaseIssuesViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js.map deleted file mode 100644 index b351c0f9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PhaseIssuesViewModel.js","sourceRoot":"","sources":["PhaseIssuesViewModel.ts"],"names":[],"mappings":";;;AAAA,0FAAgF;AAChF,+DAAwF;AAExF,4CAAyC;AAEzC,MAAa,oBAAoB;IAO/B,YAAY,MAAoB;QANhC,aAAa;QACb,yEAAyE;QACzE,cAAc;QACP,UAAK,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAI1E,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;gBACxC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,8BAAU,CAAC,QAAQ,CAAC,CAAC;gBACtF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3B,IAAI,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBAC7C,OAAO,IAAI,qBAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBACpF,CAAC,CAAC,CAAC;oBACH,IAAI,gBAAgB,GAAG,IAAI,yCAAmB,CAAC,iBAAiB,CAAC,CAAC;oBAClE,gBAAgB,CAAC,aAAa,CAAC,YAAY,GAAG,aAAa,YAAY,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;oBAC9G,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;iBACvD;aACF;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAxBD,oDAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js deleted file mode 100644 index 51d18967..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PhaseViewModel = exports.PhaseViewModelWrapper = void 0; -const DeploymentJobViewModel_1 = require("./DeploymentJobViewModel"); -const TimeFormatter_1 = require("../helpers/TimeFormatter"); -class PhaseViewModelWrapper { -} -exports.PhaseViewModelWrapper = PhaseViewModelWrapper; -class PhaseViewModel { - constructor(phase) { - this.Status = phase.$status; - this.Rank = phase.$rank; - this.Name = phase.$name; - this.InitializeDeploymentJobs(phase); - } - InitializeDeploymentJobs(phase) { - const deploymentJobs = phase.$jobs; - if (deploymentJobs.length > 0) { - this.DeploymentJob = new DeploymentJobViewModel_1.DeploymentJobViewModel(deploymentJobs); - this.InitializeTasksDuration(); - } - else { - // This can happen if we have an empty phase or a phase with only disabled steps - console.warn(`No deployment jobs found in phase ${this.Name}`); - } - } - InitializeTasksDuration() { - // Evaluate job duration and format it - if (this.DeploymentJob.MaxTaskFinishTime != null && this.DeploymentJob.MinTaskStartTime != null) { - this.TasksDuration = `${TimeFormatter_1.TimeFormatter.FormatDuration(this.DeploymentJob.MaxTaskFinishTime.getTime() - this.DeploymentJob.MinTaskStartTime.getTime())}`; - } - } -} -exports.PhaseViewModel = PhaseViewModel; -//# sourceMappingURL=PhaseViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js.map deleted file mode 100644 index 9126235d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PhaseViewModel.js","sourceRoot":"","sources":["PhaseViewModel.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAElE,4DAAyD;AAEzD,MAAa,qBAAqB;CAEjC;AAFD,sDAEC;AAED,MAAa,cAAc;IAOzB,YAAY,KAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,wBAAwB,CAAC,KAAiB;QAChD,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC;QAEnC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,+CAAsB,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAChC;aACI;YACH,gFAAgF;YAChF,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SAChE;IACH,CAAC;IAEO,uBAAuB;QAC7B,sCAAsC;QACtC,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,gBAAgB,IAAI,IAAI,EAAE;YAC/F,IAAI,CAAC,aAAa,GAAG,GAAG,6BAAa,CAAC,cAAc,CAClD,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;SACrG;IACH,CAAC;CACF;AAlCD,wCAkCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js deleted file mode 100644 index 6669729c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseEnvironmentViewModel = void 0; -class ReleaseEnvironmentViewModel { - constructor(environment) { - this.EnvironmentName = environment == null ? null : environment.name; - this.EnvironmentOwnerEmail = environment != null && environment.owner != null ? environment.owner.uniqueName : null; - } -} -exports.ReleaseEnvironmentViewModel = ReleaseEnvironmentViewModel; -//# sourceMappingURL=ReleaseEnvironmentViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js.map deleted file mode 100644 index d13d67d3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseEnvironmentViewModel.js","sourceRoot":"","sources":["ReleaseEnvironmentViewModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,2BAA2B;IAItC,YAAY,WAA+B;QACzC,IAAI,CAAC,eAAe,GAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QACrE,IAAI,CAAC,qBAAqB,GAAG,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IACtH,CAAC;CACF;AARD,kEAQC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js deleted file mode 100644 index 552b3b6e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseReferenceViewModel = void 0; -const LinkHelper_1 = require("../helpers/LinkHelper"); -class ReleaseReferenceViewModel { - constructor(config, releaseReference) { - this.Id = releaseReference.id; - this.Name = releaseReference.name; - this.Url = LinkHelper_1.LinkHelper.getReleaseSummaryLink(config); - } -} -exports.ReleaseReferenceViewModel = ReleaseReferenceViewModel; -//# sourceMappingURL=ReleaseReferenceViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js.map deleted file mode 100644 index d4f2c9ad..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseReferenceViewModel.js","sourceRoot":"","sources":["ReleaseReferenceViewModel.ts"],"names":[],"mappings":";;;AAAA,sDAAmD;AAInD,MAAa,yBAAyB;IAKpC,YAAY,MAA6B,EAAE,gBAAkC;QAC3E,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;CACF;AAVD,8DAUC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js deleted file mode 100644 index 54e00f22..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseViewModel = void 0; -const LinkHelper_1 = require("../helpers/LinkHelper"); -const ReleaseEnvironmentViewModel_1 = require("./ReleaseEnvironmentViewModel"); -const util_1 = require("util"); -class ReleaseViewModel { - constructor(currentEnvironment, releaseConfig) { - if (currentEnvironment != null) { - this.CurrentEnvironment = new ReleaseEnvironmentViewModel_1.ReleaseEnvironmentViewModel(currentEnvironment); - this.ReleaseDefinitionName = currentEnvironment.releaseDefinition == null ? null : currentEnvironment.releaseDefinition.name; - if (currentEnvironment.releaseDefinition != null) { - this.ReleaseDefinitionUrl = LinkHelper_1.LinkHelper.getReleaseDefinitionLink(releaseConfig, currentEnvironment.releaseDefinition.id); - } - this.ReleaseName = currentEnvironment.release == null ? null : currentEnvironment.release.name; - } - this.ReleaseId = releaseConfig.$pipelineId; - if (!util_1.isNullOrUndefined(currentEnvironment.release) && !util_1.isNullOrUndefined(currentEnvironment.release._links) && !util_1.isNullOrUndefined(currentEnvironment.release._links.web)) { - this.ReleaseSummaryUrl = currentEnvironment.release._links.web.href; - } - this.ReleaseLogsLink = LinkHelper_1.LinkHelper.getReleaseLogsTabLink(releaseConfig); - } -} -exports.ReleaseViewModel = ReleaseViewModel; -//# sourceMappingURL=ReleaseViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js.map deleted file mode 100644 index e1966291..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseViewModel.js","sourceRoot":"","sources":["ReleaseViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,+EAA4E;AAC5E,+BAAyC;AAEzC,MAAa,gBAAgB;IAS3B,YAAY,kBAAsC,EAAE,aAAoC;QACtF,IAAI,kBAAkB,IAAI,IAAI,EAAE;YAC9B,IAAI,CAAC,kBAAkB,GAAG,IAAI,yDAA2B,CAAC,kBAAkB,CAAC,CAAC;YAC9E,IAAI,CAAC,qBAAqB,GAAG,kBAAkB,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAE7H,IAAI,kBAAkB,CAAC,iBAAiB,IAAI,IAAI,EAAE;gBAChD,IAAI,CAAC,oBAAoB,GAAG,uBAAU,CAAC,wBAAwB,CAAC,aAAa,EAC3E,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;aAC5C;YAED,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC;SAChG;QAED,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC;QAC3C,IAAG,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACvK,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;SACrE;QACD,IAAI,CAAC,eAAe,GAAG,uBAAU,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACzE,CAAC;CACF;AA5BD,4CA4BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js deleted file mode 100644 index d2ac789c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.IssueTypeConstants = exports.TaskIssueSummaryViewModel = void 0; -const TaskIssueViewModel_1 = require("./TaskIssueViewModel"); -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const StringUtils_1 = require("../../utils/StringUtils"); -class TaskIssueSummaryViewModel { - constructor(tasks) { - this.ErrorMessage = ""; - this.ErrorCount = 0; - this.WarningCount = 0; - var allIssues = []; - this.ErrorMessage = `Failed on ${tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Failed || t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length}/${tasks.length} Agents`; - tasks.forEach(task => { - if (task.$issues != null && task.$issues.length > 0) { - task.$issues.forEach(issue => { - if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(issue.$message)) { - if (issue.$issueType.toLowerCase() == IssueTypeConstants.Error) { - this.ErrorCount++; - } - else if (issue.$issueType.toLowerCase() == IssueTypeConstants.Warning) { - this.WarningCount++; - } - allIssues.push(new TaskIssueViewModel_1.TaskIssueViewModel(issue.$message, issue.$issueType, task.$agentName)); - } - }); - } - }); - this.Issues = new TaskIssueViewModel_1.TaskIssueViewModelWrapper(); - this.Issues.TaskIssueViewModel = this.TruncateIssues(allIssues); - } - TruncateIssues(issues, characterLimit = 1000) { - const truncatedIssues = []; - var warningIssues = issues.filter(t => t.IssueType.toLowerCase() != IssueTypeConstants.Error); - var errorIssues = issues.filter(t => t.IssueType.toLowerCase() == IssueTypeConstants.Error); - const sortedIssues = []; - sortedIssues.push(...warningIssues); - sortedIssues.push(...errorIssues); - let currentCharCount = 0; - for (var i = 0; i < sortedIssues.length; i++) { - const issue = sortedIssues[i]; - if (currentCharCount >= characterLimit) { - return truncatedIssues; - } - issue.Message = issue.Message.substring(0, characterLimit - currentCharCount); - currentCharCount += issue.Message.length; - truncatedIssues.push(issue); - } - return truncatedIssues; - } -} -exports.TaskIssueSummaryViewModel = TaskIssueSummaryViewModel; -class IssueTypeConstants { -} -exports.IssueTypeConstants = IssueTypeConstants; -IssueTypeConstants.Error = "error"; -IssueTypeConstants.Warning = "warning"; -//# sourceMappingURL=TaskIssueSummaryViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js.map deleted file mode 100644 index 18f293c1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskIssueSummaryViewModel.js","sourceRoot":"","sources":["TaskIssueSummaryViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js deleted file mode 100644 index 6b55d0f3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js +++ /dev/null @@ -1,15 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskIssueViewModel = exports.TaskIssueViewModelWrapper = void 0; -class TaskIssueViewModelWrapper { -} -exports.TaskIssueViewModelWrapper = TaskIssueViewModelWrapper; -class TaskIssueViewModel { - constructor(issueMessage, issueType, agentName) { - this.Message = `(${agentName}) ${issueMessage.trim()}`; - this.IssueType = issueType; - this.AgentName = agentName; - } -} -exports.TaskIssueViewModel = TaskIssueViewModel; -//# sourceMappingURL=TaskIssueViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js.map deleted file mode 100644 index c68bb95a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskIssueViewModel.js","sourceRoot":"","sources":["TaskIssueViewModel.ts"],"names":[],"mappings":";;;AAAA,MAAa,yBAAyB;CAErC;AAFD,8DAEC;AAED,MAAa,kBAAkB;IAM7B,YAAY,YAAoB,EAAE,SAAiB,EAAE,SAAiB;QACpE,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,KAAK,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAXD,gDAWC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js deleted file mode 100644 index 5a7b0e2f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js +++ /dev/null @@ -1,82 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskResultViewModel = exports.TaskResultViewModelWrapper = void 0; -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const TaskIssueSummaryViewModel_1 = require("./TaskIssueSummaryViewModel"); -const TimeFormatter_1 = require("../helpers/TimeFormatter"); -class TaskResultViewModelWrapper { -} -exports.TaskResultViewModelWrapper = TaskResultViewModelWrapper; -class TaskResultViewModel { - constructor(tasks) { - this.Name = tasks.length > 0 ? tasks[0].$name : ""; - this.HasFailed = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Failed || t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length > 0; - this.HasSkipped = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length == tasks.length; - this.NotYetRun = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.InProgress || t.$status == ReleaseInterfaces_1.TaskStatus.Unknown || t.$status == ReleaseInterfaces_1.TaskStatus.Pending).length > 0; - this.HasPartiallySucceeded = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.PartiallySucceeded).length > 0; - this.GotCancelled = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length > 0; - const inProgressTasks = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.InProgress); - if (inProgressTasks.length == 1) { - // Must be this task - Mark it as completed assuming we will pass - // If we don't, then the email report won't be sent with this data - this.NotYetRun = false; - } - if (tasks.length > 1) { - this.HasNotRunOnSomeAgents = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length > 0; - this.NotRunMessage = `Not run on ${tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length}/${tasks.length} agents`; - } - this.IssuesSummary = new TaskIssueSummaryViewModel_1.TaskIssueSummaryViewModel(tasks); - // No point in calculating duration for skipped/cancelled/not-yet-run tasks - if (!this.HasSkipped && !this.NotYetRun && !this.GotCancelled) { - this.InitializeDuration(tasks.filter(t => t.$status != ReleaseInterfaces_1.TaskStatus.Skipped)); - } - else { - this.Duration = ""; - } - } - InitializeDuration(tasks) { - if (tasks.length == 1) { - var firstTask = tasks[0]; - if (firstTask.$finishTime != null && firstTask.$startTime != null) { - this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(this.getTimeDiff(firstTask)); - } - } - else { - const nonNullTasks = tasks.filter(t => t.$finishTime != null && t.$startTime != null); - if (nonNullTasks.length > 0) { - var minTime = this.getMinTime(nonNullTasks); - var maxTime = this.getMaxTime(nonNullTasks); - if (minTime != null && maxTime != null) { - const minTimeStr = TimeFormatter_1.TimeFormatter.FormatDuration(minTime); - const maxTimeStr = TimeFormatter_1.TimeFormatter.FormatDuration(maxTime); - this.Duration = minTimeStr == maxTimeStr ? minTimeStr : `${minTimeStr} - ${maxTimeStr}`; - } - } - } - } - getMinTime(tasks) { - let minTime = this.getTimeDiff(tasks[0]); - for (var i = 1; i < tasks.length; i++) { - const diffTime = this.getTimeDiff(tasks[i]); - if (diffTime < minTime) { - minTime = diffTime; - } - } - return minTime; - } - getMaxTime(tasks) { - let maxTime = this.getTimeDiff(tasks[0]); - for (var i = 1; i < tasks.length; i++) { - const diffTime = this.getTimeDiff(tasks[i]); - if (diffTime > maxTime) { - maxTime = diffTime; - } - } - return maxTime; - } - getTimeDiff(task) { - return task.$finishTime.getTime() - task.$startTime.getTime(); - } -} -exports.TaskResultViewModel = TaskResultViewModel; -//# sourceMappingURL=TaskResultViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js.map deleted file mode 100644 index 95a2c073..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskResultViewModel.js","sourceRoot":"","sources":["TaskResultViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js deleted file mode 100644 index 5d78c3bc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestInfoByPriorityViewModel = exports.TestInfoByPriorityViewModelWrapper = void 0; -const TestOutcomeForPriority_1 = require("../testresults/TestOutcomeForPriority"); -const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); -class TestInfoByPriorityViewModelWrapper { -} -exports.TestInfoByPriorityViewModelWrapper = TestInfoByPriorityViewModelWrapper; -class TestInfoByPriorityViewModel { - constructor(priority, testCountByOutcome, includeOthersInTotal) { - this.Priority = priority; - this.TestCount = TestResultsHelper_1.TestResultsHelper.getTotalTestCountBasedOnUserConfigurationPriority(testCountByOutcome, includeOthersInTotal); - if (this.TestCount > 0) { - var passingTests = this.getPassingTestCountByOutcome(testCountByOutcome); - this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(passingTests, this.TestCount); - } - } - getPassingTestCountByOutcome(testCountByOutcome) { - return testCountByOutcome.has(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed) - ? testCountByOutcome.get(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed) - : 0; - } -} -exports.TestInfoByPriorityViewModel = TestInfoByPriorityViewModel; -//# sourceMappingURL=TestInfoByPriorityViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js.map deleted file mode 100644 index be888529..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestInfoByPriorityViewModel.js","sourceRoot":"","sources":["TestInfoByPriorityViewModel.ts"],"names":[],"mappings":";;;AAAA,kFAA+E;AAC/E,oEAAiE;AAEjE,MAAa,kCAAkC;CAE9C;AAFD,gFAEC;AAED,MAAa,2BAA2B;IAKtC,YAAY,QAAgB,EAC1B,kBAAuD,EACvD,oBAA6B;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,qCAAiB,CAAC,iDAAiD,CAClF,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;YACtB,IAAI,YAAY,GAAG,IAAI,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;YACzE,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;SACnG;IACH,CAAC;IAEO,4BAA4B,CAAC,kBAAuD;QAC1F,OAAO,kBAAkB,CAAC,GAAG,CAAC,+CAAsB,CAAC,MAAM,CAAC;YAC1D,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,+CAAsB,CAAC,MAAM,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;CACF;AAtBD,kEAsBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js deleted file mode 100644 index 91a1d6c0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultSummaryViewModel = void 0; -const TimeFormatter_1 = require("../helpers/TimeFormatter"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); -const util_1 = require("util"); -class TestResultSummaryViewModel { - constructor(summaryItemModel, summary, pipelineConfiguration, includeOthersInTotal) { - if (summaryItemModel != null) { - this.PassedTests = summaryItemModel.getPassedTestsCount(); - this.FailedTests = summaryItemModel.getFailedTestsCount(); - this.OtherTests = summaryItemModel.getOtherTestsCount(); - this.TotalTests = TestResultsHelper_1.TestResultsHelper.getTotalTestCountBasedOnUserConfiguration(summaryItemModel.$testCountByOutcome, includeOthersInTotal); - this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); - this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(summaryItemModel.$duration); - this.Url = pipelineConfiguration.getTestTabLink(); - } - else if (summary != null) { - const passedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Passed]; - const failedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; - this.PassedTests = util_1.isNullOrUndefined(passedAnalysis) ? 0 : passedAnalysis.count; - this.FailedTests = util_1.isNullOrUndefined(failedAnalysis) ? 0 : failedAnalysis.count; - this.TotalTests = summary.aggregatedResultsAnalysis.totalTests; - this.OtherTests = this.TotalTests - this.PassedTests - this.FailedTests; - if (!includeOthersInTotal) { - this.TotalTests -= this.OtherTests; - } - this.Duration = TimeFormatter_1.TimeFormatter.FormatDurationStr(summary.aggregatedResultsAnalysis.duration); - this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); - this.Url = pipelineConfiguration.getTestTabLink(); - } - } -} -exports.TestResultSummaryViewModel = TestResultSummaryViewModel; -TestResultSummaryViewModel.MaxSupportedPriority = 2; -//# sourceMappingURL=TestResultSummaryViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js.map deleted file mode 100644 index bc2bc776..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultSummaryViewModel.js","sourceRoot":"","sources":["TestResultSummaryViewModel.ts"],"names":[],"mappings":";;;AAEA,4DAAyD;AACzD,oFAAiG;AACjG,oEAAiE;AACjE,+BAAyC;AAEzC,MAAa,0BAA0B;IAUrC,YAAY,gBAAsC,EAAE,OAA0B,EAAE,qBAA4C,EAAE,oBAA6B;QACzJ,IAAI,gBAAgB,IAAI,IAAI,EAAE;YAC5B,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;YAExD,IAAI,CAAC,UAAU,GAAG,qCAAiB,CAAC,yCAAyC,CAAC,gBAAgB,CAAC,mBAAmB,EAChH,oBAAoB,CAAC,CAAC;YAExB,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvG,IAAI,CAAC,QAAQ,GAAG,6BAAa,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAEzE,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;SACnD;aACI,IAAI,OAAO,IAAI,IAAI,EAAE;YACxB,MAAM,cAAc,GAAG,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;YAC9F,MAAM,cAAc,GAAG,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;YAC9F,IAAI,CAAC,WAAW,GAAG,wBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAChF,IAAI,CAAC,WAAW,GAAG,wBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAChF,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,yBAAyB,CAAC,UAAU,CAAC;YAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAExE,IAAI,CAAC,oBAAoB,EAAE;gBACzB,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;aACpC;YAED,IAAI,CAAC,QAAQ,GAAG,6BAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;YAC5F,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACvG,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;SACnD;IACH,CAAC;;AAzCH,gEA0CC;AAzCwB,+CAAoB,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js deleted file mode 100644 index 1d8005b1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultViewModel = exports.TestResultViewModelWrapper = void 0; -const WorkItemViewModel_1 = require("./WorkItemViewModel"); -const StringUtils_1 = require("../../utils/StringUtils"); -const LinkHelper_1 = require("../helpers/LinkHelper"); -const TimeFormatter_1 = require("../helpers/TimeFormatter"); -const DisplayNameHelper_1 = require("../../utils/DisplayNameHelper"); -const ReleaseReferenceViewModel_1 = require("./ReleaseReferenceViewModel"); -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -const BuildReferenceViewModel_1 = require("./BuildReferenceViewModel"); -const util_1 = require("util"); -class TestResultViewModelWrapper { -} -exports.TestResultViewModelWrapper = TestResultViewModelWrapper; -class TestResultViewModel { - constructor(testResultModel, config) { - this.StackTraceLineCount = 5; - const result = testResultModel.testResult; - this.Id = result.id; - this.TestCaseTitle = result.testCaseTitle; - this.ErrorMessage = ""; - this.TestOutcome = result.outcome; - this.StackTrace = ""; - if (result.priority != 255) { - this.Priority = DisplayNameHelper_1.DisplayNameHelper.getPriorityDisplayName(result.priority == null ? "" : result.priority.toString()); - } - this.InitializeAssociatedBugs(config, testResultModel.associatedBugs); - this.Url = LinkHelper_1.LinkHelper.getTestResultLink(config, result.testRun.id, this.Id); - this.Owner = result.owner == null ? null : result.owner.displayName; - if (result.failingSince != null) { - const failingSincePipeline = config.$pipelineType == PipelineType_1.PipelineType.Build ? result.failingSince.release : result.failingSince.build; - const failingSinceNotCurrent = failingSincePipeline == null ? false : failingSincePipeline.id != config.$pipelineId; - if (failingSinceNotCurrent) { - this.FailingSinceTime = result.failingSince.date.toDateString(); - if (result.failingSince.release != null && result.failingSince.release.id > 0) { - this.FailingSinceRelease = new ReleaseReferenceViewModel_1.ReleaseReferenceViewModel(config, result.failingSince.release); - } - if (result.failingSince.build != null && result.failingSince.build.id > 0) { - this.FailingSinceBuild = new BuildReferenceViewModel_1.BuildReferenceViewModel(config, null, result.failingSince.build); - } - } - } - if (util_1.isNullOrUndefined(result.durationInMs)) { - if (!util_1.isNullOrUndefined(result.startedDate) && !util_1.isNullOrUndefined(result.completedDate)) { - result.durationInMs = result.completedDate.getTime() - result.startedDate.getTime(); - } - if (util_1.isNullOrUndefined(result.durationInMs) || result.durationInMs < 0) { - // unknown duration - assume test didn't run instead of displaying "Undefined/NaN" in email - result.durationInMs = 0; - } - } - this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(result.durationInMs); - this.CreateBugLink = LinkHelper_1.LinkHelper.getCreateBugLinkForTest(config, testResultModel.testResult); - } - InitializeAssociatedBugs(config, associatedBugs) { - this.AssociatedBugs = new WorkItemViewModel_1.WorkItemViewModelWrapper(); - this.AssociatedBugs.WorkItemViewModel = []; - if (associatedBugs == null) { - return; - } - associatedBugs.forEach(workItem => { - if (workItem.id != null) { - this.AssociatedBugs.WorkItemViewModel.push(new WorkItemViewModel_1.WorkItemViewModel(config, workItem)); - } - }); - } -} -exports.TestResultViewModel = TestResultViewModel; -//# sourceMappingURL=TestResultViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js.map deleted file mode 100644 index f87e77ba..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultViewModel.js","sourceRoot":"","sources":["TestResultViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js deleted file mode 100644 index 9d67303e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsGroupViewModel = exports.TestResultsGroupViewModelWrapper = void 0; -const TestResultViewModel_1 = require("./TestResultViewModel"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -const DisplayNameHelper_1 = require("../../utils/DisplayNameHelper"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TcmHelper_1 = require("../../providers/tcmproviders/TcmHelper"); -class TestResultsGroupViewModelWrapper { -} -exports.TestResultsGroupViewModelWrapper = TestResultsGroupViewModelWrapper; -class TestResultsGroupViewModel { - constructor(resultsGroupModel, reportConfig) { - this.FailedTests = new TestResultViewModel_1.TestResultViewModelWrapper(); - this.OtherTests = new TestResultViewModel_1.TestResultViewModelWrapper(); - this.PassedTests = new TestResultViewModel_1.TestResultViewModelWrapper(); - this.setGroupName(resultsGroupModel, reportConfig); - this.FailedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestInterfaces_1.TestOutcome.Failed]); - this.PassedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestInterfaces_1.TestOutcome.Passed]); - this.OtherTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed])); - } - setGroupName(resultsGroupModel, reportConfig) { - var groupTestResultsBy = reportConfig.$reportDataConfiguration.$testResultsConfig.$groupTestResultsBy; - this.GroupName = groupTestResultsBy == GroupTestResultsBy_1.GroupTestResultsBy.Priority ? - DisplayNameHelper_1.DisplayNameHelper.getPriorityDisplayName(resultsGroupModel.groupName) : - resultsGroupModel.groupName; - } - getTestResultViewModels(resultsGroupModel, config, testOutcomes) { - return this.getTestResultsByOutcomes(resultsGroupModel, testOutcomes) - .map(result => new TestResultViewModel_1.TestResultViewModel(result, config)); - } - getTestResultsByOutcomes(source, outcomes) { - const testResults = []; - outcomes.forEach(outcome => { - if (source.testResults.has(outcome)) { - testResults.push(...source.testResults.get(outcome)); - } - }); - return testResults; - } -} -exports.TestResultsGroupViewModel = TestResultsGroupViewModel; -//# sourceMappingURL=TestResultsGroupViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js.map deleted file mode 100644 index 96653582..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultsGroupViewModel.js","sourceRoot":"","sources":["TestResultsGroupViewModel.ts"],"names":[],"mappings":";;;AAAA,+DAAwF;AAGxF,+EAA4E;AAC5E,qEAAkE;AAElE,oFAA8E;AAE9E,sEAAmE;AAEnE,MAAa,gCAAgC;CAE5C;AAFD,4EAEC;AAED,MAAa,yBAAyB;IAMpC,YAAY,iBAAwC,EAAE,YAAiC;QALhF,gBAAW,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAE3E,eAAU,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAC1E,gBAAW,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAGhF,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClJ,IAAI,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClJ,IAAI,CAAC,UAAU,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EACvH,qBAAS,CAAC,cAAc,CAAC,CAAC,4BAAW,CAAC,MAAM,EAAE,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,YAAY,CAAC,iBAAwC,EAAE,YAAiC;QAC9F,IAAI,kBAAkB,GAAG,YAAY,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;QACtG,IAAI,CAAC,SAAS,GAAG,kBAAkB,IAAI,uCAAkB,CAAC,QAAQ,CAAC,CAAC;YAClE,qCAAiB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;YACvE,iBAAiB,CAAC,SAAS,CAAC;IAChC,CAAC;IAEO,uBAAuB,CAC7B,iBAAwC,EACxC,MAA6B,EAC7B,YAA2B;QAC3B,OAAO,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,YAAY,CAAC;aAClE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,yCAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEM,wBAAwB,CAC7B,MAA6B,EAC7B,QAAuB;QACvB,MAAM,WAAW,GAAsB,EAAE,CAAC;QAE1C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBACnC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtD;QACH,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAzCD,8DAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js deleted file mode 100644 index 2c67732d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryGroupViewModel = exports.TestSummaryGroupViewModelWrapper = void 0; -const TestSummaryItemViewModel_1 = require("./TestSummaryItemViewModel"); -const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -class TestSummaryGroupViewModelWrapper { -} -exports.TestSummaryGroupViewModelWrapper = TestSummaryGroupViewModelWrapper; -class TestSummaryGroupViewModel { - constructor(testSummaryGroup, config, includeOthersInTotal) { - this.GroupName = this.getDescription(testSummaryGroup.groupedBy); - this.InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal); - this.InitializeSupportedPriorityColumns(); - } - InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal) { - this.SummaryItems = new TestSummaryItemViewModel_1.TestSummaryItemViewModelWrapper(); - this.SummaryItems.TestSummaryItemViewModel = []; - testSummaryGroup.runs.forEach(testSummaryItem => { - this.SummaryItems.TestSummaryItemViewModel.push(new TestSummaryItemViewModel_1.TestSummaryItemViewModel(testSummaryGroup.groupedBy, testSummaryItem, config, includeOthersInTotal)); - }); - } - InitializeSupportedPriorityColumns() { - this.SupportedPriorityColumns = new Set(); - this.SummaryItems.TestSummaryItemViewModel.forEach(item => item.TestsByPriority.TestInfoByPriorityViewModel.forEach(testsByPriorityVm => { - if (testsByPriorityVm.Priority <= TestResultSummaryViewModel_1.TestResultSummaryViewModel.MaxSupportedPriority) { - this.SupportedPriorityColumns.add(testsByPriorityVm.Priority); - } - })); - } - getDescription(groupedBy) { - switch (groupedBy) { - case GroupTestResultsBy_1.GroupTestResultsBy.Priority: return "Priority"; - case GroupTestResultsBy_1.GroupTestResultsBy.Run: return "Test Run"; - default: return "Team"; - } - } -} -exports.TestSummaryGroupViewModel = TestSummaryGroupViewModel; -//# sourceMappingURL=TestSummaryGroupViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js.map deleted file mode 100644 index 320e62a9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryGroupViewModel.js","sourceRoot":"","sources":["TestSummaryGroupViewModel.ts"],"names":[],"mappings":";;;AAEA,yEAAuG;AACvG,6EAA0E;AAC1E,+EAA4E;AAE5E,MAAa,gCAAgC;CAE5C;AAFD,4EAEC;AAED,MAAa,yBAAyB;IAKpC,YAAY,gBAAuC,EACjD,MAA6B,EAC7B,oBAA6B;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAE5E,IAAI,CAAC,kCAAkC,EAAE,CAAC;IAC5C,CAAC;IAEO,sBAAsB,CAC5B,gBAAuC,EACvC,MAA6B,EAC7B,oBAA6B;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,0DAA+B,EAAE,CAAC;QAC1D,IAAI,CAAC,YAAY,CAAC,wBAAwB,GAAG,EAAE,CAAC;QAChD,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;YAC9C,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,mDAAwB,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3J,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,kCAAkC;QACxC,IAAI,CAAC,wBAAwB,GAAG,IAAI,GAAG,EAAU,CAAC;QAElD,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CACxD,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;YAC3E,IAAI,iBAAiB,CAAC,QAAQ,IAAI,uDAA0B,CAAC,oBAAoB,EAAE;gBACjF,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;aAC/D;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,SAA6B;QAClD,QAAQ,SAAS,EAAE;YACjB,KAAK,uCAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,UAAU,CAAC;YACpD,KAAK,uCAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,UAAU,CAAC;YAC/C,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;SACxB;IACH,CAAC;CACF;AA5CD,8DA4CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js deleted file mode 100644 index 78194d33..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryItemViewModel = exports.TestSummaryItemViewModelWrapper = void 0; -const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); -const TestInfoByPriorityViewModel_1 = require("./TestInfoByPriorityViewModel"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -class TestSummaryItemViewModelWrapper { -} -exports.TestSummaryItemViewModelWrapper = TestSummaryItemViewModelWrapper; -class TestSummaryItemViewModel extends TestResultSummaryViewModel_1.TestResultSummaryViewModel { - constructor(groupedBy, summaryItem, config, includeOthersInTotal) { - super(summaryItem, null, config, includeOthersInTotal); - this.TestsByPriority = new TestInfoByPriorityViewModel_1.TestInfoByPriorityViewModelWrapper(); - this.Name = (groupedBy == GroupTestResultsBy_1.GroupTestResultsBy.Priority) ? - this.getDisplayName(summaryItem.$name) : - summaryItem.$name; - this.setupPriorityData(summaryItem, includeOthersInTotal); - } - setupPriorityData(summaryItem, includeOthersInTotal) { - this.TestsByPriority.TestInfoByPriorityViewModel = []; - const testCountForOutcomeByPriority = summaryItem.$testCountForOutcomeByPriority; - testCountForOutcomeByPriority.forEach((value, priority) => { - if (priority <= TestResultSummaryViewModel_1.TestResultSummaryViewModel.MaxSupportedPriority) { - this.TestsByPriority.TestInfoByPriorityViewModel.push(new TestInfoByPriorityViewModel_1.TestInfoByPriorityViewModel(priority, value, includeOthersInTotal)); - } - }); - } - getDisplayName(priority) { - const priorityInt = Number.parseInt(priority); - if (!isNaN(priorityInt) && priorityInt == 255) { - return "Priority unspecified"; - } - return `Priority: ${priority}`; - } -} -exports.TestSummaryItemViewModel = TestSummaryItemViewModel; -//# sourceMappingURL=TestSummaryItemViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js.map deleted file mode 100644 index 19641149..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryItemViewModel.js","sourceRoot":"","sources":["TestSummaryItemViewModel.ts"],"names":[],"mappings":";;;AAAA,6EAA0E;AAC1E,+EAAgH;AAGhH,+EAA4E;AAG5E,MAAa,+BAA+B;CAE3C;AAFD,0EAEC;AAED,MAAa,wBAAyB,SAAQ,uDAA0B;IAItE,YACE,SAA6B,EAC7B,WAAiC,EACjC,MAA6B,EAC7B,oBAA6B;QAC7B,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAPlD,oBAAe,GAAuC,IAAI,gEAAkC,EAAE,CAAC;QAQpG,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,IAAI,uCAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,WAAW,CAAC,KAAK,CAAC;QAEpB,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IAC5D,CAAC;IAEO,iBAAiB,CAAC,WAAiC,EAAE,oBAA6B;QACxF,IAAI,CAAC,eAAe,CAAC,2BAA2B,GAAG,EAAE,CAAC;QAEtD,MAAM,6BAA6B,GACjC,WAAW,CAAC,8BAA8B,CAAC;QAE7C,6BAA6B,CAAC,OAAO,CAAC,CAAC,KAA0C,EAAE,QAAgB,EAAE,EAAE;YACrG,IAAI,QAAQ,IAAI,uDAA0B,CAAC,oBAAoB,EAAE;gBAC/D,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,yDAA2B,CAAC,QAAQ,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC;aAC/H;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,QAAgB;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE;YAC7C,OAAO,sBAAsB,CAAC;SAC/B;QACD,OAAO,aAAa,QAAQ,EAAE,CAAC;IACjC,CAAC;CACF;AArCD,4DAqCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js deleted file mode 100644 index acde0aad..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.WorkItemViewModel = exports.WorkItemViewModelWrapper = void 0; -const LinkHelper_1 = require("../helpers/LinkHelper"); -const StringUtils_1 = require("../../utils/StringUtils"); -const util_1 = require("util"); -class WorkItemViewModelWrapper { -} -exports.WorkItemViewModelWrapper = WorkItemViewModelWrapper; -class WorkItemViewModel { - constructor(config, workItem) { - if (workItem.id != null) { - this.Id = workItem.id; - this.Url = LinkHelper_1.LinkHelper.getWorkItemLink(config, workItem.id); - } - this.Title = workItem.fields["System.Title"]; - // This is for display in email report only - var assignToRef = workItem.fields["System.AssignedTo"]; - // Prefer Display name to Unique Name in report - this.AssignedTo = util_1.isNullOrUndefined(assignToRef) ? "" : (StringUtils_1.StringUtils.isNullOrWhiteSpace(assignToRef.displayName) ? assignToRef.uniqueName : assignToRef.displayName); - // Unassigned workitem - this.AssignedTo = util_1.isNullOrUndefined(this.AssignedTo) ? "" : this.AssignedTo; - this.State = workItem.fields["System.State"]; - this.ChangedDate = workItem.fields["System.ChangedDate"]; - } -} -exports.WorkItemViewModel = WorkItemViewModel; -//# sourceMappingURL=WorkItemViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js.map deleted file mode 100644 index 5324f5b6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"WorkItemViewModel.js","sourceRoot":"","sources":["WorkItemViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,yDAAsD;AACtD,+BAAyC;AAEzC,MAAa,wBAAwB;CAEpC;AAFD,4DAEC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,MAA6B,EAAE,QAAkB;QAC3D,IAAI,QAAQ,CAAC,EAAE,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC5D;QAED,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE7C,2CAA2C;QAC3C,IAAI,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACvD,+CAA+C;QAC/C,IAAI,CAAC,UAAU,GAAG,wBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACrK,sBAAsB;QACtB,IAAI,CAAC,UAAU,GAAG,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAE5E,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC;CACF;AA1BD,8CA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js deleted file mode 100644 index 3bcb7b68..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DataProviderFactory = void 0; -const PipelineType_1 = require("../config/pipeline/PipelineType"); -const ReleaseDataProvider_1 = require("./pipeline/ReleaseDataProvider"); -const ReleaseClient_1 = require("./restclients/ReleaseClient"); -const TestOwnersDataProvider_1 = require("./tcmproviders/TestOwnersDataProvider"); -const TestSummaryDataProvider_1 = require("./tcmproviders/TestSummaryDataProvider"); -const TestResultsDataProvider_1 = require("./tcmproviders/TestResultsDataProvider"); -const WorkItemClient_1 = require("./restclients/WorkItemClient"); -const SendMailConditionProcessor_1 = require("./SendMailConditionProcessor"); -const BuildClient_1 = require("./restclients/BuildClient"); -const BuildDataProvider_1 = require("./pipeline/BuildDataProvider"); -const BuildTestResultsClient_1 = require("./restclients/BuildTestResultsClient"); -const ReleaseTestResultsClient_1 = require("./restclients/ReleaseTestResultsClient"); -class DataProviderFactory { - constructor($pipelineConfig) { - this.dataProviders = []; - this.postProcessors = []; - this.pipelineConfig = $pipelineConfig; - } - getDataProviders() { - if (this.dataProviders.length < 1) { - if (this.pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Release) { - const pipelineRestClient = new ReleaseClient_1.ReleaseRestClient(this.pipelineConfig); - this.dataProviders.push(new ReleaseDataProvider_1.ReleaseDataProvider(pipelineRestClient)); - } - else { - const pipelineRestClient = new BuildClient_1.BuildRestClient(this.pipelineConfig); - this.dataProviders.push(new BuildDataProvider_1.BuildDataProvider(pipelineRestClient)); - } - const testResultsClient = this.getTestResultsClient(); - const workItemClient = new WorkItemClient_1.WorkItemClient(this.pipelineConfig); - this.dataProviders.push(new TestOwnersDataProvider_1.TestOwnersDataProvider(testResultsClient)); - this.dataProviders.push(new TestSummaryDataProvider_1.TestSummaryDataProvider(testResultsClient)); - this.dataProviders.push(new TestResultsDataProvider_1.TestResultsDataProvider(testResultsClient, workItemClient)); - } - return this.dataProviders; - } - getPostProcessors() { - if (this.postProcessors.length < 1) { - this.postProcessors.push(new SendMailConditionProcessor_1.SendMailConditionProcessor(this.getTestResultsClient())); - } - return this.postProcessors; - } - getTestResultsClient() { - if (this.testResultsClient == null) { - this.testResultsClient = this.pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build ? - new BuildTestResultsClient_1.BuildTestResultsClient(this.pipelineConfig) : - new ReleaseTestResultsClient_1.ReleaseTestResultsClient(this.pipelineConfig); - } - return this.testResultsClient; - } -} -exports.DataProviderFactory = DataProviderFactory; -//# sourceMappingURL=DataProviderFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js.map deleted file mode 100644 index 8c21bdb2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DataProviderFactory.js","sourceRoot":"","sources":["DataProviderFactory.ts"],"names":[],"mappings":";;;AAIA,kEAA+D;AAC/D,wEAAqE;AACrE,+DAAgE;AAChE,kFAA+E;AAC/E,oFAAiF;AACjF,oFAAiF;AACjF,iEAA8D;AAC9D,6EAA0E;AAC1E,2DAA4D;AAC5D,oEAAiE;AAEjE,iFAA8E;AAC9E,qFAAkF;AAElF,MAAa,mBAAmB;IAQ9B,YAAY,eAAsC;QAL1C,kBAAa,GAAoB,EAAE,CAAC;QACpC,mBAAc,GAAqB,EAAE,CAAC;QAK5C,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;IACxC,CAAC;IAEM,gBAAgB;QACrB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,OAAO,EAAE;gBAC7D,MAAM,kBAAkB,GAAG,IAAI,iCAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACtE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC;aACtE;iBAAM;gBACL,MAAM,kBAAkB,GAAG,IAAI,6BAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACpE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,qCAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC;aACpE;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE/D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,+CAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iDAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iDAAuB,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;SACzF;QAED,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEM,iBAAiB;QACtB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,uDAA0B,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;SACvF;QAED,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,oBAAoB;QAC1B,IAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE;YACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC;gBAChF,IAAI,+CAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACjD,IAAI,mDAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACrD;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AAhDD,kDAgDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js deleted file mode 100644 index b8225b61..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js.map deleted file mode 100644 index 48b33d63..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IDataProvider.js","sourceRoot":"","sources":["IDataProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js deleted file mode 100644 index 1653e44f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IDataProviderFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js.map deleted file mode 100644 index ee835e22..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IDataProviderFactory.js","sourceRoot":"","sources":["IDataProviderFactory.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js deleted file mode 100644 index b119f9a9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IPostProcessor.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js.map deleted file mode 100644 index 64da73b0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IPostProcessor.js","sourceRoot":"","sources":["IPostProcessor.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js deleted file mode 100644 index 462734a9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IReportProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js.map deleted file mode 100644 index 141696fa..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IReportProvider.js","sourceRoot":"","sources":["IReportProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js deleted file mode 100644 index a4eb6732..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js +++ /dev/null @@ -1,86 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportProvider = void 0; -const ReportFactory_1 = require("../model/ReportFactory"); -const ReportError_1 = require("../exceptions/ReportError"); -const DataProviderError_1 = require("../exceptions/DataProviderError"); -const PostProcessorError_1 = require("../exceptions/PostProcessorError"); -const TelemetryLogger_1 = require("../telemetry/TelemetryLogger"); -class ReportProvider { - constructor(dataProviderFactory) { - this.dataProviders = []; - this.postProcessors = []; - this.dataProviders.push(...dataProviderFactory.getDataProviders()); - this.postProcessors.push(...dataProviderFactory.getPostProcessors()); - } - createReportAsync(reportConfig) { - return __awaiter(this, void 0, void 0, function* () { - let finalReport; - try { - const reportTaskArray = this.dataProviders.map(dataProvider => TelemetryLogger_1.TelemetryLogger.InvokeWithPerfLogger(() => __awaiter(this, void 0, void 0, function* () { return this.callDataProvider(dataProvider, reportConfig); }), dataProvider.constructor.name)); - const reports = yield Promise.all(reportTaskArray); - finalReport = ReportFactory_1.ReportFactory.mergeReports(reports); - // Post Process data collected - const processorTasks = this.postProcessors.map(processor => TelemetryLogger_1.TelemetryLogger.InvokeWithPerfLogger(() => __awaiter(this, void 0, void 0, function* () { return this.callPostProcessor(processor, reportConfig, finalReport); }), processor.constructor.name)); - // Wait for all processors - yield Promise.all(processorTasks); - } - catch (err) { - ReportError_1.ReportError.HandleError(err); - if (finalReport == null) - finalReport = ReportFactory_1.ReportFactory.createNewReport(reportConfig.$pipelineConfiguration); - finalReport.$dataMissing = true; - } - return finalReport; - }); - } - callDataProvider(dataProvider, reportConfig) { - return __awaiter(this, void 0, void 0, function* () { - let report = null; - try { - report = yield dataProvider.getReportDataAsync(reportConfig.$pipelineConfiguration, reportConfig.$reportDataConfiguration); - } - catch (err) { - // Do not error out until all data providers are done - console.log(err); - if (!(err instanceof ReportError_1.ReportError)) { - const reportError = new DataProviderError_1.DataProviderError(`Error fetching data using ${dataProvider.constructor.name}: ${err.message}`); - reportError.innerError = err; - throw reportError; - } - throw err; - } - return report; - }); - } - callPostProcessor(postProcessor, reportConfig, report) { - return __awaiter(this, void 0, void 0, function* () { - let retVal = false; - try { - retVal = yield postProcessor.processReportAsync(reportConfig, report); - } - catch (err) { - // Do not error out until all post processors are done - console.log(err); - if (!(err instanceof ReportError_1.ReportError)) { - const reportError = new PostProcessorError_1.PostProcessorError(`Error fetching data using ${postProcessor.constructor.name}: ${err.message}`); - reportError.innerError = err; - throw reportError; - } - throw err; - } - return retVal; - }); - } -} -exports.ReportProvider = ReportProvider; -//# sourceMappingURL=ReportProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js.map deleted file mode 100644 index 71491088..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportProvider.js","sourceRoot":"","sources":["ReportProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js deleted file mode 100644 index 992128e1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.SendMailConditionProcessor = void 0; -const SendMailCondition_1 = require("../config/report/SendMailCondition"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const util_1 = require("util"); -const TcmHelper_1 = require("./tcmproviders/TcmHelper"); -const AbstractTestResultsClient_1 = require("./restclients/AbstractTestResultsClient"); -const EnumUtils_1 = require("../utils/EnumUtils"); -class SendMailConditionProcessor { - constructor(testResultsClient) { - this.TestResultFieldsToQuery = ["TestCaseReferenceId", "OutcomeConfidence"]; - this.testResultsClient = testResultsClient; - } - processReportAsync(reportConfig, report) { - return __awaiter(this, void 0, void 0, function* () { - var shouldSendMail = false; - if (!report.$dataMissing) { - const sendMailCondition = reportConfig.$sendMailCondition; - shouldSendMail = sendMailCondition == SendMailCondition_1.SendMailCondition.Always; - if (!shouldSendMail) { - var hasTestFailures = report.hasFailedTests(reportConfig.$reportDataConfiguration.$includeOthersInTotal); - var hasFailedTasks = report.hasFailedTasks(); - var hasCanceledPhases = report.hasCanceledPhases(); - var hasFailure = hasTestFailures || hasFailedTasks || hasCanceledPhases; - if ((sendMailCondition == SendMailCondition_1.SendMailCondition.OnFailure && hasFailure) - || (sendMailCondition == SendMailCondition_1.SendMailCondition.OnSuccess && !hasFailure)) { - shouldSendMail = true; - } - else if (sendMailCondition == SendMailCondition_1.SendMailCondition.OnNewFailuresOnly && hasFailure) { - // Always treat phase cancellation issues as new failure as we cannot distinguish/compare phase level issues - // Still compare failed tests and failed tasks where possible to reduce noise - if (hasCanceledPhases && !hasTestFailures && !hasFailedTasks) { - shouldSendMail = true; - console.log(`Has Phase cancellation(s) issues. Treating as new failure.`); - } - else { - console.log(`Looking for new failures, as the user send mail condition is '${EnumUtils_1.EnumUtils.GetMailConditionString(sendMailCondition)}'.`); - shouldSendMail = !(yield this.hasPreviousReleaseGotSameFailuresAsync(report, reportConfig.$pipelineConfiguration, hasTestFailures, hasFailedTasks)); - } - } - } - } - report.$sendMailConditionSatisfied = shouldSendMail; - return shouldSendMail; - }); - } - hasPreviousReleaseGotSameFailuresAsync(report, config, hasTestFailures, hasFailedTasks) { - return __awaiter(this, void 0, void 0, function* () { - var hasPrevGotSameFailures = report.hasPrevGotSameFailures(); - if (!util_1.isNullOrUndefined(hasPrevGotSameFailures) && hasPrevGotSameFailures) { - return hasPrevGotSameFailures; - } - const hasPrevFailedTasks = report.hasPrevFailedTasks(); - if (report.testResultSummary == null) { - return false; - } - if (hasTestFailures) { - var prevConfig = report.getPrevConfig(config); - if (util_1.isNullOrUndefined(prevConfig)) { - // we don't know anything about prev pipeline failures if we have no info - assume they are not same - return false; - } - var lastCompletedTestResultSummary = yield this.testResultsClient.queryTestResultsReportAsync(prevConfig); - var failedInCurrent = this.getFailureCountFromSummary(report.testResultSummary); - var failedinPrev = this.getFailureCountFromSummary(lastCompletedTestResultSummary); - // Threshold is 10 to decide whether they are same failures - console.log(`Current Failures Found: '${failedInCurrent}'.`); - console.log(`Previous Failures Found: '${failedinPrev}'.`); - var hasSameFailures = failedInCurrent == failedinPrev; - // No point in moving ahead if number of failures is different - if (hasSameFailures) { - var currFailedTestCaseRefIds = yield this.fetchFailedTestCaseIdsAsync(config); - var prevFailedTestCaseRefIds = yield this.fetchFailedTestCaseIdsAsync(prevConfig); - const leftJoin = currFailedTestCaseRefIds.filter(c => !prevFailedTestCaseRefIds.includes(c)); - if (leftJoin.length > 0) { - console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); - hasSameFailures = false; - } - else { - const rightJoin = prevFailedTestCaseRefIds.filter(p => !currFailedTestCaseRefIds.includes(p)); - if (rightJoin.length > 0) { - console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); - hasSameFailures = false; - } - else { - console.log(`Failed Test Reference Ids match. No new failures found.`); - hasSameFailures = true; - } - } - } - return hasSameFailures; - } - else if (hasFailedTasks && hasPrevFailedTasks) { - return report.arePrevFailedTasksSame(); - } - return false; - }); - } - getFailureCountFromSummary(testResultSummary) { - const failedOutcome = testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; - return !util_1.isNullOrUndefined(failedOutcome) ? failedOutcome.count : 0; - } - fetchFailedTestCaseIdsAsync(pipelineConfig) { - return __awaiter(this, void 0, void 0, function* () { - var testSummary = yield this.testResultsClient.getTestResultsDetailsAsync(null, [TestInterfaces_1.TestOutcome.Failed], pipelineConfig); - var resultsToQuery = []; - testSummary.resultsForGroup.forEach(r => resultsToQuery.push(...r.results)); - var testCaseIds = []; - if (resultsToQuery.length > 0) { - // API supports only 100 results at a time - const tasks = []; - for (let i = 0, j = resultsToQuery.length; i < j; i += 100) { - const tempArray = resultsToQuery.slice(i, i + 100); - let query = new AbstractTestResultsClient_1.TestResultsQueryImpl(); - query.fields = this.TestResultFieldsToQuery; - query.results = tempArray; - tasks.push(this.testResultsClient.getTestResultsByQueryAsync(query)); - } - const resultQueries = yield Promise.all(tasks); - resultQueries.forEach(rq => { - let tempIds = rq.results.filter(r => TcmHelper_1.TcmHelper.isTestFlaky(r)).map(r1 => r1.testCaseReferenceId); - testCaseIds.push(...tempIds); - }); - } - return testCaseIds; - }); - } -} -exports.SendMailConditionProcessor = SendMailConditionProcessor; -//# sourceMappingURL=SendMailConditionProcessor.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js.map deleted file mode 100644 index 113e7bc5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SendMailConditionProcessor.js","sourceRoot":"","sources":["SendMailConditionProcessor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js deleted file mode 100644 index 1e57f6fe..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AbstractTestResultsDetailsParser = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const util_1 = require("util"); -const TimeFormatter_1 = require("../../model/helpers/TimeFormatter"); -class AbstractTestResultsDetailsParser { - constructor(testResultDetails) { - this.testResultDetails = testResultDetails; - } - /// - /// Get Duration, TotalTests & test count by outcome - /// Calculating total duration, as the tcm data has duration by test outcome only. - /// - parseBaseData(resultsForGroup, summaryItem) { - let duration = 0; - for (let item in TestInterfaces_1.TestOutcome) { - if (!isNaN(Number(item))) { - const resultsByOutCome = resultsForGroup.resultsCountByOutcome[Number(item)]; - if (!util_1.isNullOrUndefined(resultsByOutCome)) { - summaryItem.$testCountByOutcome.set(resultsByOutCome.outcome, resultsByOutCome.count); - duration += TimeFormatter_1.TimeFormatter.ConvertTimeStringToMilliSeconds(resultsByOutCome.duration); - } - } - } - // // HACK - SHould get data directly from resultsGroup.resultsCountByOutcome - but that data is coming wrong - // resultsForGroup.results.forEach(r => { - // duration += isNaN(r.durationInMs) ? 0 : r.durationInMs; - // }); - summaryItem.$duration = duration; - summaryItem.$totalTestCount = resultsForGroup.results.length; - } -} -exports.AbstractTestResultsDetailsParser = AbstractTestResultsDetailsParser; -//# sourceMappingURL=AbstractTestResultsDetailsParser.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js.map deleted file mode 100644 index d2aa53e6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AbstractTestResultsDetailsParser.js","sourceRoot":"","sources":["AbstractTestResultsDetailsParser.ts"],"names":[],"mappings":";;;AAAA,oFAA0K;AAE1K,+BAAyC;AACzC,qEAAkE;AAElE,MAAsB,gCAAgC;IAIpD,YAAY,iBAAqC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAMD,aAAa;IACb,oDAAoD;IACpD,kFAAkF;IAClF,cAAc;IACJ,aAAa,CAAC,eAA2C,EAAE,WAAiC;QACpG,IAAI,QAAQ,GAAW,CAAC,CAAC;QACzB,KAAK,IAAI,IAAI,IAAI,4BAAW,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;gBACxB,MAAM,gBAAgB,GAAG,eAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7E,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,EAAE;oBACxC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACtF,QAAQ,IAAI,6BAAa,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;iBACtF;aACF;SACF;QAED,6GAA6G;QAC7G,yCAAyC;QACzC,4DAA4D;QAC5D,MAAM;QAEN,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC;QACjC,WAAW,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/D,CAAC;CAMF;AAzCD,4EAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js deleted file mode 100644 index 28109614..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultDetailsParserFactory = void 0; -const TestResultDetailsParserForRun_1 = require("./TestResultDetailsParserForRun"); -const TestResultDetailsParserForPriority_1 = require("./TestResultDetailsParserForPriority"); -const DataProviderError_1 = require("../../exceptions/DataProviderError"); -class TestResultDetailsParserFactory { - static getParser(resultDetails) { - var groupByField = resultDetails.groupByField; - if (groupByField.toLowerCase() == "TestRun".toLowerCase()) { - return new TestResultDetailsParserForRun_1.TestResultDetailsParserForRun(resultDetails); - } - if (groupByField.toLowerCase() == "Priority".toLowerCase()) { - return new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(resultDetails); - } - throw new DataProviderError_1.DataProviderError(`TestResultsDetails by group ${groupByField} not supported`); - } -} -exports.TestResultDetailsParserFactory = TestResultDetailsParserFactory; -//# sourceMappingURL=TestResultDetailsParserFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js.map deleted file mode 100644 index 391d7fbc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultDetailsParserFactory.js","sourceRoot":"","sources":["TestResultDetailsParserFactory.ts"],"names":[],"mappings":";;;AAEA,mFAAgF;AAChF,6FAA0F;AAC1F,0EAAuE;AAEvE,MAAa,8BAA8B;IAClC,MAAM,CAAC,SAAS,CAAC,aAAiC;QACvD,IAAI,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAC9C,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YACzD,OAAO,IAAI,6DAA6B,CAAC,aAAa,CAAC,CAAC;SACzD;QAED,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE;YAC1D,OAAO,IAAI,uEAAkC,CAAC,aAAa,CAAC,CAAC;SAC9D;QAED,MAAM,IAAI,qCAAiB,CAAC,+BAA+B,YAAY,gBAAgB,CAAC,CAAC;IAC3F,CAAC;CACF;AAbD,wEAaC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js deleted file mode 100644 index 24e313c8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js +++ /dev/null @@ -1,64 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultDetailsParserForPriority = void 0; -const AbstractTestResultsDetailsParser_1 = require("./AbstractTestResultsDetailsParser"); -const TestSummaryItemModel_1 = require("../../model/testresults/TestSummaryItemModel"); -const InvalidTestResultDataError_1 = require("../../exceptions/InvalidTestResultDataError"); -class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser_1.AbstractTestResultsDetailsParser { - constructor(testResultDetails) { - super(testResultDetails); - if (testResultDetails.groupByField.toUpperCase() != "Priority".toUpperCase()) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); - } - } - getSummaryItems() { - const resultsForGroup = this.testResultDetails.resultsForGroup; - if (resultsForGroup != null && resultsForGroup.length > 0) { - return resultsForGroup.map(group => { - var priority = this.getPriority(group.groupByValue); - var summaryItem = new TestSummaryItemModel_1.TestSummaryItemModel(priority.toString(), priority.toString()); - this.parseBaseData(group, summaryItem); - return summaryItem; - }); - } - return []; - } - getGroupByValue(group) { - return this.getPriority(group.groupByValue).toString(); - } - getTestResultsForRun(runId) { - const testResultsByPriority = this.getTestCountByPriorityInTestRun(); - return testResultsByPriority.has(runId) ? testResultsByPriority.get(runId) : new Map(); - } - getPriority(groupByValue) { - let priority = Number.parseInt(groupByValue); - if (priority == null || Number.isNaN(priority)) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected priority value to be integer in ${groupByValue}`); - } - return priority; - } - getTestCountByPriorityInTestRun() { - var testResultsByPriority = new Map(); - this.testResultDetails.resultsForGroup.forEach(testResultsByGroup => { - var priority = this.getPriority(testResultsByGroup.groupByValue); - testResultsByGroup.results.forEach(result => { - if (result.testRun == null) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Test run field is null in Test result object with test id - ${result.id}`); - } - const testRunId = Number.parseInt(result.testRun.id); - if (testRunId == null || Number.isNaN(testRunId)) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Unable to parse test run id to integer in ${result.testRun.id}`); - } - if (!testResultsByPriority.has(testRunId)) { - testResultsByPriority.set(testRunId, new Map()); - } - const resultsByPriorityForRun = testResultsByPriority.get(testRunId); - var testCountByPriority = resultsByPriorityForRun.has(priority) ? resultsByPriorityForRun.get(priority) : 0; - resultsByPriorityForRun.set(priority, testCountByPriority + 1); - }); - }); - return testResultsByPriority; - } -} -exports.TestResultDetailsParserForPriority = TestResultDetailsParserForPriority; -//# sourceMappingURL=TestResultDetailsParserForPriority.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js.map deleted file mode 100644 index 3fa90f2c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultDetailsParserForPriority.js","sourceRoot":"","sources":["TestResultDetailsParserForPriority.ts"],"names":[],"mappings":";;;AAAA,yFAAsF;AACtF,uFAAoF;AAEpF,4FAAyF;AAEzF,MAAa,kCAAmC,SAAQ,mEAAgC;IAEtF,YAAY,iBAAqC;QAC/C,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzB,IAAI,iBAAiB,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE;YAC5E,MAAM,IAAI,uDAA0B,CAAC,6DAA6D,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC;SACrI;IACH,CAAC;IAEM,eAAe;QACpB,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC;QAC/D,IAAI,eAAe,IAAI,IAAI,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;YACzD,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBACjC,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACpD,IAAI,WAAW,GAAG,IAAI,2CAAoB,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAErF,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBACvC,OAAO,WAAW,CAAC;YACrB,CAAC,CAAC,CAAC;SACJ;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,eAAe,CAAC,KAAiC;QACtD,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC;IAEM,oBAAoB,CAAC,KAAa;QACvC,MAAM,qBAAqB,GAAqC,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACvG,OAAO,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAkB,CAAC;IACzG,CAAC;IAEO,WAAW,CAAC,YAAiB;QACnC,IAAI,QAAQ,GAAW,MAAM,CAAC,QAAQ,CAAC,YAAsB,CAAC,CAAC;QAC/D,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YAC9C,MAAM,IAAI,uDAA0B,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;SAClG;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,+BAA+B;QACrC,IAAI,qBAAqB,GAAG,IAAI,GAAG,EAA+B,CAAC;QAEnE,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;YAClE,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAEjE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBAC1C,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;oBAC1B,MAAM,IAAI,uDAA0B,CAAC,+DAA+D,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;iBAClH;gBAED,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACrD,IAAI,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;oBAChD,MAAM,IAAI,uDAA0B,CAAC,6CAA6C,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;iBACxG;gBAED,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;oBACzC,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAkB,CAAC,CAAC;iBACjE;gBAED,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACrE,IAAI,mBAAmB,GAAG,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5G,uBAAuB,CAAC,GAAG,CAAC,QAAQ,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,qBAAqB,CAAC;IAC/B,CAAC;CAEF;AAtED,gFAsEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js deleted file mode 100644 index 100ed24f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestRunInfo = exports.TestResultDetailsParserForRun = void 0; -const AbstractTestResultsDetailsParser_1 = require("./AbstractTestResultsDetailsParser"); -const TestSummaryItemModel_1 = require("../../model/testresults/TestSummaryItemModel"); -const InvalidTestResultDataError_1 = require("../../exceptions/InvalidTestResultDataError"); -class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser_1.AbstractTestResultsDetailsParser { - constructor(testResultDetails) { - super(testResultDetails); - if (testResultDetails.groupByField.toUpperCase() != "TestRun".toUpperCase()) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); - } - } - getSummaryItems() { - return this.testResultDetails.resultsForGroup.map(r => this.getTestRunSummaryInfo(r)); - } - getGroupByValue(group) { - const runinfo = this.readGroupByValue(group); - return runinfo.name; - } - getTestRunSummaryInfo(resultsForGroup) { - console.log(`Getting Test summary data for test run - ${resultsForGroup.groupByValue.name}`); - const runinfo = this.readGroupByValue(resultsForGroup); - var summaryItem = new TestSummaryItemModel_1.TestSummaryItemModel(runinfo.name == null ? runinfo.id.toString() : runinfo.name, runinfo.id.toString()); - this.parseBaseData(resultsForGroup, summaryItem); - return summaryItem; - } - readGroupByValue(resultsForGroup) { - const runinfo = new TestRunInfo(); - runinfo.id = resultsForGroup.groupByValue.id; - runinfo.name = resultsForGroup.groupByValue.name; - return runinfo; - } -} -exports.TestResultDetailsParserForRun = TestResultDetailsParserForRun; -class TestRunInfo { -} -exports.TestRunInfo = TestRunInfo; -//# sourceMappingURL=TestResultDetailsParserForRun.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js.map deleted file mode 100644 index 3e9c3db0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultDetailsParserForRun.js","sourceRoot":"","sources":["TestResultDetailsParserForRun.ts"],"names":[],"mappings":";;;AAAA,yFAAsF;AACtF,uFAAoF;AAEpF,4FAAyF;AAEzF,MAAa,6BAA8B,SAAQ,mEAAgC;IAEjF,YAAY,iBAAqC;QAC/C,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzB,IAAI,iBAAiB,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YAC3E,MAAM,IAAI,uDAA0B,CAAC,6DAA6D,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC;SACrI;IACH,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IAEM,eAAe,CAAC,KAAiC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAEO,qBAAqB,CAAC,eAA2C;QACvE,OAAO,CAAC,GAAG,CAAC,4CAA4C,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAEvD,IAAI,WAAW,GAAG,IAAI,2CAAoB,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE/H,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAEjD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,gBAAgB,CAAC,eAA2C;QAClE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAnCD,sEAmCC;AAED,MAAa,WAAW;CAIvB;AAJD,kCAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js deleted file mode 100644 index a5a4f067..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js +++ /dev/null @@ -1,101 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildDataProvider = void 0; -const PipelineNotFoundError_1 = require("../../exceptions/PipelineNotFoundError"); -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const PhaseModel_1 = require("../../model/PhaseModel"); -const JobModel_1 = require("../../model/JobModel"); -const TaskModel_1 = require("../../model/TaskModel"); -const IssueModel_1 = require("../../model/IssueModel"); -const ReportFactory_1 = require("../../model/ReportFactory"); -const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); -const util_1 = require("util"); -const RetryablePromise_1 = require("../restclients/RetryablePromise"); -const DataProviderError_1 = require("../../exceptions/DataProviderError"); -class BuildDataProvider { - constructor(pipelineRestClient) { - this.pipelineRestClient = pipelineRestClient; - } - getReportDataAsync(pipelineConfig, reportDataConfiguration) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - const build = yield this.getBuildAsync(pipelineConfig); - if (build == null) { - throw new PipelineNotFoundError_1.PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); - } - const timeline = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineTimelineAsync(build.id); }), "GetBuildTimeline"); - const changes = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineChangesAsync(build.id); }), "GetPipelineChanges"); - const phases = this.getPhases(timeline); - const lastCompletedBuild = yield this.pipelineRestClient.getLastPipelineAsync(build.definition.id, null, build.sourceBranch); - const lastCompletedTimeline = lastCompletedBuild != null ? yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineTimelineAsync(lastCompletedBuild.id); }), "GetLastCompletedTimeline") : null; - console.log("Fetched release data"); - report.setBuildData(build, timeline, lastCompletedBuild, lastCompletedTimeline, phases, changes); - return report; - }); - } - getBuildAsync(pipelineConfig) { - return __awaiter(this, void 0, void 0, function* () { - var build = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineAsync(); }), "GetPipeline"); - if (util_1.isNullOrUndefined(build)) { - throw new DataProviderError_1.DataProviderError(`Unable to find build with id: ${pipelineConfig.$pipelineId}`); - } - return build; - }); - } - getPhases(timeline) { - const records = timeline.records.sort((a, b) => this.getOrder(a) - this.getOrder(b)); - const phases = records.filter(r => r.type == "Phase"); - if (phases.length > 0) { - const jobs = records.filter(r => r.type == "Job"); - if (jobs.length > 0) { - const tasks = records.filter(r => r.type == "Task"); - const phaseModels = phases.map(phase => { - const jobModels = jobs - .filter(j => j.parentId == phase.id) - .map(j => { - const tasksForThisJob = tasks.filter(t => t.parentId == j.id); - const taskModels = tasksForThisJob.map(task => { - const issues = util_1.isNullOrUndefined(task.issues) || task.issues.length < 1 ? [] : - task.issues.map(i => new IssueModel_1.IssueModel(i.type == BuildInterfaces_1.IssueType.Error ? "Error" : "Warning", i.message)); - return new TaskModel_1.TaskModel(task.name, this.getTaskState(task.result), issues, task.workerName, task.finishTime, task.startTime); - }); - return new JobModel_1.JobModel(j.name, this.getTaskState(j.result), [], taskModels); - }); - return new PhaseModel_1.PhaseModel(phase.name, jobModels, util_1.isNullOrUndefined(phase.result) ? "Unknown" : phase.result.toString(), this.getOrder(phase)); - }); - return phaseModels; - } - } - return []; - } - getTaskState(result) { - switch (result) { - case BuildInterfaces_1.TaskResult.Succeeded: - return ReleaseInterfaces_1.TaskStatus.Succeeded; - case BuildInterfaces_1.TaskResult.SucceededWithIssues: - return ReleaseInterfaces_1.TaskStatus.PartiallySucceeded; - case BuildInterfaces_1.TaskResult.Failed: - return ReleaseInterfaces_1.TaskStatus.Failed; - case BuildInterfaces_1.TaskResult.Canceled: - return ReleaseInterfaces_1.TaskStatus.Canceled; - case BuildInterfaces_1.TaskResult.Skipped: - return ReleaseInterfaces_1.TaskStatus.Skipped; - default: - return ReleaseInterfaces_1.TaskStatus.Unknown; - } - } - getOrder(timelineRecord) { - return util_1.isNullOrUndefined(timelineRecord.order) ? 0 : timelineRecord.order; - } -} -exports.BuildDataProvider = BuildDataProvider; -//# sourceMappingURL=BuildDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js.map deleted file mode 100644 index 8f9239be..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildDataProvider.js","sourceRoot":"","sources":["BuildDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js deleted file mode 100644 index e6f2cf14..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js +++ /dev/null @@ -1,116 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseDataProvider = void 0; -const PipelineNotFoundError_1 = require("../../exceptions/PipelineNotFoundError"); -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const DataProviderError_1 = require("../../exceptions/DataProviderError"); -const PhaseModel_1 = require("../../model/PhaseModel"); -const EnvironmentExtensions_1 = require("../../utils/EnvironmentExtensions"); -const JobModel_1 = require("../../model/JobModel"); -const TaskModel_1 = require("../../model/TaskModel"); -const IssueModel_1 = require("../../model/IssueModel"); -const ReportFactory_1 = require("../../model/ReportFactory"); -const RetryablePromise_1 = require("../restclients/RetryablePromise"); -const util_1 = require("util"); -class ReleaseDataProvider { - constructor(pipelineRestClient) { - this.pipelineRestClient = pipelineRestClient; - } - getReportDataAsync(pipelineConfig, reportDataConfiguration) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - const release = yield this.getReleaseAsync(pipelineConfig); - if (release == null) { - throw new PipelineNotFoundError_1.PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); - } - const environment = this.getEnvironment(release, pipelineConfig); - const phases = this.getPhases(environment); - const lastCompletedRelease = yield this.getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment); - let changes = []; - // check if last completed one isn't latter one, then changes don't make sense - if (lastCompletedRelease != null && lastCompletedRelease.id < release.id) { - console.log(`Getting changes between releases ${release.id} & ${lastCompletedRelease.id}`); - try { - changes = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineChangesAsync(lastCompletedRelease.id); }), "GetPipelineChanges"); - } - catch (err) { - // Changes happened in current release w.r.t previous one isn't strictly required to send mail - ignoring any errors - console.warn(`Error while comparing current release - '${release.id}' with previous one - '${lastCompletedRelease.id}': ${err}`); - } - } - else { - console.log("Unable to find any last completed release"); - } - console.log("Fetched release data"); - report.setReleaseData(release, environment, lastCompletedRelease, phases, changes); - return report; - }); - } - getReleaseAsync(pipelineConfig) { - return __awaiter(this, void 0, void 0, function* () { - var release = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineAsync(); }), "GetPipeline"); - if (util_1.isNullOrUndefined(release)) { - throw new DataProviderError_1.DataProviderError(`Unable to find release with release id: ${pipelineConfig.$pipelineId}`); - } - return release; - }); - } - getEnvironment(release, pipelineConfig) { - let environment; - const environments = release.environments; - for (var i = 0; i < environments.length; i++) { - if (environments[i].id == pipelineConfig.$environmentId) { - environment = environments[i]; - break; - } - } - if (pipelineConfig.$usePreviousEnvironment && environments.indexOf(environment) > 0) { - environment = environments[environments.indexOf(environment) - 1]; - } - if (environment != null) { - return environment; - } - throw new DataProviderError_1.DataProviderError(`Unable to find environment with environment id - ${pipelineConfig.$environmentId} in release - ${release.id}`); - } - getPhases(environment) { - var releaseDeployPhases = EnvironmentExtensions_1.EnvironmentExtensions.getPhases(environment); - return releaseDeployPhases.map(r => new PhaseModel_1.PhaseModel(r.name, this.getJobModelsFromPhase(r.deploymentJobs), ReleaseInterfaces_1.DeployPhaseStatus[r.status], r.rank)); - } - getJobModelsFromPhase(deploymentJobs) { - const jobModels = deploymentJobs.map(job => { - const issues = job.job.issues.map(i => new IssueModel_1.IssueModel(i.issueType, i.message)); - const tasks = job.tasks.map(t => { - const issues = t.issues.map(i => new IssueModel_1.IssueModel(i.issueType, i.message)); - return new TaskModel_1.TaskModel(t.name, t.status, issues, t.agentName, t.finishTime, t.startTime); - }); - return new JobModel_1.JobModel(job.job.name, job.job.status, issues, tasks); - }); - return jobModels; - } - getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment) { - return __awaiter(this, void 0, void 0, function* () { - let branchId = null; - if (release.artifacts != null && release.artifacts.length > 0) { - const primaryArtifact = release.artifacts.filter(a => a.isPrimary)[0]; - const defRef = primaryArtifact.definitionReference["branch"]; - branchId = defRef != null ? defRef.id : null; - } - console.log(`Fetching last release by completed environment id - ${pipelineConfig.$environmentId} and branch id ${branchId}`); - const lastRelease = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { - return this.pipelineRestClient.getLastPipelineAsync(release.releaseDefinition.id, environment.definitionEnvironmentId, branchId, null); - }), "GetLastCompletedPipeline"); //Bug in API - release.createdOn); - return lastRelease; - }); - } -} -exports.ReleaseDataProvider = ReleaseDataProvider; -//# sourceMappingURL=ReleaseDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js.map deleted file mode 100644 index 6ea3a56a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseDataProvider.js","sourceRoot":"","sources":["ReleaseDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js deleted file mode 100644 index 6b4925cb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AbstractClient = void 0; -const azure_devops_node_api_1 = require("azure-devops-node-api"); -class AbstractClient { - constructor(pipelineConfig) { - this.connection = this.createConnection(pipelineConfig.$teamUri, pipelineConfig.$accessKey); - this.pipelineConfig = pipelineConfig; - } - /** - * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api - * @param uri Default URL - * @param accessToken token to get credentials with access to Api calls - */ - createConnection(uri, accessToken) { - const creds = azure_devops_node_api_1.getPersonalAccessTokenHandler(accessToken); - return new azure_devops_node_api_1.WebApi(uri, creds); - } -} -exports.AbstractClient = AbstractClient; -//# sourceMappingURL=AbstractClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js.map deleted file mode 100644 index 4680d5a2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AbstractClient.js","sourceRoot":"","sources":["AbstractClient.ts"],"names":[],"mappings":";;;AACA,iEAG+B;AAG/B,MAAsB,cAAc;IAKlC,YAAY,cAAqC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5F,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CAAC,GAAW,EAAE,WAAmB;QACvD,MAAM,KAAK,GAAG,qDAA6B,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,IAAI,8BAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;CACF;AAnBD,wCAmBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js deleted file mode 100644 index 710c8de9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js +++ /dev/null @@ -1,104 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsQueryImpl = exports.AbstractTestResultsClient = void 0; -const AbstractClient_1 = require("./AbstractClient"); -const RetryablePromise_1 = require("./RetryablePromise"); -class AbstractTestResultsClient extends AbstractClient_1.AbstractClient { - constructor(pipelineConfig) { - super(pipelineConfig); - this.MaxItemsSupported = 100; - this.testApiPromise = this.connection.getTestApi(); - } - queryTestResultBugs(automatedTestName, resultId) { - return __awaiter(this, void 0, void 0, function* () { - const testApi = yield this.testApiPromise; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { - return testApi.queryTestResultWorkItems(this.pipelineConfig.$projectName, "Microsoft.BugCategory", automatedTestName, resultId); - }), "QueryTestResultBugs"); - }); - } - getTestResultById(testRunId, resultId) { - return __awaiter(this, void 0, void 0, function* () { - const testApi = yield this.testApiPromise; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return testApi.getTestResultById(this.pipelineConfig.$projectName, testRunId, resultId); }), "GetTestResultById"); - }); - } - queryTestResultsReportAsync(parameterConfig = null) { - return __awaiter(this, void 0, void 0, function* () { - const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.queryTestResultsReportForPipelineAsync(config); }), "QueryTestResultsReport"); - }); - } - getTestResultOwnersAsync(resultsToFetch) { - return __awaiter(this, void 0, void 0, function* () { - var query = new TestResultsQueryImpl(); - query.fields = ["Owner"]; - const results = []; - const testApi = yield this.testApiPromise; - for (let i = 0, j = resultsToFetch.length; i < j; i += this.MaxItemsSupported) { - const tempArray = resultsToFetch.slice(i, i + this.MaxItemsSupported); - query.results = tempArray; - let queryResult = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return testApi.getTestResultsByQuery(query, this.pipelineConfig.$projectName); }), "GetTestResultOwners"); - results.push(...queryResult.results); - } - const ownerMap = new Map(); - results.forEach(r => { - if (this.isValid(r.owner)) { - const key = this.getUniqueName(r.owner); - if (!ownerMap.has(key)) { - ownerMap.set(key, r.owner); - } - } - }); - const identities = []; - ownerMap.forEach((value, key) => identities.push(value)); - return identities; - }); - } - getTestResultsDetailsAsync(groupBy, outcomeFilters, parameterConfig = null) { - return __awaiter(this, void 0, void 0, function* () { - const filter = this.getOutcomeFilter(outcomeFilters); - const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.getTestResultsDetailsForPipelineAsync(config, groupBy, filter); }), "GetTestResultsDetails"); - }); - } - getTestResultSummaryAsync(includeFailures, parameterConfig = null) { - return __awaiter(this, void 0, void 0, function* () { - const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.queryTestResultsReportForPipelineAsync(config, includeFailures); }), "GetTestResultSummary"); - }); - } - getTestResultsByQueryAsync(query) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).getTestResultsByQuery(query, this.pipelineConfig.$projectId); - }); - } - getOutcomeFilter(outcomes) { - let filter = null; - if (outcomes != null && outcomes.length > 0) { - const outComeString = Array.from(new Set(outcomes.map(o => Number(o)))).join(","); - filter = `Outcome eq ${outComeString}`; - } - return filter; - } - getUniqueName(identity) { - return identity.uniqueName == null ? identity.displayName : identity.uniqueName; - } - isValid(identity) { - return identity != null && (identity.displayName != null || identity.uniqueName != null); - } -} -exports.AbstractTestResultsClient = AbstractTestResultsClient; -class TestResultsQueryImpl { -} -exports.TestResultsQueryImpl = TestResultsQueryImpl; -//# sourceMappingURL=AbstractTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js.map deleted file mode 100644 index 5e8d40ff..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AbstractTestResultsClient.js","sourceRoot":"","sources":["AbstractTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkD;AAMlD,yDAAsD;AAEtD,MAAsB,yBAA0B,SAAQ,+BAAc;IAKpE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QAJP,sBAAiB,GAAW,GAAG,CAAC;QAK/C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;IACrD,CAAC;IAEY,mBAAmB,CAAC,iBAAyB,EAAE,QAAgB;;YAC1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1C,OAAO,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE;gBAAC,OAAA,OAAO,CAAC,wBAAwB,CACnF,IAAI,CAAC,cAAc,CAAC,YAAY,EAChC,uBAAuB,EACvB,iBAAiB,EACjB,QAAQ,CACT,CAAA;cAAA,EAAE,qBAAqB,CAAC,CAAC;QAC5B,CAAC;KAAA;IAEY,iBAAiB,CAAC,SAAiB,EAAE,QAAgB;;YAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1C,OAAO,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA,GAAA,EAAE,mBAAmB,CAAC,CAAC;QAC9J,CAAC;KAAA;IAEY,2BAA2B,CAAC,kBAAyC,IAAI;;YACpF,MAAM,MAAM,GAAG,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;YAC/E,OAAO,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,IAAI,CAAC,sCAAsC,CAAC,MAAM,CAAC,CAAA,GAAA,EAAE,wBAAwB,CAAC,CAAC;QACtI,CAAC;KAAA;IAEY,wBAAwB,CAAC,cAAgC;;YACpE,IAAI,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAC;YACvC,KAAK,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;YAEzB,MAAM,OAAO,GAAqB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBAC7E,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACtE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;gBAC1B,IAAI,WAAW,GAAqB,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,OAAO,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA,GAAA,EAAE,qBAAqB,CAAC,CAAC;gBACjL,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;aACtC;YAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;YAChD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClB,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;oBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;qBAC5B;iBACF;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAkB,EAAE,CAAC;YACrC,QAAQ,CAAC,OAAO,CAAE,CAAC,KAAkB,EAAE,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/E,OAAO,UAAU,CAAC;QACpB,CAAC;KAAA;IAEY,0BAA0B,CAAC,OAAe,EAAE,cAA8B,EAAE,kBAAyC,IAAI;;YACpI,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;YAC/E,OAAO,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,IAAI,CAAC,qCAAqC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA,GAAA,EAAE,uBAAuB,CAAC,CAAC;QACrJ,CAAC;KAAA;IAEY,yBAAyB,CAAC,eAAwB,EAAE,kBAAyC,IAAI;;YAC5G,MAAM,MAAM,GAAG,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;YAC/E,OAAO,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,IAAI,CAAC,sCAAsC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA,GAAA,EAAE,sBAAsB,CAAC,CAAC;QACrJ,CAAC;KAAA;IAEY,0BAA0B,CAAC,KAAuB;;YAC7D,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACxG,CAAC;KAAA;IAKS,gBAAgB,CAAC,QAAuB;QAChD,IAAI,MAAM,GAAW,IAAI,CAAC;QAC1B,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClF,MAAM,GAAG,cAAc,aAAa,EAAE,CAAC;SACxC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,aAAa,CAAC,QAAqB;QACzC,OAAO,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;IAClF,CAAC;IAEO,OAAO,CAAC,QAAqB;QACnC,OAAO,QAAQ,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,IAAI,IAAI,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;IAC3F,CAAC;CACF;AA5FD,8DA4FC;AAED,MAAa,oBAAoB;CAIhC;AAJD,oDAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js deleted file mode 100644 index 57849fc2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js +++ /dev/null @@ -1,53 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildRestClient = void 0; -const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); -const ChangeModel_1 = require("../../model/ChangeModel"); -const AbstractClient_1 = require("./AbstractClient"); -class BuildRestClient extends AbstractClient_1.AbstractClient { - constructor(pipelineConfig) { - super(pipelineConfig); - this.buildApi = this.connection.getBuildApi(); - } - getPipelineAsync() { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.buildApi).getBuild(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); - }); - } - getLastPipelineAsync(pipelineDefId, envDefId, sourceBranchFilter, maxCreatedDate) { - return __awaiter(this, void 0, void 0, function* () { - const builds = yield (yield this.buildApi).getBuilds(this.pipelineConfig.$projectId, [pipelineDefId], null, null, null, maxCreatedDate, null, null, null, BuildInterfaces_1.BuildResult.Succeeded | BuildInterfaces_1.BuildResult.PartiallySucceeded | BuildInterfaces_1.BuildResult.Failed | BuildInterfaces_1.BuildResult.Canceled, null, null, 1, null, null, null, BuildInterfaces_1.BuildQueryOrder.FinishTimeDescending, sourceBranchFilter); - if (builds != null && builds.length > 0) { - return builds[0]; - } - console.log(`Unable to find any build for definition id - ${pipelineDefId}`); - return null; - }); - } - getPipelineChangesAsync(prevPipelineId) { - return __awaiter(this, void 0, void 0, function* () { - const changes = yield (yield this.buildApi).getBuildChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); - if (changes == null || changes.length < 1) { - console.log(`No changes found for pipelineId - ${this.pipelineConfig.$pipelineId}`); - return []; - } - return changes.map(item => new ChangeModel_1.ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); - }); - } - getPipelineTimelineAsync(pipelineId) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.buildApi).getBuildTimeline(this.pipelineConfig.$projectId, pipelineId); - }); - } -} -exports.BuildRestClient = BuildRestClient; -//# sourceMappingURL=BuildClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js.map deleted file mode 100644 index ce1c3b65..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildClient.js","sourceRoot":"","sources":["BuildClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,sFAAiH;AACjH,yDAAsD;AACtD,qDAAkD;AAGlD,MAAa,eAAgB,SAAQ,+BAAc;IAIjD,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAEY,gBAAgB;;YAC3B,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC/G,CAAC;KAAA;IAEY,oBAAoB,CAAC,aAAqB,EAAE,QAAgB,EAAE,kBAA0B,EAAE,cAAqB;;YAC1H,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAClD,IAAI,CAAC,cAAc,CAAC,UAAU,EAC9B,CAAC,aAAa,CAAC,EACf,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,6BAAW,CAAC,SAAS,GAAG,6BAAW,CAAC,kBAAkB,GAAG,6BAAW,CAAC,MAAM,GAAG,6BAAW,CAAC,QAAQ,EAClG,IAAI,EACJ,IAAI,EACJ,CAAC,EACD,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,iCAAe,CAAC,oBAAoB,EACpC,kBAAkB,CAAC,CAAC;YACtB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;aAClB;YACD,OAAO,CAAC,GAAG,CAAC,gDAAgD,aAAa,EAAE,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEY,uBAAuB,CAAC,cAAsB;;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC7H,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpF,OAAO,EAAE,CAAC;aACX;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,yBAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjH,CAAC;KAAA;IAEY,wBAAwB,CAAC,UAAkB;;YACtD,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClG,CAAC;KAAA;CACF;AApDD,0CAoDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js deleted file mode 100644 index 8bbc626c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildTestResultsClient = void 0; -const AbstractTestResultsClient_1 = require("./AbstractTestResultsClient"); -class BuildTestResultsClient extends AbstractTestResultsClient_1.AbstractTestResultsClient { - constructor(pipelineConfig) { - super(pipelineConfig); - } - queryTestResultsReportForPipelineAsync(config, includeFailures) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).queryTestResultsReportForBuild(config.$projectName, config.$pipelineId, null, includeFailures); - }); - } - getTestResultsDetailsForPipelineAsync(config, groupBy, filter) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).getTestResultDetailsForBuild(config.$projectName, config.$pipelineId, null, groupBy, filter); - }); - } -} -exports.BuildTestResultsClient = BuildTestResultsClient; -//# sourceMappingURL=BuildTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js.map deleted file mode 100644 index 9d63a129..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildTestResultsClient.js","sourceRoot":"","sources":["BuildTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2EAAwE;AAExE,MAAa,sBAAuB,SAAQ,qDAAyB;IAEnE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAEY,sCAAsC,CAAC,MAA6B,EAAE,eAAyB;;YAC1G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,8BAA8B,CACrE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,IAAI,EACJ,eAAe,CAAC,CAAC;QACrB,CAAC;KAAA;IAEY,qCAAqC,CAAC,MAA6B,EAAE,OAAgB,EAAE,MAAe;;YACjH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,4BAA4B,CACnE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,IAAI,EACJ,OAAO,EACP,MAAM,CAAC,CAAC;QACZ,CAAC;KAAA;CACF;AAtBD,wDAsBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js deleted file mode 100644 index 84a6db77..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IPipelineRestClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js.map deleted file mode 100644 index cd6b91b4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IPipelineRestClient.js","sourceRoot":"","sources":["IPipelineRestClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js deleted file mode 100644 index b07895ab..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=ITestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js.map deleted file mode 100644 index 79df6b69..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ITestResultsClient.js","sourceRoot":"","sources":["ITestResultsClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js deleted file mode 100644 index 058bea92..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IWorkItemClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js.map deleted file mode 100644 index 37f3ef71..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IWorkItemClient.js","sourceRoot":"","sources":["IWorkItemClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js deleted file mode 100644 index 89c786bb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js +++ /dev/null @@ -1,68 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseRestClient = void 0; -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const AbstractClient_1 = require("./AbstractClient"); -const ChangeModel_1 = require("../../model/ChangeModel"); -const util_1 = require("util"); -class ReleaseRestClient extends AbstractClient_1.AbstractClient { - constructor(pipelineConfig) { - super(pipelineConfig); - } - getPipelineAsync() { - return __awaiter(this, void 0, void 0, function* () { - return (yield this.connection.getReleaseApi()).getRelease(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); - }); - } - getLastPipelineAsync(pipelineDefId, envDefId, sourceBranchFilter, maxCreatedDate) { - return __awaiter(this, void 0, void 0, function* () { - const releaseApi = yield this.connection.getReleaseApi(); - let lastRelease = null; - const releaseStatusFilter = ReleaseInterfaces_1.ReleaseStatus.Active; - const envStatusFilter = ReleaseInterfaces_1.EnvironmentStatus.Succeeded | ReleaseInterfaces_1.EnvironmentStatus.PartiallySucceeded | ReleaseInterfaces_1.EnvironmentStatus.Rejected | ReleaseInterfaces_1.EnvironmentStatus.Canceled; - const releases = yield releaseApi.getReleases(this.pipelineConfig.$projectId, pipelineDefId, envDefId, null, null, releaseStatusFilter, envStatusFilter, null, maxCreatedDate, ReleaseInterfaces_1.ReleaseQueryOrder.Descending, null, null, ReleaseInterfaces_1.ReleaseExpands.Environments, null, null, null, sourceBranchFilter); - if (!util_1.isNullOrUndefined(releases) && releases.length > 0) { - // Ideally, first one should be last completed one. Unless someone's running the report after the release has completed for some reason. - console.log(`Considering one of [${releases.map(r => r.id).join(",")}] as previous completed release for ${this.pipelineConfig.$pipelineId}`); - for (let i = 0; i < releases.length; i++) { - if (releases[i].id < this.pipelineConfig.$pipelineId) { - lastRelease = releases[i]; - break; - } - } - } - if (util_1.isNullOrUndefined(lastRelease)) { - console.log(`Unable to fetch last completed release for release definition:${pipelineDefId} and environmentid: ${envDefId}`); - } - else if (lastRelease.id < this.pipelineConfig.$pipelineId) { - return yield releaseApi.getRelease(this.pipelineConfig.$projectId, lastRelease.id); - } - return lastRelease; - }); - } - getPipelineChangesAsync(prevPipelineId) { - return __awaiter(this, void 0, void 0, function* () { - console.log(`Fetching changes between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); - const changes = yield (yield this.connection.getReleaseApi()).getReleaseChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId, prevPipelineId); - if (changes == null || changes.length < 1) { - console.log(`No changes found between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); - return []; - } - return changes.map(item => new ChangeModel_1.ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); - }); - } - getPipelineTimelineAsync(pipelineId) { - throw new Error("Method not supported."); - } -} -exports.ReleaseRestClient = ReleaseRestClient; -//# sourceMappingURL=ReleaseClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js.map deleted file mode 100644 index 1c5d68f8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseClient.js","sourceRoot":"","sources":["ReleaseClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js deleted file mode 100644 index 0550db87..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseTestResultsClient = void 0; -const AbstractTestResultsClient_1 = require("./AbstractTestResultsClient"); -class ReleaseTestResultsClient extends AbstractTestResultsClient_1.AbstractTestResultsClient { - constructor(pipelineConfig) { - super(pipelineConfig); - } - queryTestResultsReportForPipelineAsync(config, includeFailures) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).queryTestResultsReportForRelease(config.$projectName, config.$pipelineId, config.$environmentId, null, includeFailures); - }); - } - getTestResultsDetailsForPipelineAsync(config, groupBy, filter) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).getTestResultDetailsForRelease(config.$projectName, config.$pipelineId, config.$environmentId, null, groupBy, filter); - }); - } -} -exports.ReleaseTestResultsClient = ReleaseTestResultsClient; -//# sourceMappingURL=ReleaseTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js.map deleted file mode 100644 index 2ea0d33f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseTestResultsClient.js","sourceRoot":"","sources":["ReleaseTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2EAAwE;AAExE,MAAa,wBAAyB,SAAQ,qDAAyB;IAErE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAEY,sCAAsC,CAAC,MAA6B,EAAE,eAAyB;;YAC1G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,gCAAgC,CACvE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,eAAe,CAAC,CAAC;QACrB,CAAC;KAAA;IAEY,qCAAqC,CAAC,MAA6B,EAAE,OAAgB,EAAE,MAAe;;YACjH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,8BAA8B,CACrE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,OAAO,EACP,MAAM,CAAC,CAAC;QACZ,CAAC;KAAA;CACF;AAxBD,4DAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js deleted file mode 100644 index 3f13ad1e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RetryablePromise = void 0; -const TelemetryLogger_1 = require("../../telemetry/TelemetryLogger"); -const now = require('performance-now'); -class RetryablePromise { - static RetryAsync(executor, executorName, times = this.defaultRetryCount) { - return __awaiter(this, void 0, void 0, function* () { - const perfStart = now(); - let attemptNumber = 1; - let lastError; - try { - do { - try { - let returnVal = yield executor(); - if (attemptNumber > 1) { - console.log(`Completed on Retry attempt: ${attemptNumber}`); - } - return returnVal; - } - catch (err) { - lastError = err; - console.log(`Retry <${executorName}>: ${attemptNumber} : ${err}`); - } - attemptNumber++; - } while (attemptNumber <= times); - console.log(`All Retries exhausted. Throwing error: ${lastError}`); - throw lastError; - } - finally { - if (attemptNumber > 1) { - // Log time taken after all retries - TelemetryLogger_1.TelemetryLogger.LogModulePerf(executorName, now() - perfStart); - } - } - }); - } -} -exports.RetryablePromise = RetryablePromise; -RetryablePromise.defaultRetryCount = 3; -//# sourceMappingURL=RetryablePromise.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js.map deleted file mode 100644 index fcc42ea8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"RetryablePromise.js","sourceRoot":"","sources":["RetryablePromise.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qEAAkE;AAClE,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAa,gBAAgB;IAIlB,MAAM,CAAO,UAAU,CAAI,QAA0B,EAAE,YAAoB,EAAE,QAAgB,IAAI,CAAC,iBAAiB;;YACtH,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACxB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,SAAgB,CAAC;YACrB,IAAI;gBACA,GAAG;oBACC,IAAI;wBACA,IAAI,SAAS,GAAG,MAAM,QAAQ,EAAE,CAAC;wBACjC,IAAI,aAAa,GAAG,CAAC,EAAE;4BACnB,OAAO,CAAC,GAAG,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;yBAC/D;wBACD,OAAO,SAAS,CAAC;qBACpB;oBACD,OAAO,GAAG,EAAE;wBACR,SAAS,GAAG,GAAG,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,UAAU,YAAY,MAAM,aAAa,MAAM,GAAG,EAAE,CAAC,CAAC;qBACrE;oBACD,aAAa,EAAE,CAAC;iBACnB,QAAQ,aAAa,IAAI,KAAK,EAAE;gBAEjC,OAAO,CAAC,GAAG,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;gBACnE,MAAM,SAAS,CAAC;aACnB;oBACO;gBACJ,IAAI,aAAa,GAAG,CAAC,EAAE;oBACnB,mCAAmC;oBACnC,iCAAe,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;iBAClE;aACJ;QACL,CAAC;KAAA;;AAjCL,4CAkCC;AAhCkB,kCAAiB,GAAW,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js deleted file mode 100644 index bcff8bf2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.WorkItemClient = void 0; -const AbstractClient_1 = require("./AbstractClient"); -class WorkItemClient extends AbstractClient_1.AbstractClient { - constructor(pipelineConfig) { - super(pipelineConfig); - this.workApiPromise = this.connection.getWorkItemTrackingApi(); - } - getWorkItemsAsync(workItemIds) { - return __awaiter(this, void 0, void 0, function* () { - const chunks = []; - var i, j, temparray, chunk = 100; - for (i = 0, j = workItemIds.length; i < j; i += chunk) { - temparray = workItemIds.slice(i, i + chunk); - chunks.push(temparray); - } - const workApi = yield this.workApiPromise; - const chunkResults = chunks.map(chunk => workApi.getWorkItems(chunk)); - const workItems = yield Promise.all(chunkResults); - const flatItemList = []; - workItems.forEach(wlist => flatItemList.push(...wlist)); - return flatItemList; - }); - } -} -exports.WorkItemClient = WorkItemClient; -//# sourceMappingURL=WorkItemClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js.map deleted file mode 100644 index 60fed502..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"WorkItemClient.js","sourceRoot":"","sources":["WorkItemClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkD;AAMlD,MAAa,cAAe,SAAQ,+BAAc;IAIhD,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC;IACjE,CAAC;IAEY,iBAAiB,CAAC,WAAqB;;YAElD,MAAM,MAAM,GAAe,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,GAAG,GAAG,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE;gBACrD,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aACxB;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,YAAY,GAAe,EAAE,CAAC;YACpC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACxD,OAAO,YAAY,CAAC;QACtB,CAAC;KAAA;CACF;AA1BD,wCA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js deleted file mode 100644 index 585e4aea..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TcmHelper = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -class TcmHelper { - static exceptOutcomes(outcomesToExclude) { - const otherOutComes = []; - for (let outcome in TestInterfaces_1.TestOutcome) { - var outcomeNum = Number(outcome); - if (!isNaN(outcomeNum) && !outcomesToExclude.includes(outcomeNum)) { - otherOutComes.push(outcomeNum); - } - } - return otherOutComes; - } - static parseOutcome(outcomeString) { - let result; - switch (outcomeString) { - case "Passed": - result = TestInterfaces_1.TestOutcome.Passed; - break; - case "Failed": - result = TestInterfaces_1.TestOutcome.Failed; - break; - case "Inconclusive": - result = TestInterfaces_1.TestOutcome.Inconclusive; - break; - case "NotExecuted": - result = TestInterfaces_1.TestOutcome.NotExecuted; - break; - default: - result = TestInterfaces_1.TestOutcome.None; - break; - } - return result; - } - static isTestFlaky(result) { - var outcomeConfidenceField = TcmHelper.getCustomField(result, "OutcomeConfidence"); - if (outcomeConfidenceField != null - && outcomeConfidenceField.value != null) { - const outcomeFieldValue = Number.parseFloat(outcomeConfidenceField.value); - if (!isNaN(outcomeFieldValue)) { - return outcomeFieldValue == TcmHelper.OutcomeConfidenceValue; - } - } - return false; - } - static getCustomField(result, fieldName) { - if (result.customFields == null) { - return null; - } - var cf = result.customFields.filter(c => c.fieldName.toLowerCase() == fieldName.toLowerCase()); - return cf.length > 0 ? cf[0] : null; - } - static Merge(source) { - const mergedResults = []; - source.forEach(item => { - if (item != null) { - mergedResults.push(...item); - } - }); - return mergedResults; - } -} -exports.TcmHelper = TcmHelper; -TcmHelper.OutcomeConfidenceValue = 0.0; -//# sourceMappingURL=TcmHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js.map deleted file mode 100644 index 032d716d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TcmHelper.js","sourceRoot":"","sources":["TcmHelper.ts"],"names":[],"mappings":";;;AAAA,oFAA+G;AAE/G,MAAa,SAAS;IAIb,MAAM,CAAC,cAAc,CAAC,iBAAgC;QAC3D,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,KAAK,IAAI,OAAO,IAAI,4BAAW,EAAE;YAC/B,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBACjE,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAChC;SACF;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,aAAqB;QAC9C,IAAI,MAAmB,CAAC;QACxB,QAAQ,aAAa,EAAE;YACrB,KAAK,QAAQ;gBAAE,MAAM,GAAG,4BAAW,CAAC,MAAM,CAAC;gBAAC,MAAM;YAClD,KAAK,QAAQ;gBAAE,MAAM,GAAG,4BAAW,CAAC,MAAM,CAAC;gBAAC,MAAM;YAClD,KAAK,cAAc;gBAAE,MAAM,GAAG,4BAAW,CAAC,YAAY,CAAC;gBAAC,MAAM;YAC9D,KAAK,aAAa;gBAAE,MAAM,GAAG,4BAAW,CAAC,WAAW,CAAC;gBAAC,MAAM;YAC5D;gBAAS,MAAM,GAAG,4BAAW,CAAC,IAAI,CAAC;gBAAC,MAAM;SAC3C;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,MAAsB;QAC9C,IAAI,sBAAsB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACnF,IAAI,sBAAsB,IAAI,IAAI;eAC7B,sBAAsB,CAAC,KAAK,IAAI,IAAI,EAAE;YACzC,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE;gBAC7B,OAAO,iBAAiB,IAAI,SAAS,CAAC,sBAAsB,CAAC;aAC9D;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,MAAsB,EAAE,SAAiB;QACpE,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;QAED,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAI,MAAuB;QAC5C,MAAM,aAAa,GAAQ,EAAE,CAAC;QAE9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACpB,IAAI,IAAI,IAAI,IAAI,EAAE;gBAChB,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;aAC7B;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;;AA5DH,8BA8DC;AA5DwB,gCAAsB,GAAW,GAAG,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js deleted file mode 100644 index 124e9e8b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestOwnersDataProvider = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const ReportFactory_1 = require("../../model/ReportFactory"); -class TestOwnersDataProvider { - constructor(testResultsClient) { - this.testResultsClient = testResultsClient; - } - getReportDataAsync(pipelineConfig, reportDataConfig) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - const failedTestResultDetails = yield this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestInterfaces_1.TestOutcome.Failed]); - const resultsToFetch = []; - failedTestResultDetails.resultsForGroup.forEach(r => { - resultsToFetch.push(...r.results); - }); - const failedOwners = yield this.testResultsClient.getTestResultOwnersAsync(resultsToFetch); - report.$failedTestOwners.push(...failedOwners); - console.log("Fetched test owners data"); - return report; - }); - } -} -exports.TestOwnersDataProvider = TestOwnersDataProvider; -//# sourceMappingURL=TestOwnersDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js.map deleted file mode 100644 index 0cc5a285..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestOwnersDataProvider.js","sourceRoot":"","sources":["TestOwnersDataProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAKA,oFAA8F;AAC9F,6DAA0D;AAE1D,MAAa,sBAAsB;IAIjC,YAAY,iBAAqC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEY,kBAAkB,CAAC,cAAqC,EAAE,gBAAyC;;YAC9G,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAC7D,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,SAAS,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAEzH,MAAM,cAAc,GAAqB,EAAE,CAAC;YAC5C,uBAAuB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClD,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAC3F,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YAE/C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CACF;AAvBD,wDAuBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js deleted file mode 100644 index e02bdc0c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js +++ /dev/null @@ -1,177 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsDataProvider = void 0; -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TcmHelper_1 = require("./TcmHelper"); -const TestResultGroupModel_1 = require("../../model/testresults/TestResultGroupModel"); -const TestResultModel_1 = require("../../model/testresults/TestResultModel"); -const TestResultDetailsParserFactory_1 = require("../helpers/TestResultDetailsParserFactory"); -const ReportFactory_1 = require("../../model/ReportFactory"); -const util_1 = require("util"); -class TestResultsDataProvider { - constructor(testResultsClient, workItemClient) { - this.testResultsClient = testResultsClient; - this.workItemClient = workItemClient; - } - getReportDataAsync(pipelineConfig, reportDataConfig) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - // This is to make sure the failing since information is computed before we fetch test results - yield this.testResultsClient.queryTestResultsReportAsync(); - yield this.setFilteredTestResults(pipelineConfig, reportDataConfig.$testResultsConfig, report); - return report; - }); - } - setFilteredTestResults(config, testResultsConfiguration, report) { - return __awaiter(this, void 0, void 0, function* () { - if (testResultsConfiguration.$includeFailedTests || testResultsConfiguration.$includeOtherTests || testResultsConfiguration.$includePassedTests) { - const groupBy = testResultsConfiguration.$groupTestResultsBy == GroupTestResultsBy_1.GroupTestResultsBy.Run ? "TestRun" : "Priority"; - const includedOutcomes = this.getIncludedOutcomes(testResultsConfiguration); - const resultIdsToFetch = yield this.testResultsClient.getTestResultsDetailsAsync(groupBy, includedOutcomes); - report.hasFilteredTests = this.filterTestResults(resultIdsToFetch, testResultsConfiguration.$maxItemsToShow); - const filteredTestResultGroups = yield this.getTestResultsWithWorkItems(resultIdsToFetch); - report.filteredResults = filteredTestResultGroups; - } - }); - } - getTestResultsWithWorkItems(resultIdsToFetch) { - return __awaiter(this, void 0, void 0, function* () { - const testResultDetailsParser = TestResultDetailsParserFactory_1.TestResultDetailsParserFactory.getParser(resultIdsToFetch); - const filteredTestResultGroups = resultIdsToFetch.resultsForGroup - .map(resultsForGroup => this.getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, testResultDetailsParser)); - const results = yield Promise.all(filteredTestResultGroups); - return results; - }); - } - getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, parser) { - return __awaiter(this, void 0, void 0, function* () { - var resultGroup = new TestResultGroupModel_1.TestResultsGroupModel(); - resultGroup.groupName = parser.getGroupByValue(resultsForGroup); - const bugsRefs = []; - const results = yield this.getTestResultsWithBugRefs(resultsForGroup, bugsRefs); - try { - const workItemDictionary = yield this.getWorkItemsAsync(bugsRefs); - results.forEach(result => { - if (result.associatedBugRefs != null && result.associatedBugRefs.length > 0) { - result.associatedBugRefs.forEach(workItemReference => { - result.associatedBugs.push(workItemDictionary.get(Number.parseInt(workItemReference.id))); - }); - } - }); - } - catch (ex) { - // ignore - console.warn(`Error while fetching workitems for bugrefs: ${bugsRefs.map(b => b.id)}`); - } - results.forEach(result => { - if (result.testResult.outcome != null) { - const testOutcome = TcmHelper_1.TcmHelper.parseOutcome(result.testResult.outcome); - if (!resultGroup.testResults.has(testOutcome)) { - resultGroup.testResults.set(testOutcome, []); - } - resultGroup.testResults.get(testOutcome).push(result); - } - else { - console.log(`Found test with outcome as null. Test result id ${result.testResult.id} in Test run ${result.testResult.testRun.id}`); - } - }); - return resultGroup; - }); - } - getWorkItemsAsync(bugsRefs) { - return __awaiter(this, void 0, void 0, function* () { - const workItemDictionary = new Map(); - if (bugsRefs != null && bugsRefs.length > 0) { - const workItems = yield this.workItemClient.getWorkItemsAsync(bugsRefs.map(bugRef => Number.parseInt(bugRef.id))); - workItems.forEach(workItem => { - if (workItem.id != null) { - workItemDictionary.set(workItem.id, workItem); - } - else { - console.log(`Unable to get id for a work item`); - } - }); - } - return workItemDictionary; - }); - } - getTestResultsWithBugRefs(resultsForGroup, bugReferencesInGroup) { - return __awaiter(this, void 0, void 0, function* () { - const resultModels = []; - for (var i = 0; i < resultsForGroup.results.length; i++) { - const resultIdObj = resultsForGroup.results[i]; - const testResult = yield this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); - // Remove flaky tests - if (util_1.isNullOrUndefined(testResult) || TcmHelper_1.TcmHelper.isTestFlaky(testResult)) { - continue; - } - const associatedBugRefs = yield this.testResultsClient.queryTestResultBugs(testResult.automatedTestName, testResult.id); - const resultModel = new TestResultModel_1.TestResultModel(); - resultModel.testResult = testResult; - resultModel.associatedBugRefs = associatedBugRefs; - resultModels.push(resultModel); - } - // let results = resultsForGroup.results - // .map(async resultIdObj => - // { - // const resultModel = new TestResultModel(); - // resultModel.testResult = await this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); - // // Remove flaky tests - // if (TcmHelper.isTestFlaky(resultModel.testResult)) - // { - // return null; - // } - // resultModel.associatedBugRefs = await this.testResultsClient.queryTestResultBugs(resultModel.testResult.automatedTestName, resultModel.testResult.id); - // return resultModel; - // }); - //Remove all null values from array - //results = results.filter(r => r != null); - //results.forEach(async result => resultModels.push((await result))); - resultModels.forEach(result => bugReferencesInGroup.push(...result.associatedBugRefs)); - return resultModels; - }); - } - filterTestResults(resultIdsToFetch, maxItems) { - var hasFiltered = false; - var remainingItems = maxItems; - for (let i = 0; i < resultIdsToFetch.resultsForGroup.length; i++) { - const group = resultIdsToFetch.resultsForGroup[i]; - var currentItemsSize = group.results.length; - if (currentItemsSize > remainingItems) { - hasFiltered = true; - const results = []; - results.push(...group.results); - group.results = results.splice(0, remainingItems); - break; - } - remainingItems -= group.results.length; - } - resultIdsToFetch.resultsForGroup = resultIdsToFetch.resultsForGroup.filter(group => group.results.length > 0); - return hasFiltered; - } - getIncludedOutcomes(testResultsConfiguration) { - const includedOutcomes = []; - if (testResultsConfiguration.$includeFailedTests) { - includedOutcomes.push(TestInterfaces_1.TestOutcome.Failed); - } - if (testResultsConfiguration.$includeOtherTests) { - includedOutcomes.push(...TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed])); - } - if (testResultsConfiguration.$includePassedTests) { - includedOutcomes.push(TestInterfaces_1.TestOutcome.Passed); - } - return includedOutcomes; - } -} -exports.TestResultsDataProvider = TestResultsDataProvider; -//# sourceMappingURL=TestResultsDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js.map deleted file mode 100644 index 66c98667..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultsDataProvider.js","sourceRoot":"","sources":["TestResultsDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js deleted file mode 100644 index 985ef1d5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js +++ /dev/null @@ -1,120 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryDataProvider = void 0; -const TestSummaryGroupModel_1 = require("../../model/testresults/TestSummaryGroupModel"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -const TestResultDetailsParserForRun_1 = require("../helpers/TestResultDetailsParserForRun"); -const TestOutcomeForPriority_1 = require("../../model/testresults/TestOutcomeForPriority"); -const TestResultDetailsParserForPriority_1 = require("../helpers/TestResultDetailsParserForPriority"); -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TcmHelper_1 = require("./TcmHelper"); -const ReportFactory_1 = require("../../model/ReportFactory"); -class TestSummaryDataProvider { - constructor(testResultsClient) { - this.testResultsClient = testResultsClient; - } - getReportDataAsync(pipelineConfig, reportDataConfiguration) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - const testSummaryGroups = []; - const testSummaryGroupModelForRun = yield this.getTestRunSummaryWithPriorityAsync(pipelineConfig); - testSummaryGroups.push(testSummaryGroupModelForRun); - report.testResultSummary = yield this.testResultsClient.getTestResultSummaryAsync(true); - // Hack - above testresultsummary is incomplete - bug filed - //const passedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Passed]); - //const failedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Failed]); - //this.setOutComeData(report, testSummaryGroups, TestOutcome.Passed, passedResults); - //this.setOutComeData(report, testSummaryGroups, TestOutcome.Failed, failedResults); - if (reportDataConfiguration.$groupTestSummaryBy.includes(GroupTestResultsBy_1.GroupTestResultsBy.Priority)) { - testSummaryGroups.push(yield this.getTestSummaryByPriorityAsync()); - } - report.$testSummaryGroups.push(...testSummaryGroups); - return report; - }); - } - getTestSummaryByPriorityAsync() { - return __awaiter(this, void 0, void 0, function* () { - const testSummaryItemsByRuns = yield this.testResultsClient.getTestResultsDetailsAsync("Priority"); - var testResultDetailsParserForPriority = new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(testSummaryItemsByRuns); - const testSummaryByPriority = new TestSummaryGroupModel_1.TestSummaryGroupModel(); - testSummaryByPriority.groupedBy = GroupTestResultsBy_1.GroupTestResultsBy.Priority; - const summaryItems = testResultDetailsParserForPriority.getSummaryItems(); - testSummaryByPriority.runs.push(...summaryItems); - return testSummaryByPriority; - }); - } - getTestRunSummaryWithPriorityAsync(config) { - return __awaiter(this, void 0, void 0, function* () { - const testSummaryByRun = new TestSummaryGroupModel_1.TestSummaryGroupModel(); - testSummaryByRun.groupedBy = GroupTestResultsBy_1.GroupTestResultsBy.Run; - if (config.$pipelineType == PipelineType_1.PipelineType.Release) { - const testResultsDetailsByTestRun = yield this.testResultsClient.getTestResultsDetailsAsync("TestRun"); - const summaryDataByPriority = yield this.getTestSummaryDataByPriorityAsync(); - const summaryByRun = new TestResultDetailsParserForRun_1.TestResultDetailsParserForRun(testResultsDetailsByTestRun); - const summaryItems = yield this.getSummaryByRun(summaryByRun, summaryDataByPriority); - testSummaryByRun.runs.push(...summaryItems); - } - return testSummaryByRun; - }); - } - getSummaryByRun(testResultByRun, testResultsForPriorityByOutcome) { - const summaryItemByRun = testResultByRun.getSummaryItems(); - summaryItemByRun.forEach(summaryItem => { - testResultsForPriorityByOutcome.forEach((value, supportedTestOutcome) => { - const resultCountByPriority = value.getTestResultsForRun(Number.parseInt(summaryItem.$id)); - resultCountByPriority.forEach((resultCount, priority) => { - if (!summaryItem.$testCountForOutcomeByPriority.has(priority)) { - summaryItem.$testCountForOutcomeByPriority.set(priority, new Map()); - } - const testCountByOutcome = summaryItem.$testCountForOutcomeByPriority.get(priority); - if (!testCountByOutcome.has(supportedTestOutcome)) { - testCountByOutcome.set(supportedTestOutcome, 0); - } - testCountByOutcome.set(supportedTestOutcome, testCountByOutcome.get(supportedTestOutcome) + resultCountByPriority.get(priority)); - }); - }); - }); - return summaryItemByRun; - } - getTestSummaryDataByPriorityAsync() { - return __awaiter(this, void 0, void 0, function* () { - var outcomeFilters = new Map(); - outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed, [TestInterfaces_1.TestOutcome.Passed]); - outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Inconclusive, [TestInterfaces_1.TestOutcome.Inconclusive]); - outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.NotExecuted, [TestInterfaces_1.TestOutcome.NotExecuted]); - outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Other, TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed, TestInterfaces_1.TestOutcome.Inconclusive, TestInterfaces_1.TestOutcome.NotExecuted])); - var testResultDetailsForOutcomes = new Map(); - const outcomeMap = new Map(); - const keys = Array.from(outcomeFilters.keys()); - for (var i = 0; i < keys.length; i++) { - const outcome = keys[i]; - const resultsForOutCome = yield this.testResultsClient.getTestResultsDetailsAsync("Priority", outcomeFilters.get(outcome)); - outcomeMap.set(outcome, resultsForOutCome); - } - outcomeMap.forEach((value, key) => { - testResultDetailsForOutcomes.set(key, new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(value)); - }); - return testResultDetailsForOutcomes; - }); - } -} -exports.TestSummaryDataProvider = TestSummaryDataProvider; -// export class AggregatedResultsByOutcomeImpl implements AggregatedResultsByOutcome { -// count?: number; -// duration?: any; -// groupByField?: string; -// groupByValue?: any; -// outcome?: TestOutcome; -// rerunResultCount?: number; -// } -//# sourceMappingURL=TestSummaryDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js.map deleted file mode 100644 index c7f76611..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryDataProvider.js","sourceRoot":"","sources":["TestSummaryDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js deleted file mode 100644 index 44e8c5ad..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js +++ /dev/null @@ -1,103 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TelemetryLogger = void 0; -const PipelineType_1 = require("../config/pipeline/PipelineType"); -const EnumUtils_1 = require("../utils/EnumUtils"); -const now = require("performance-now"); -class TelemetryLogger { - /** - * Formats and sends all telemetry collected to be published - */ - static LogTaskConfig(reportConfiguration) { - this.reportConfig = reportConfiguration; - const pipelineConfig = this.reportConfig.$pipelineConfiguration; - const mailConfig = this.reportConfig.$mailConfiguration; - const reportDataConfig = this.reportConfig.$reportDataConfiguration; - let pipelineTypeString = "Release"; - let environmentId = 0; - if (pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build) { - pipelineTypeString = "Build"; - } - else { - environmentId = pipelineConfig.$environmentId; - } - const groupTestSummary = reportDataConfig.$groupTestSummaryBy.map(g => EnumUtils_1.EnumUtils.GetGroupTestResultsByString(g)); - let groupTestSummaryString = groupTestSummary[0]; - if (groupTestSummary.length > 0) { - groupTestSummaryString = groupTestSummary.join(","); - } - this.logTelemetry({ - pipelineId: pipelineConfig.$pipelineId, - pipelineType: pipelineTypeString, - projectId: pipelineConfig.$projectId, - projectName: pipelineConfig.$projectName, - environmentId: environmentId, - taskConfiguration: { - sendMailCondition: EnumUtils_1.EnumUtils.GetMailConditionString(this.reportConfig.$sendMailCondition), - smtpHost: mailConfig.$smtpConfig.$smtpHost, - smtpUserName: mailConfig.$smtpConfig.$userName, - enableTLs: mailConfig.$smtpConfig.$enableTLS, - includeCommits: reportDataConfig.$includeCommits, - includeOthersInTotal: reportDataConfig.$includeOthersInTotal, - groupTestSummaryBy: groupTestSummaryString, - testResultsConfiguration: { - includeFailedTests: reportDataConfig.$testResultsConfig.$includeFailedTests, - includeInconclusiveTests: reportDataConfig.$testResultsConfig.$includeInconclusiveTests, - includeNotExecutedTests: reportDataConfig.$testResultsConfig.$includeNotExecutedTests, - includeOtherTests: reportDataConfig.$testResultsConfig.$includeOtherTests, - includePassedTests: reportDataConfig.$testResultsConfig.$includePassedTests, - maxItemsToShow: reportDataConfig.$testResultsConfig.$maxItemsToShow - } - } - }); - } - static LogModulePerf(moduleName, timeTaken, numRetries = 0) { - const timeTakenString = timeTaken.toFixed(2); - if (numRetries < 1) { - this.logTelemetry({ - "ModuleName": `${moduleName}`, - "PERF": `${timeTakenString}` - }); - } - else { - this.logTelemetry({ - "ModuleName": `${moduleName}`, - "PERF": `${timeTakenString}`, - "Retries": `${numRetries}` - }); - } - } - /** - * Publishes an object as a string as telemetry - * @param telemetryToLog Object to be logged as a string - */ - static logTelemetry(telemetryToLog) { - console.log(TelemetryLogger.TELEMETRY_LINE + JSON.stringify(telemetryToLog)); - } - static InvokeWithPerfLogger(executor, executorName) { - return __awaiter(this, void 0, void 0, function* () { - const perfStart = now(); - let returnVal; - try { - returnVal = yield executor(); - } - finally { - // Log time taken by the dataprovider - TelemetryLogger.LogModulePerf(executorName, now() - perfStart); - } - return returnVal; - }); - } -} -exports.TelemetryLogger = TelemetryLogger; -TelemetryLogger.TELEMETRY_LINE = "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; -//# sourceMappingURL=TelemetryLogger.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js.map deleted file mode 100644 index 80c01ab2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TelemetryLogger.js","sourceRoot":"","sources":["TelemetryLogger.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js deleted file mode 100644 index 895b94fd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js +++ /dev/null @@ -1,80 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MockConfigProvider = exports.FileWriter = void 0; -const SendMailCondition_1 = require("../../config/report/SendMailCondition"); -const PipelineConfiguration_1 = require("../../config/pipeline/PipelineConfiguration"); -const MailConfiguration_1 = require("../../config/mail/MailConfiguration"); -const ReportDataConfiguration_1 = require("../../config/report/ReportDataConfiguration"); -const ReportConfiguration_1 = require("../../config/ReportConfiguration"); -const ReportManager_1 = require("../../ReportManager"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -const TestResultsConfiguration_1 = require("../../config/report/TestResultsConfiguration"); -const RecipientsConfiguration_1 = require("../../config/mail/RecipientsConfiguration"); -const SmtpConfiguration_1 = require("../../config/mail/SmtpConfiguration"); -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -const ReportProvider_1 = require("../../providers/ReportProvider"); -const DataProviderFactory_1 = require("../../providers/DataProviderFactory"); -const HTMLReportCreator_1 = require("../../htmlreport/HTMLReportCreator"); -const util_1 = require("util"); -const EmailSender_1 = require("../../EmailSender"); -const TelemetryLogger_1 = require("../../telemetry/TelemetryLogger"); -const fs = require("fs"); -const accessKey = process.env.AccessKey; -const smtpUser = process.env.SMTPUSER; -const smtpPassword = process.env.SMTPPASSWORD; -class FileWriter { - static writeToFile(content, fileName) { - const currDir = __dirname; - console.log(`CurrentDir: ${currDir}`); - var msgPath = `${currDir}\\${fileName}`; - fs.writeFile(msgPath, content, (err) => { - if (err) { - return console.log(err); - } - console.log("File saved successfully!"); - }); - } -} -exports.FileWriter = FileWriter; -class MockConfigProvider { - getPipelineConfiguration() { - return new PipelineConfiguration_1.PipelineConfiguration(PipelineType_1.PipelineType.Release, 13942411, "ProjectId", "ProjectName", 160977787, 9462, false, "https://dev.azure.com/{account}/", accessKey); - } - getMailConfiguration() { - return new MailConfiguration_1.MailConfiguration("[{environmentStatus}] {passPercentage} tests passed", new RecipientsConfiguration_1.RecipientsConfiguration("xyz@email.com", false, false, false, false), new RecipientsConfiguration_1.RecipientsConfiguration("", false, false, false, false), new SmtpConfiguration_1.SmtpConfiguration(smtpUser, smtpPassword, "smtp.live.com", true), "test.com"); - } - getReportDataConfiguration() { - const testResultsConfig = new TestResultsConfiguration_1.TestResultsConfiguration(true, false, false, false, false, GroupTestResultsBy_1.GroupTestResultsBy.Run, 10); - return new ReportDataConfiguration_1.ReportDataConfiguration(true, false, true, [GroupTestResultsBy_1.GroupTestResultsBy.Priority, GroupTestResultsBy_1.GroupTestResultsBy.Run], testResultsConfig); - } - getSendMailCondition() { - return SendMailCondition_1.SendMailCondition.Always; - } -} -exports.MockConfigProvider = MockConfigProvider; -function run() { - return __awaiter(this, void 0, void 0, function* () { - console.log('Node Version: ' + process.version); - const configProvider = new MockConfigProvider(); - const reportConfiguration = new ReportConfiguration_1.ReportConfiguration(configProvider); - TelemetryLogger_1.TelemetryLogger.LogTaskConfig(reportConfiguration); - const reportManager = new ReportManager_1.ReportManager(new ReportProvider_1.ReportProvider(new DataProviderFactory_1.DataProviderFactory(configProvider.getPipelineConfiguration())), new HTMLReportCreator_1.HTMLReportCreator(), new EmailSender_1.EmailSender()); - reportManager.sendReportAsync(reportConfiguration); - }); -} -if (util_1.isNullOrUndefined(accessKey)) { - console.error("Set Environment Vars for AccessKey."); -} -else { - run(); -} -//# sourceMappingURL=InvokeTest.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js.map deleted file mode 100644 index 626265a1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"InvokeTest.js","sourceRoot":"","sources":["InvokeTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js deleted file mode 100644 index 1627cca4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const sinon_1 = __importDefault(require("sinon")); -const ReportFactory_1 = require("../../model/ReportFactory"); -const ReportProvider_1 = require("../../providers/ReportProvider"); -const ReportManager_1 = require("../../ReportManager"); -const MissingDataError_1 = require("../../exceptions/MissingDataError"); -describe("ReportManager Tests", () => { - let reportProvider = sinon_1.default.createStubInstance(ReportProvider_1.ReportProvider); - beforeEach(() => { - const report = ReportFactory_1.ReportFactory.createNewReport(null); - sinon_1.default.stub(reportProvider, "createReportAsync").returns(Promise.resolve(report)); - sinon_1.default.stub(report, "$dataMissing").returns(true); - }); - test("ReportManager throws error when datamissing from report", () => __awaiter(void 0, void 0, void 0, function* () { - let reportManager = new ReportManager_1.ReportManager(reportProvider, null, null); - expect(reportManager.sendReportAsync(null)).rejects.toThrow(MissingDataError_1.MissingDataError); - })); -}); -//# sourceMappingURL=ReportManagerTests.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js.map deleted file mode 100644 index 0e8a5585..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportManagerTests.js","sourceRoot":"","sources":["ReportManagerTests.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,6DAA0D;AAE1D,mEAAgE;AAChE,uDAAoD;AACpD,wEAAqE;AAErE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IAEnC,IAAI,cAAc,GAAoB,eAAK,CAAC,kBAAkB,CAAC,+BAAc,CAAC,CAAC;IAE/E,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACnD,eAAK,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,eAAK,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAS,EAAE;QACzE,IAAI,aAAa,GAAG,IAAI,6BAAa,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAgB,CAAC,CAAC;IAChF,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js deleted file mode 100644 index 76a207cc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DisplayNameHelper = void 0; -class DisplayNameHelper { - static getPriorityDisplayName(priority) { - const priorityInt = Number.parseInt(priority); - if (!isNaN(priorityInt) && priorityInt == 255) { - return "Priority unspecified"; - } - return `Priority: ${priority}`; - } -} -exports.DisplayNameHelper = DisplayNameHelper; -//# sourceMappingURL=DisplayNameHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js.map deleted file mode 100644 index cd10b401..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DisplayNameHelper.js","sourceRoot":"","sources":["DisplayNameHelper.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAErB,MAAM,CAAC,sBAAsB,CAAC,QAAgB;QACnD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE;YAC7C,OAAO,sBAAsB,CAAC;SAC/B;QACD,OAAO,aAAa,QAAQ,EAAE,CAAC;IACjC,CAAC;CACF;AATD,8CASC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js deleted file mode 100644 index 6f71fe91..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EnumUtils = void 0; -const SendMailCondition_1 = require("../config/report/SendMailCondition"); -const GroupTestResultsBy_1 = require("../config/report/GroupTestResultsBy"); -class EnumUtils { - static GetMailConditionString(condition) { - let index = 0; - for (let val in SendMailCondition_1.SendMailCondition) { - if (!isNaN(Number(val)) && condition == Number(val)) { - break; - } - index++; - } - let index2 = 0; - for (let val in SendMailCondition_1.SendMailCondition) { - if (isNaN(Number(val))) { - if (index2 == index) - return val; - index2++; - } - } - return null; - } - static GetGroupTestResultsByString(condition) { - let index = 0; - for (let val in GroupTestResultsBy_1.GroupTestResultsBy) { - if (!isNaN(Number(val)) && condition == Number(val)) { - break; - } - index++; - } - let index2 = 0; - for (let val in GroupTestResultsBy_1.GroupTestResultsBy) { - if (isNaN(Number(val))) { - if (index2 == index) - return val; - index2++; - } - } - return null; - } -} -exports.EnumUtils = EnumUtils; -//# sourceMappingURL=EnumUtils.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js.map deleted file mode 100644 index 4777777b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EnumUtils.js","sourceRoot":"","sources":["EnumUtils.ts"],"names":[],"mappings":";;;AAAA,0EAAuE;AACvE,4EAAyE;AAEzE,MAAa,SAAS;IAEb,MAAM,CAAC,sBAAsB,CAAC,SAA4B;QAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAI,IAAI,GAAG,IAAI,qCAAiB,EAAE;YAChC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM;aACP;YACD,KAAK,EAAE,CAAC;SACT;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAI,IAAI,GAAG,IAAI,qCAAiB,EAAE;YAChC,IAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAG,MAAM,IAAI,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM,CAAC,2BAA2B,CAAC,SAA6B;QACrE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAI,IAAI,GAAG,IAAI,uCAAkB,EAAE;YACjC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM;aACP;YACD,KAAK,EAAE,CAAC;SACT;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAI,IAAI,GAAG,IAAI,uCAAkB,EAAE;YACjC,IAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAG,MAAM,IAAI,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAzCD,8BAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js deleted file mode 100644 index 0daa1050..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EnvironmentExtensions = void 0; -class EnvironmentExtensions { - static getPhases(environment) { - const phases = new Array(); - if (environment.deploySteps != null && environment.deploySteps.length > 0) { - let attempt = 0; - let latestDeploySteps = environment.deploySteps[0]; - for (var i = 0; i < environment.deploySteps.length; i++) { - if (environment.deploySteps[i].attempt > attempt) { - latestDeploySteps = environment.deploySteps[i]; - } - } - phases.push(...latestDeploySteps.releaseDeployPhases); - } - return phases; - } -} -exports.EnvironmentExtensions = EnvironmentExtensions; -//# sourceMappingURL=EnvironmentExtensions.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js.map deleted file mode 100644 index d47af3f4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EnvironmentExtensions.js","sourceRoot":"","sources":["EnvironmentExtensions.ts"],"names":[],"mappings":";;;AAEA,MAAa,qBAAqB;IAChC,MAAM,CAAC,SAAS,CAAC,WAA+B;QAC9C,MAAM,MAAM,GAAG,IAAI,KAAK,EAAsB,CAAC;QAC/C,IAAI,WAAW,CAAC,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACzE,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,iBAAiB,GAAsB,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACtE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/D,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE;oBAChD,iBAAiB,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;iBAChD;aACF;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;SACvD;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAhBD,sDAgBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js deleted file mode 100644 index 2593a00c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.StringUtils = void 0; -class StringUtils { - static isNullOrWhiteSpace(input) { - if (typeof input === 'undefined' || input == null) - return true; - return input.replace("/\s/g", '').length < 1; - } - static CompressNewLines(content) { - if (content != null) { - const lines = this.getNonEmptyLines(content); - content = lines.join("\n"); - } - return content; - } - static getNonEmptyLines(s) { - s = s.replace("\r", ""); - return s.split('\n') - .filter(str => !this.isNullOrWhiteSpace(str)) - .map(str => str.trim()); - } - static ReplaceNewlineWithBrTag(content) { - if (content == null) { - return null; - } - const lines = this.getNonEmptyLines(content); - return lines.join("
"); - } - static getFirstNLines(content, lineCount) { - if (content != null) { - var lines = this.getNonEmptyLines(content); - return lines.slice(0, lineCount).join("\n"); - } - return null; - } -} -exports.StringUtils = StringUtils; -//# sourceMappingURL=StringUtils.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js.map deleted file mode 100644 index b390e763..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"StringUtils.js","sourceRoot":"","sources":["StringUtils.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACf,MAAM,CAAC,kBAAkB,CAAC,KAAa;QAE5C,IAAI,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/D,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAAC,OAAe;QAC5C,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC7C,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5B;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,CAAS;QACvC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;aACjB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;aAC5C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,uBAAuB,CAAC,OAAe;QACnD,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,OAAe,EAAE,SAAiB;QAC7D,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7C;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAvCD,kCAuCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js deleted file mode 100644 index e3f84dab..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js +++ /dev/null @@ -1,94 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EmailSender = void 0; -const MailAddressViewModel_1 = require("./model/viewmodel/MailAddressViewModel"); -const MailError_1 = require("./exceptions/MailError"); -const util_1 = require("util"); -const nodemailer = require("nodemailer"); -const url = require("url"); -class EmailSender { - sendReportAsync(report, htmlReportMessage, mailConfiguration) { - return __awaiter(this, void 0, void 0, function* () { - const mailAddressViewModel = new MailAddressViewModel_1.MailAddressViewModel(report, mailConfiguration); - let smtpUrlProvided = mailConfiguration.$smtpConfig.$smtpHost; - console.log(`Using SmtpHost URL: ${smtpUrlProvided}`); - smtpUrlProvided = smtpUrlProvided.includes("://") ? smtpUrlProvided : "smtp://" + smtpUrlProvided; - console.log(`Parsed Url: ${smtpUrlProvided}`); - let smtpUrl = url.parse(smtpUrlProvided, true); - console.log(`Host: ${smtpUrl.host}`); - console.log(`HostName: ${smtpUrl.hostname}`); - console.log(`Port: ${smtpUrl.port}`); - console.log(`Protocol: ${smtpUrl.protocol}`); - const smtpHost = smtpUrl.hostname; - let smtpPort = smtpUrl.port; - smtpPort = util_1.isNullOrUndefined(smtpUrl.port) ? 587 : smtpUrl.port; - console.log(`Using HostName: ${smtpHost} and port: ${smtpPort}`); - let transporter; - if (mailConfiguration.$smtpConfig.$enableTLS) { - transporter = nodemailer.createTransport({ - host: smtpHost, - port: smtpPort, - tls: { - maxVersion: 'TLSv1.2', - minVersion: 'TLSv1.2', - rejectUnauthorized: false - }, - requireTLS: true, - auth: { - user: mailConfiguration.$smtpConfig.$userName, - pass: mailConfiguration.$smtpConfig.$password - } - }); - } - else { - transporter = nodemailer.createTransport({ - host: smtpHost, - port: smtpPort, - auth: { - user: mailConfiguration.$smtpConfig.$userName, - pass: mailConfiguration.$smtpConfig.$password - } - }); - } - try { - const result = yield this.sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, htmlReportMessage); - console.log(`Mail Sent Successfully: ${result.response}`); - return true; - } - catch (err) { - throw new MailError_1.MailError(err); - } - }); - } - sendMailAsync(transporter, mailAddressViewModel, mailConfiguration, message) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - yield transporter.sendMail({ - from: mailAddressViewModel.from, - to: mailAddressViewModel.to.join(","), - cc: util_1.isNullOrUndefined(mailAddressViewModel.cc) || mailAddressViewModel.cc.length < 1 ? null : mailAddressViewModel.cc.join(","), - subject: mailConfiguration.$mailSubject, - html: message - }, (err, response) => { - if (err) { - reject(err); - } - else { - resolve(response); - } - }); - })); - }); - } -} -exports.EmailSender = EmailSender; -//# sourceMappingURL=EmailSender.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js.map deleted file mode 100644 index ae6f1e15..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EmailSender.js","sourceRoot":"","sources":["EmailSender.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js deleted file mode 100644 index 71c2bb2b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IReportSender.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js.map deleted file mode 100644 index 8b73c789..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IReportSender.js","sourceRoot":"","sources":["IReportSender.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js deleted file mode 100644 index 43d04bff..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportManager = void 0; -const ReportError_1 = require("./exceptions/ReportError"); -const MissingDataError_1 = require("./exceptions/MissingDataError"); -const EnumUtils_1 = require("./utils/EnumUtils"); -class ReportManager { - constructor(reportProvider, htmlReportCreator, reportSender) { - this.reportProvider = reportProvider; - this.reportSender = reportSender; - this.htmlReportCreator = htmlReportCreator; - } - sendReportAsync(reportConfig) { - return __awaiter(this, void 0, void 0, function* () { - let mailSent = false; - try { - console.log("Fetching data for email report"); - const report = yield this.reportProvider.createReportAsync(reportConfig); - console.log("Created report view model"); - if (report.$dataMissing) { - throw new MissingDataError_1.MissingDataError("Unable to fetch all data for generating report. Not Sending report."); - } - else if (report.$sendMailConditionSatisfied && this.reportSender != null) { - console.log("Creating report message"); - const htmlMessage = this.htmlReportCreator.createHtmlReport(report, reportConfig); - mailSent = yield this.reportSender.sendReportAsync(report, htmlMessage, reportConfig.$mailConfiguration); - } - else { - console.log(`Not sending mail, as the user send mail condition - '${EnumUtils_1.EnumUtils.GetMailConditionString(reportConfig.$sendMailCondition)}' is not satisfied.`); - } - } - catch (err) { - // Exit Task with Error to fail the task - ReportError_1.ReportError.HandleError(err, true); - } - return mailSent; - }); - } -} -exports.ReportManager = ReportManager; -//# sourceMappingURL=ReportManager.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js.map deleted file mode 100644 index d231f427..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportManager.js","sourceRoot":"","sources":["ReportManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,0DAAuD;AAGvD,oEAAiE;AACjE,iDAA8C;AAE9C,MAAa,aAAa;IAMxB,YAAY,cAA+B,EAAE,iBAAqC,EAAE,YAA2B;QAC7G,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEY,eAAe,CAAC,YAAiC;;YAC5D,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI;gBACF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBAEzC,IAAI,MAAM,CAAC,YAAY,EAAE;oBACvB,MAAM,IAAI,mCAAgB,CAAC,qEAAqE,CAAC,CAAC;iBACnG;qBACI,IAAI,MAAM,CAAC,2BAA2B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;oBACxE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACvC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;oBAClF,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;iBAC1G;qBAAM;oBACL,OAAO,CAAC,GAAG,CAAC,wDAAwD,qBAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;iBAC7J;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,wCAAwC;gBACxC,yBAAW,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;aACpC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;KAAA;CACF;AApCD,sCAoCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js deleted file mode 100644 index da9e522b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js +++ /dev/null @@ -1,145 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ConfigurationProvider = void 0; -const tl = require("azure-pipelines-task-lib"); -const TaskConstants_1 = require("./TaskConstants"); -const SendMailCondition_1 = require("./report/SendMailCondition"); -const MailConfiguration_1 = require("./mail/MailConfiguration"); -const RecipientsConfiguration_1 = require("./mail/RecipientsConfiguration"); -const SmtpConfiguration_1 = require("./mail/SmtpConfiguration"); -const InputError_1 = require("../exceptions/InputError"); -const ReportDataConfiguration_1 = require("./report/ReportDataConfiguration"); -const TestResultsConfiguration_1 = require("./report/TestResultsConfiguration"); -const GroupTestResultsBy_1 = require("./report/GroupTestResultsBy"); -const PipelineConfiguration_1 = require("./pipeline/PipelineConfiguration"); -const PipelineType_1 = require("./pipeline/PipelineType"); -const StringUtils_1 = require("../utils/StringUtils"); -const util_1 = require("util"); -class ConfigurationProvider { - constructor() { - this.initPipelineConfiguration(); - this.initMailConfiguration(); - this.initReportDataConfiguration(); - this.initSendMailCondition(); - } - getPipelineConfiguration() { - return this.pipelineConfiguration; - } - getMailConfiguration() { - return this.mailConfiguration; - } - getReportDataConfiguration() { - return this.reportDataConfiguration; - } - getSendMailCondition() { - return this.sendMailCondition; - } - /** - * Gets access token from system - */ - getAccessKey() { - return tl.getEndpointAuthorizationParameter(TaskConstants_1.TaskConstants.VSS_CONNECTION_KEY, TaskConstants_1.TaskConstants.ACCESS_PARAMETER, false); - } - initPipelineConfiguration() { - const hostType = tl.getVariable(TaskConstants_1.TaskConstants.HOST_KEY); - const pipelineType = hostType == "build" ? PipelineType_1.PipelineType.Build : PipelineType_1.PipelineType.Release; - const pipelineIdKey = pipelineType == PipelineType_1.PipelineType.Build ? TaskConstants_1.TaskConstants.BUILD_ID_KEY : TaskConstants_1.TaskConstants.RELEASE_ID_KEY; - const pipelineId = Number(tl.getVariable(pipelineIdKey)); - const projectId = tl.getVariable(TaskConstants_1.TaskConstants.PROJECTID_KEY); - const projectName = tl.getVariable(TaskConstants_1.TaskConstants.PROJECTNAME_KEY); - const envId = Number(tl.getVariable(TaskConstants_1.TaskConstants.ENVIRONMENTID_KEY)); - const envDefId = Number(tl.getVariable(TaskConstants_1.TaskConstants.ENVIRONMENTDEFID_KEY)); - const usePrevEnvironment = tl.getBoolInput(TaskConstants_1.TaskConstants.USEPREVENV_INPUTKEY); - const teamUri = tl.getVariable(TaskConstants_1.TaskConstants.TEAM_FOUNDATION_KEY); - this.pipelineConfiguration = new PipelineConfiguration_1.PipelineConfiguration(pipelineType, pipelineId, projectId, projectName, envId, envDefId, usePrevEnvironment, teamUri, this.getAccessKey()); - } - initMailConfiguration() { - const smtpConnectionId = tl.getInput(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, true); - const endPointScheme = tl.getEndpointAuthorizationScheme(smtpConnectionId, true); - if (endPointScheme != "UsernamePassword") { - throw new InputError_1.InputError(`Incorrect EndPoint Scheme Provided - '${endPointScheme}'. Only UserName and Password type Endpoints allowed.`); - } - const smtpHost = tl.getEndpointUrl(smtpConnectionId, true).replace(/(^\w+:|^)\/\//, '').replace(/\/$/, ''); - const userName = tl.getEndpointAuthorizationParameter(smtpConnectionId, "UserName", true); - const password = tl.getEndpointAuthorizationParameter(smtpConnectionId, "Password", true); - const enableTLS = tl.getBoolInput(TaskConstants_1.TaskConstants.ENABLETLS_INPUTKEY, true); - const smtpConfig = new SmtpConfiguration_1.SmtpConfiguration(userName, password, smtpHost, enableTLS); - // Mail Subject - const mailSubject = tl.getInput(TaskConstants_1.TaskConstants.SUBJECT_INPUTKEY, true); - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(mailSubject)) { - throw new InputError_1.InputError("Email subject not set"); - } - // Optional inputs - const toAddresses = tl.getInput(TaskConstants_1.TaskConstants.TOADDRESS_INPUTKEY, false); - const ccAddresses = tl.getInput(TaskConstants_1.TaskConstants.CCADDRESS_INPUTKEY, false); - const includeInToAddressesConfig = tl.getInput(TaskConstants_1.TaskConstants.INCLUDEINTO_INPUTKEY, false); - const includeInCCAddressesConfig = tl.getInput(TaskConstants_1.TaskConstants.INCLUDEINCC_INPUTKEY, false); - // Addresses Configuration - const toRecipientsConfiguration = this.getRecipientConfiguration(toAddresses, includeInToAddressesConfig); - const ccRecipientsConfiguration = this.getRecipientConfiguration(ccAddresses, includeInCCAddressesConfig); - const defaultDomain = tl.getInput(TaskConstants_1.TaskConstants.DEFAULTDOMAIN_INPUTKEY, true); - this.mailConfiguration = new MailConfiguration_1.MailConfiguration(mailSubject, toRecipientsConfiguration, ccRecipientsConfiguration, smtpConfig, defaultDomain); - } - initReportDataConfiguration() { - // required inputs - const groupResultsBy = this.getGroupTestResultsByEnumFromString(tl.getInput(TaskConstants_1.TaskConstants.GROUPTESTRESULTSBY_INPUTKEY, true)); - const includeOthersInTotal = tl.getBoolInput(TaskConstants_1.TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY, true); - const maxTestFailuresToShow = Number(tl.getInput(TaskConstants_1.TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, true)); - const includeCommits = tl.getBoolInput(TaskConstants_1.TaskConstants.INCLUDECOMMITS_INPUTKEY, true); - // optional inputs - const includeResultsStr = tl.getInput(TaskConstants_1.TaskConstants.INCLUDERESULTS_INPUTKEY, false); - const groupTestSummaryByStr = tl.getInput(TaskConstants_1.TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY, false); - const groupTestSummaryBy = new Array(); - if (!util_1.isNullOrUndefined(groupTestSummaryByStr)) { - groupTestSummaryByStr.split(",").forEach(element => { groupTestSummaryBy.push(this.getGroupTestResultsByEnumFromString(element)); }); - } - // derived input values - const includeResultsConfig = util_1.isNullOrUndefined(includeResultsStr) ? [] : includeResultsStr.split(","); - const includeFailedTests = includeResultsConfig.includes("1"); - const includeOtherTests = includeResultsConfig.includes("2"); - const includePassedTests = includeResultsConfig.includes("3"); - const includeInconclusiveTests = includeResultsConfig.includes("4"); - const includeNotExecutedTests = includeResultsConfig.includes("5"); - const testResultsConfig = new TestResultsConfiguration_1.TestResultsConfiguration(includeFailedTests, includePassedTests, includeInconclusiveTests, includeNotExecutedTests, includeOtherTests, groupResultsBy, maxTestFailuresToShow); - this.reportDataConfiguration = new ReportDataConfiguration_1.ReportDataConfiguration(includeCommits, includeOthersInTotal, true, groupTestSummaryBy, testResultsConfig); - } - initSendMailCondition() { - const sendMailConditionStr = tl.getInput(TaskConstants_1.TaskConstants.SENDMAILCONDITION_INPUTKEY); - let sendMailCondition; - switch (sendMailConditionStr) { - case "On Failure": - sendMailCondition = SendMailCondition_1.SendMailCondition.OnFailure; - break; - case "On Success": - sendMailCondition = SendMailCondition_1.SendMailCondition.OnSuccess; - break; - case "On New Failures Only": - sendMailCondition = SendMailCondition_1.SendMailCondition.OnNewFailuresOnly; - break; - default: - sendMailCondition = SendMailCondition_1.SendMailCondition.Always; - break; - } - this.sendMailCondition = sendMailCondition; - } - getRecipientConfiguration(namedRecipients, includeConfigStr) { - if (includeConfigStr != null) { - const includeConfig = includeConfigStr.split(","); - const includeChangesetOwners = includeConfig.includes("1"); - const includeTestOwners = includeConfig.includes("2"); - const includeActiveBugOwners = includeConfig.includes("3"); - const includeCreatedBy = includeConfig.includes("4"); - return new RecipientsConfiguration_1.RecipientsConfiguration(namedRecipients, includeChangesetOwners, includeTestOwners, includeActiveBugOwners, includeCreatedBy); - } - return new RecipientsConfiguration_1.RecipientsConfiguration(namedRecipients); - } - getGroupTestResultsByEnumFromString(groupResultsByStr) { - switch (groupResultsByStr) { - case "Priority": return GroupTestResultsBy_1.GroupTestResultsBy.Priority; - case "Team": return GroupTestResultsBy_1.GroupTestResultsBy.Team; - default: return GroupTestResultsBy_1.GroupTestResultsBy.Run; - } - } -} -exports.ConfigurationProvider = ConfigurationProvider; -//# sourceMappingURL=ConfigurationProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js.map deleted file mode 100644 index 96b7fe79..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ConfigurationProvider.js","sourceRoot":"","sources":["ConfigurationProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js deleted file mode 100644 index 6a116ba8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IConfigurationProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js.map deleted file mode 100644 index 916dcc67..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IConfigurationProvider.js","sourceRoot":"","sources":["IConfigurationProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js deleted file mode 100644 index a602ef99..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportConfiguration = void 0; -const InputError_1 = require("../exceptions/InputError"); -const TaskConstants_1 = require("./TaskConstants"); -const StringUtils_1 = require("../utils/StringUtils"); -class ReportConfiguration { - constructor(configProvider) { - this.sendMailCondition = configProvider.getSendMailCondition(); - this.mailConfiguration = configProvider.getMailConfiguration(); - this.reportDataConfiguration = configProvider.getReportDataConfiguration(); - this.pipelineConfiguration = configProvider.getPipelineConfiguration(); - } - validateConfiguration() { - if (this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow <= 0) { - this.throwError(TaskConstants_1.TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY, this.reportDataConfiguration.$testResultsConfig.$maxItemsToShow, "be > 0"); - } - this.validateMailConfig(); - } - validateMailConfig() { - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$mailSubject)) { - this.throwError(TaskConstants_1.TaskConstants.SUBJECT_INPUTKEY, this.mailConfiguration.$mailSubject, "be specified"); - } - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$smtpHost)) { - this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$smtpHost, "specify SMTP Host URL"); - } - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$userName)) { - this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$userName, "specify SMTP UserName"); - } - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(this.mailConfiguration.$smtpConfig.$password)) { - this.throwError(TaskConstants_1.TaskConstants.SMTPCONNECTION_INPUTKEY, this.mailConfiguration.$smtpConfig.$password, "specify SMTP Password"); - } - } - // Getters - get $sendMailCondition() { - return this.sendMailCondition; - } - get $mailConfiguration() { - return this.mailConfiguration; - } - get $reportDataConfiguration() { - return this.reportDataConfiguration; - } - get $pipelineConfiguration() { - return this.pipelineConfiguration; - } - throwError(prefix, suffix, expectation) { - throw new InputError_1.InputError(`${prefix} should ${expectation}. Actual Input value: '${suffix}'`); - } -} -exports.ReportConfiguration = ReportConfiguration; -//# sourceMappingURL=ReportConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js.map deleted file mode 100644 index 77e9fd87..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportConfiguration.js","sourceRoot":"","sources":["ReportConfiguration.ts"],"names":[],"mappings":";;;AAKA,yDAAsD;AACtD,mDAAgD;AAChD,sDAAmD;AAEnD,MAAa,mBAAmB;IAM9B,YAAY,cAAsC;QAChD,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,uBAAuB,GAAG,cAAc,CAAC,0BAA0B,EAAE,CAAC;QAC3E,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC,wBAAwB,EAAE,CAAC;IACzE,CAAC;IAED,qBAAqB;QACnB,IAAI,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,eAAe,IAAI,CAAC,EAAE;YACxE,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,8BAA8B,EAAE,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;SAC1I;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,kBAAkB;QACxB,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;YACvE,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;SACtG;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;QAED,IAAI,yBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAChF,IAAI,CAAC,UAAU,CAAC,6BAAa,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SAC/H;IACH,CAAC;IAED,UAAU;IACV,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,MAAW,EAAE,WAAmB;QACjE,MAAM,IAAI,uBAAU,CAAC,GAAG,MAAM,WAAW,WAAW,0BAA0B,MAAM,GAAG,CAAC,CAAC;IAC3F,CAAC;CACF;AA3DD,kDA2DC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js deleted file mode 100644 index 8faed453..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskConstants = void 0; -class TaskConstants { -} -exports.TaskConstants = TaskConstants; -TaskConstants.SUBJECT_INPUTKEY = "subject"; -TaskConstants.SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; -TaskConstants.INCLUDECOMMITS_INPUTKEY = "includeCommits"; -TaskConstants.GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; -TaskConstants.INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; -TaskConstants.MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; -TaskConstants.GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; -TaskConstants.INCLUDERESULTS_INPUTKEY = "includeResultsStr"; -TaskConstants.TOADDRESS_INPUTKEY = "toAddress"; -TaskConstants.CCADDRESS_INPUTKEY = "ccAddress"; -TaskConstants.INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; -TaskConstants.INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; -TaskConstants.SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; -// Inputkey value should be "enableTLS" - however changing that will break the task for everyone. See task.dev.json or task.prod.json for the confusion. -// For now -inputkey has to be enableSSL... until AzureDevOps marketplace supports a way to rename params in json -TaskConstants.ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; -TaskConstants.USEPREVENV_INPUTKEY = "usePreviousEnvironment"; -TaskConstants.DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; -TaskConstants.TEAM_FOUNDATION_KEY = "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"; -TaskConstants.VSS_CONNECTION_KEY = "SYSTEMVSSCONNECTION"; -TaskConstants.ACCESS_PARAMETER = "ACCESSTOKEN"; -TaskConstants.PROJECTNAME_KEY = "SYSTEM_TEAMPROJECT"; -TaskConstants.PROJECTID_KEY = "SYSTEM_TEAMPROJECTID"; -TaskConstants.BUILD_ID_KEY = "BUILD_BUILDID"; -TaskConstants.RELEASE_ID_KEY = "RELEASE_RELEASEID"; -TaskConstants.HOST_KEY = "SYSTEM_HOSTTYPE"; -TaskConstants.ENVIRONMENTID_KEY = "RELEASE_ENVIRONMENTID"; -TaskConstants.ENVIRONMENTDEFID_KEY = "RELEASE_DEFINITIONENVIRONMENTID"; -//# sourceMappingURL=TaskConstants.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js.map deleted file mode 100644 index c88ee1c5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskConstants.js","sourceRoot":"","sources":["TaskConstants.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;;AAA1B,sCAgCC;AA/BwB,8BAAgB,GAAG,SAAS,CAAC;AAC7B,wCAA0B,GAAG,yBAAyB,CAAC;AACvD,qCAAuB,GAAG,gBAAgB,CAAC;AAC3C,yCAA2B,GAAG,oBAAoB,CAAC;AACnD,2CAA6B,GAAG,sBAAsB,CAAC;AACvD,4CAA8B,GAAG,uBAAuB,CAAC;AACzD,yCAA2B,GAAG,uBAAuB,CAAC;AACtD,qCAAuB,GAAG,mBAAmB,CAAC;AAC9C,gCAAkB,GAAG,WAAW,CAAC;AACjC,gCAAkB,GAAG,WAAW,CAAC;AACjC,kCAAoB,GAAG,uBAAuB,CAAC;AAC/C,kCAAoB,GAAG,uBAAuB,CAAC;AAC/C,qCAAuB,GAAG,wBAAwB,CAAC;AAC1E,wJAAwJ;AACxJ,iHAAiH;AAC1F,gCAAkB,GAAG,2BAA2B,CAAC;AACjD,iCAAmB,GAAG,wBAAwB,CAAC;AAC/C,oCAAsB,GAAG,eAAe,CAAC;AAEzC,iCAAmB,GACxC,oCAAoC,CAAC;AAChB,gCAAkB,GAAW,qBAAqB,CAAC;AACnD,8BAAgB,GAAW,aAAa,CAAC;AACzC,6BAAe,GAAW,oBAAoB,CAAC;AAC/C,2BAAa,GAAW,sBAAsB,CAAC;AAC/C,0BAAY,GAAW,eAAe,CAAC;AACvC,4BAAc,GAAW,mBAAmB,CAAC;AAC7C,sBAAQ,GAAW,iBAAiB,CAAC;AAErC,+BAAiB,GAAW,uBAAuB,CAAC;AACpD,kCAAoB,GAAW,iCAAiC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js deleted file mode 100644 index b92224fc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MailConfiguration = void 0; -class MailConfiguration { - constructor($mailSubject, $toRecipientsConfig, $ccRecipientsConfig, $smtpConfig, $defaultDomain) { - this.mailSubject = $mailSubject; - this.toRecipientsConfig = $toRecipientsConfig; - this.ccRecipientsConfig = $ccRecipientsConfig; - this.smtpConfig = $smtpConfig; - this.defaultDomain = $defaultDomain; - } - /** - * Getter $defaultDomain - * @return {string} - */ - get $defaultDomain() { - return this.defaultDomain; - } - /** - * Getter $mailSubject - * @return {string} - */ - get $mailSubject() { - return this.mailSubject; - } - /** - * Getter $ccRecipientsConfig - * @return {RecipientsConfiguration} - */ - get $ccRecipientsConfig() { - return this.ccRecipientsConfig; - } - /** - * Getter $smtpConfig - * @return {SmtpConfiguration} - */ - get $smtpConfig() { - return this.smtpConfig; - } - /** - * Getter $toRecipientsConfig - * @return {RecipientsConfiguration} - */ - get $toRecipientsConfig() { - return this.toRecipientsConfig; - } - /** - * Setter $mailSubject - * @param {string} value - */ - set $mailSubject(value) { - this.mailSubject = value; - } -} -exports.MailConfiguration = MailConfiguration; -//# sourceMappingURL=MailConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js.map deleted file mode 100644 index 29e7bf96..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MailConfiguration.js","sourceRoot":"","sources":["MailConfiguration.ts"],"names":[],"mappings":";;;AAGA,MAAa,iBAAiB;IAQ5B,YAAY,YAAoB,EAAE,mBAA4C,EAAE,mBAA4C,EAAE,WAA8B,EAAE,cAAsB;QAClL,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;KAGC;IACD,IAAW,YAAY,CAAC,KAAa;QACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CAEF;AAhED,8CAgEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js deleted file mode 100644 index a13ce410..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RecipientsConfiguration = void 0; -class RecipientsConfiguration { - constructor($defaultRecipients, $includeChangesetOwners, $includeTestOwners, $includeActiveBugOwners, $includeCreatedBy) { - this.defaultRecipients = $defaultRecipients; - this.includeChangesetOwners = $includeChangesetOwners; - this.includeTestOwners = $includeTestOwners; - this.includeActiveBugOwners = $includeActiveBugOwners; - this.includeCreatedBy = $includeCreatedBy; - } - /** - * Getter $defaultRecipients - * @return {string} - */ - get $defaultRecipients() { - return this.defaultRecipients; - } - /** - * Getter $includeChangesetOwners - * @return {boolean} - */ - get $includeChangesetOwners() { - return this.includeChangesetOwners; - } - /** - * Getter $includeTestOwners - * @return {boolean} - */ - get $includeTestOwners() { - return this.includeTestOwners; - } - /** - * Getter $includeActiveBugOwners - * @return {boolean} - */ - get $includeActiveBugOwners() { - return this.includeActiveBugOwners; - } - /** - * Getter $includeCreatedBy - * @return {boolean} - */ - get $includeCreatedBy() { - return this.includeCreatedBy; - } -} -exports.RecipientsConfiguration = RecipientsConfiguration; -//# sourceMappingURL=RecipientsConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js.map deleted file mode 100644 index f69f3fbe..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"RecipientsConfiguration.js","sourceRoot":"","sources":["RecipientsConfiguration.ts"],"names":[],"mappings":";;;AAAA,MAAa,uBAAuB;IAOlC,YAAY,kBAA0B,EAAE,uBAAiC,EAAE,kBAA4B,EAAE,uBAAiC,EAAE,iBAA2B;QACrK,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAtDD,0DAsDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js deleted file mode 100644 index 10c87f7d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.SmtpConfiguration = void 0; -class SmtpConfiguration { - constructor($userName, $password, $smtpHost, $enableTLS) { - this.userName = $userName; - this.password = $password; - this.smtpHost = $smtpHost; - this.enableTLS = $enableTLS; - } - /** - * Getter $userName - * @return {string} - */ - get $userName() { - return this.userName; - } - /** - * Getter $password - * @return {string} - */ - get $password() { - return this.password; - } - /** - * Getter $smtpHost - * @return {string} - */ - get $smtpHost() { - return this.smtpHost; - } - /** - * Getter $enableSSL - * @return {boolean} - */ - get $enableTLS() { - return this.enableTLS; - } -} -exports.SmtpConfiguration = SmtpConfiguration; -//# sourceMappingURL=SmtpConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js.map deleted file mode 100644 index 445b4fd3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SmtpConfiguration.js","sourceRoot":"","sources":["SmtpConfiguration.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAM5B,YAAY,SAAiB,EAAE,SAAiB,EAAE,SAAiB,EAAE,UAAmB;QACtF,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;KAGC;IACD,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA5CD,8CA4CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js deleted file mode 100644 index c8844b9f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js +++ /dev/null @@ -1,94 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PipelineConfiguration = void 0; -const PipelineType_1 = require("./PipelineType"); -const LinkHelper_1 = require("../../model/helpers/LinkHelper"); -class PipelineConfiguration { - constructor($pipelineType, $pipelineId, $projectId, $projectName, $environmentId, $environmentDefinitionId, $usePreviousEnvironment, $teamUri, $accessKey) { - this.pipelineType = $pipelineType; - this.pipelineId = $pipelineId; - this.projectId = $projectId; - this.projectName = $projectName; - this.environmentId = $environmentId; - this.environmentDefinitionId = $environmentDefinitionId; - this.usePreviousEnvironment = $usePreviousEnvironment; - this.teamUri = $teamUri; - this.accessKey = $accessKey; - } - /** - * Getter $pipelineId - * @return {number} - */ - get $pipelineType() { - return this.pipelineType; - } - /** - * Getter $pipelineId - * @return {number} - */ - get $pipelineId() { - return this.pipelineId; - } - /** - * Getter $projectId - * @return {string} - */ - get $projectId() { - return this.projectId; - } - /** - * Getter $projectName - * @return {string} - */ - get $projectName() { - return this.projectName; - } - /** - * Getter $environmentId - * @return {number} - */ - get $environmentId() { - return this.environmentId; - } - /** - * Getter $environmentDefinitionId - * @return {number} - */ - get $environmentDefinitionId() { - return this.environmentDefinitionId; - } - /** - * Getter $usePreviousEnvironment - * @return {boolean} - */ - get $usePreviousEnvironment() { - return this.usePreviousEnvironment; - } - /** - * Getter $teamUri - * @return {string} - */ - get $teamUri() { - return this.teamUri; - } - /** - * Getter $accessKey - * @return {string} - */ - get $accessKey() { - return this.accessKey; - } - getTestTabLink() { - if (this.testTabLink == null) { - if (this.pipelineType == PipelineType_1.PipelineType.Release) { - this.testTabLink = LinkHelper_1.LinkHelper.getTestTabLinkInRelease(this); - } - else if (this.pipelineType == PipelineType_1.PipelineType.Build) { - this.testTabLink = LinkHelper_1.LinkHelper.getTestTabLinkInBuild(this); - } - } - return this.testTabLink; - } -} -exports.PipelineConfiguration = PipelineConfiguration; -//# sourceMappingURL=PipelineConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js.map deleted file mode 100644 index 57b349db..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PipelineConfiguration.js","sourceRoot":"","sources":["PipelineConfiguration.ts"],"names":[],"mappings":";;;AAAA,iDAA8C;AAC9C,+DAA4D;AAE5D,MAAa,qBAAqB;IAYhC,YAAY,aAA2B,EACrC,WAAmB,EACnB,UAAkB,EAClB,YAAoB,EACpB,cAAsB,EACtB,wBAAgC,EAChC,uBAAgC,EAChC,QAAgB,EAChB,UAAkB;QAClB,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;QACpC,IAAI,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;QACxD,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;KAGC;IACD,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;IAGA;IACA,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;YAC5B,IAAI,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC,OAAO,EAAE;gBAC7C,IAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;aAC7D;iBAAM,IAAI,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC,KAAK,EAAE;gBAClD,IAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;aAC3D;SACF;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAlHD,sDAkHC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js deleted file mode 100644 index 630d9589..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PipelineType = void 0; -var PipelineType; -(function (PipelineType) { - PipelineType[PipelineType["Build"] = 0] = "Build"; - PipelineType[PipelineType["Release"] = 1] = "Release"; -})(PipelineType = exports.PipelineType || (exports.PipelineType = {})); -//# sourceMappingURL=PipelineType.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js.map deleted file mode 100644 index a7c978d9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PipelineType.js","sourceRoot":"","sources":["PipelineType.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,iDAAK,CAAA;IACL,qDAAO,CAAA;AACT,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js deleted file mode 100644 index e5a1d7b0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GroupTestResultsBy = void 0; -var GroupTestResultsBy; -(function (GroupTestResultsBy) { - GroupTestResultsBy[GroupTestResultsBy["Priority"] = 0] = "Priority"; - GroupTestResultsBy[GroupTestResultsBy["Run"] = 1] = "Run"; - GroupTestResultsBy[GroupTestResultsBy["Team"] = 2] = "Team"; -})(GroupTestResultsBy = exports.GroupTestResultsBy || (exports.GroupTestResultsBy = {})); -//# sourceMappingURL=GroupTestResultsBy.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js.map deleted file mode 100644 index fa15639d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"GroupTestResultsBy.js","sourceRoot":"","sources":["GroupTestResultsBy.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC5B,mEAAY,CAAA;IACZ,yDAAG,CAAA;IACH,2DAAI,CAAA;AACN,CAAC,EAJW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAI7B"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js deleted file mode 100644 index 770aad71..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportDataConfiguration = void 0; -class ReportDataConfiguration { - constructor($includeCommits, $includeOthersInTotal, $includeEnvironmentInfo, $groupTestSummaryBy, $testResultsConfig) { - this.includeCommits = $includeCommits; - this.includeOthersInTotal = $includeOthersInTotal; - this.includeEnvironmentInfo = $includeEnvironmentInfo; - this.groupTestSummaryBy = $groupTestSummaryBy; - this.testResultsConfig = $testResultsConfig; - } - /** - * Getter $includeCommits - * @return {boolean} - */ - get $includeCommits() { - return this.includeCommits; - } - /** - * Getter $includeOthersInTotal - * @return {boolean} - */ - get $includeOthersInTotal() { - return this.includeOthersInTotal; - } - /** - * Getter $includeEnvironmentInfo - * @return {boolean} - */ - get $includeEnvironmentInfo() { - return this.includeEnvironmentInfo; - } - /** - * Getter $groupTestSummaryBy - * @return {GroupTestResultsBy[]} - */ - get $groupTestSummaryBy() { - return this.groupTestSummaryBy; - } - /** - * Getter $testResultsConfig - * @return {TestResultsConfiguration} - */ - get $testResultsConfig() { - return this.testResultsConfig; - } -} -exports.ReportDataConfiguration = ReportDataConfiguration; -//# sourceMappingURL=ReportDataConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js.map deleted file mode 100644 index 2b4825c2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportDataConfiguration.js","sourceRoot":"","sources":["ReportDataConfiguration.ts"],"names":[],"mappings":";;;AAGA,MAAa,uBAAuB;IAYlC,YAAY,eAAwB,EAAE,qBAA8B,EAAE,uBAAgC,EAAE,mBAAyC,EAAE,kBAA4C;QAC7L,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;QACtC,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC;QAClD,IAAI,CAAC,sBAAsB,GAAG,uBAAuB,CAAC;QACtD,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AA3DD,0DA2DC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js deleted file mode 100644 index faa08b3e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.SendMailCondition = void 0; -var SendMailCondition; -(function (SendMailCondition) { - SendMailCondition[SendMailCondition["Always"] = 0] = "Always"; - SendMailCondition[SendMailCondition["OnFailure"] = 1] = "OnFailure"; - SendMailCondition[SendMailCondition["OnSuccess"] = 2] = "OnSuccess"; - SendMailCondition[SendMailCondition["OnNewFailuresOnly"] = 3] = "OnNewFailuresOnly"; -})(SendMailCondition = exports.SendMailCondition || (exports.SendMailCondition = {})); -//# sourceMappingURL=SendMailCondition.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js.map deleted file mode 100644 index 36ca9571..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SendMailCondition.js","sourceRoot":"","sources":["SendMailCondition.ts"],"names":[],"mappings":";;;AAAA,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,6DAAU,CAAA;IACV,mEAAS,CAAA;IACT,mEAAS,CAAA;IACT,mFAAiB,CAAA;AACnB,CAAC,EALW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAK5B"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js deleted file mode 100644 index 24fb9a79..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js +++ /dev/null @@ -1,65 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsConfiguration = void 0; -class TestResultsConfiguration { - constructor($includeFailedTests, $includePassedTests, $includeInconclusiveTests, $includeNotExecutedTests, $includeOtherTests, $groupTestResultsBy, $maxItemsToShow) { - this.includeFailedTests = $includeFailedTests; - this.includePassedTests = $includePassedTests; - this.includeInconclusiveTests = $includeInconclusiveTests; - this.includeNotExecutedTests = $includeNotExecutedTests; - this.includeOtherTests = $includeOtherTests; - this.groupTestResultsBy = $groupTestResultsBy; - this.maxItemsToShow = $maxItemsToShow; - } - /** - * Getter $includeFailedTests - * @return {boolean} - */ - get $includeFailedTests() { - return this.includeFailedTests; - } - /** - * Getter $includePassedTests - * @return {boolean} - */ - get $includePassedTests() { - return this.includePassedTests; - } - /** - * Getter $includeInconclusiveTests - * @return {boolean} - */ - get $includeInconclusiveTests() { - return this.includeInconclusiveTests; - } - /** - * Getter $includeNotExecutedTests - * @return {boolean} - */ - get $includeNotExecutedTests() { - return this.includeNotExecutedTests; - } - /** - * Getter $includeOtherTests - * @return {boolean} - */ - get $includeOtherTests() { - return this.includeOtherTests; - } - /** - * Getter $groupTestResultsBy - * @return {GroupTestResultsBy} - */ - get $groupTestResultsBy() { - return this.groupTestResultsBy; - } - /** - * Getter $maxItemsToShow - * @return {number} - */ - get $maxItemsToShow() { - return this.maxItemsToShow; - } -} -exports.TestResultsConfiguration = TestResultsConfiguration; -//# sourceMappingURL=TestResultsConfiguration.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js.map deleted file mode 100644 index 0e9bbf3b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultsConfiguration.js","sourceRoot":"","sources":["TestResultsConfiguration.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAwB;IASnC,YAAY,mBAA4B,EAAE,mBAA4B,EAAE,yBAAkC,EAAE,wBAAiC,EAAE,kBAA2B,EAAE,mBAAuC,EAAE,eAAuB;QAC1O,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,wBAAwB,GAAG,yBAAyB,CAAC;QAC1D,IAAI,CAAC,uBAAuB,GAAG,wBAAwB,CAAC;QACxD,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC5C,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,yBAAyB;QAClC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AA1ED,4DA0EC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js deleted file mode 100644 index bfb8da0a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DataProviderError = void 0; -const ReportError_1 = require("./ReportError"); -class DataProviderError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = DataProviderError.name; - } -} -exports.DataProviderError = DataProviderError; -//# sourceMappingURL=DataProviderError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js.map deleted file mode 100644 index c033f135..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DataProviderError.js","sourceRoot":"","sources":["DataProviderError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,iBAAkB,SAAQ,yBAAW;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;IACrC,CAAC;CACF;AALD,8CAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js deleted file mode 100644 index 14470419..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.InputError = void 0; -const ReportError_1 = require("./ReportError"); -class InputError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = InputError.name; - } -} -exports.InputError = InputError; -//# sourceMappingURL=InputError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js.map deleted file mode 100644 index f852e88d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"InputError.js","sourceRoot":"","sources":["InputError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,UAAW,SAAQ,yBAAW;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AALD,gCAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js deleted file mode 100644 index d29437eb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.InvalidTestResultDataError = void 0; -const ReportError_1 = require("./ReportError"); -class InvalidTestResultDataError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = InvalidTestResultDataError.name; - } -} -exports.InvalidTestResultDataError = InvalidTestResultDataError; -//# sourceMappingURL=InvalidTestResultDataError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js.map deleted file mode 100644 index 8dc89501..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"InvalidTestResultDataError.js","sourceRoot":"","sources":["InvalidTestResultDataError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,0BAA2B,SAAQ,yBAAW;IACzD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC;IAC9C,CAAC;CACF;AALD,gEAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js deleted file mode 100644 index d068d533..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MailError = void 0; -const ReportError_1 = require("./ReportError"); -class MailError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = MailError.name; - } -} -exports.MailError = MailError; -//# sourceMappingURL=MailError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js.map deleted file mode 100644 index bf6960bb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MailError.js","sourceRoot":"","sources":["MailError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,SAAU,SAAQ,yBAAW;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF;AALD,8BAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js deleted file mode 100644 index 7545c9e6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MissingDataError = void 0; -const ReportError_1 = require("./ReportError"); -class MissingDataError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = MissingDataError.name; - } -} -exports.MissingDataError = MissingDataError; -//# sourceMappingURL=MissingDataError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js.map deleted file mode 100644 index 5977fecc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MissingDataError.js","sourceRoot":"","sources":["MissingDataError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,gBAAiB,SAAQ,yBAAW;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AALD,4CAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js deleted file mode 100644 index 8ce54ee2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PipelineNotFoundError = void 0; -const ReportError_1 = require("./ReportError"); -class PipelineNotFoundError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = "PipelineNotFoundError"; - } -} -exports.PipelineNotFoundError = PipelineNotFoundError; -//# sourceMappingURL=PipelineNotFoundError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js.map deleted file mode 100644 index 1c02cf11..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PipelineNotFoundError.js","sourceRoot":"","sources":["PipelineNotFoundError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,qBAAsB,SAAQ,yBAAW;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js deleted file mode 100644 index 0402641d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PostProcessorError = void 0; -const ReportError_1 = require("./ReportError"); -class PostProcessorError extends ReportError_1.ReportError { - constructor(message) { - super(message); - this.name = PostProcessorError.name; - } -} -exports.PostProcessorError = PostProcessorError; -//# sourceMappingURL=PostProcessorError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js.map deleted file mode 100644 index 7c84fb52..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PostProcessorError.js","sourceRoot":"","sources":["PostProcessorError.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,MAAa,kBAAmB,SAAQ,yBAAW;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACtC,CAAC;CACF;AALD,gDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js deleted file mode 100644 index ab69ab25..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js +++ /dev/null @@ -1,27 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportError = void 0; -const util_1 = require("util"); -class ReportError extends Error { - constructor(message) { - super(message); - } - getMessage() { - const stack = util_1.isNullOrUndefined(this.innerError) || util_1.isNullOrUndefined(this.innerError.stack) ? this.stack : - `${this.stack}\r\nInnerError:${this.innerError.message}: ${this.innerError.stack}`; - return `${this.name}: ${this.message}\r\n ${stack}`; - } - static HandleError(err, rethrow = false) { - if (err instanceof ReportError) { - console.error(err.getMessage()); - } - else { - console.error(err); - } - if (rethrow) { - throw err; - } - } -} -exports.ReportError = ReportError; -//# sourceMappingURL=ReportError.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js.map deleted file mode 100644 index 505bc060..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportError.js","sourceRoot":"","sources":["ReportError.ts"],"names":[],"mappings":";;;AAAA,+BAAyC;AAEzC,MAAsB,WAAY,SAAQ,KAAK;IAE7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAEM,UAAU;QACf,MAAM,KAAK,GAAG,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzG,GAAG,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACpF,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,QAAQ,KAAK,EAAE,CAAC;IACtD,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,GAAU,EAAE,UAAmB,KAAK;QAC5D,IAAG,GAAG,YAAY,WAAW,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAE,GAAmB,CAAC,UAAU,EAAE,CAAC,CAAC;SAClD;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpB;QAED,IAAG,OAAO,EAAE;YACV,MAAM,GAAG,CAAC;SACX;IACH,CAAC;CACF;AAvBD,kCAuBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js deleted file mode 100644 index 859c6c18..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.HTMLReportCreator = void 0; -const EmailReportViewModel_1 = require("../model/viewmodel/EmailReportViewModel"); -const fs = require("fs"); -const o2x = require('object-to-xml'); -const xsltProcessor = require("xslt-processor"); -const { xmlParse, xsltProcess } = xsltProcessor; -class HTMLReportCreator { - createHtmlReport(report, reportConfiguration) { - const currDir = __dirname; - console.log(`CurrentDir: ${currDir}`); - var xsltTemplatePath = `${currDir}\\EmailTemplate.xslt`; - console.log("Loading Email Template: " + xsltTemplatePath); - // Create a view model object before serialize to xml - const reportViewModel = new EmailReportViewModel_1.EmailReportViewModel(report, reportConfiguration); - // Serialize gathered data into xml - const xmlString = "" + o2x(reportViewModel) + ""; - // Read XSLT email template - const buffer = fs.readFileSync(xsltTemplatePath); - // Parse the xml string as XmlDocument/Node - const xmlDoc = xmlParse(xmlString, "text/xml"); - // Parse XSLT as XMLDocument - const xsltDoc = xmlParse(buffer.toString(), "application/xml"); - // Fill the XSLT document template with the xml doc data - let outXmlString = xsltProcess(xmlDoc, xsltDoc); - // XML parsing changes
to special chars if they are part of xml nodevalues. Do string replace to fix the jankiness for HTML. - outXmlString = outXmlString.split("<br/>").join("
"); - return outXmlString; - } -} -exports.HTMLReportCreator = HTMLReportCreator; -//# sourceMappingURL=HTMLReportCreator.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js.map deleted file mode 100644 index a6461dec..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"HTMLReportCreator.js","sourceRoot":"","sources":["HTMLReportCreator.ts"],"names":[],"mappings":";;;AAAA,kFAA+E;AAI/E,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AACrC,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAChD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;AAEhD,MAAa,iBAAiB;IAE5B,gBAAgB,CAAC,MAAc,EAAE,mBAAwC;QACvE,MAAM,OAAO,GAAG,SAAS,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QACtC,IAAI,gBAAgB,GAAG,GAAG,OAAO,sBAAsB,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,gBAAgB,CAAC,CAAC;QAE3D,qDAAqD;QACrD,MAAM,eAAe,GAAG,IAAI,2CAAoB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC9E,oCAAoC;QACpC,MAAM,SAAS,GAAW,wBAAwB,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,yBAAyB,CAAC;QACtG,4BAA4B;QAC5B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACjD,2CAA2C;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC/C,4BAA4B;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAC/D,wDAAwD;QACxD,IAAI,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,kIAAkI;QAClI,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAxBD,8CAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js deleted file mode 100644 index f626ba20..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IHTMLReportCreator.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js.map deleted file mode 100644 index 9ec8a16e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IHTMLReportCreator.js","sourceRoot":"","sources":["IHTMLReportCreator.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js deleted file mode 100644 index 239f955d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const ReportConfiguration_1 = require("./config/ReportConfiguration"); -const ConfigurationProvider_1 = require("./config/ConfigurationProvider"); -const ReportManager_1 = require("./ReportManager"); -const ReportProvider_1 = require("./providers/ReportProvider"); -const DataProviderFactory_1 = require("./providers/DataProviderFactory"); -const HTMLReportCreator_1 = require("./htmlreport/HTMLReportCreator"); -const EmailSender_1 = require("./EmailSender"); -const ReportError_1 = require("./exceptions/ReportError"); -const TelemetryLogger_1 = require("./telemetry/TelemetryLogger"); -function run() { - return __awaiter(this, void 0, void 0, function* () { - try { - console.log('Node Version: ' + process.version); - const configProvider = new ConfigurationProvider_1.ConfigurationProvider(); - const reportConfiguration = new ReportConfiguration_1.ReportConfiguration(configProvider); - const reportProvider = new ReportProvider_1.ReportProvider(new DataProviderFactory_1.DataProviderFactory(configProvider.getPipelineConfiguration())); - // Log telemetry: Task Inputs and Configuration - TelemetryLogger_1.TelemetryLogger.LogTaskConfig(reportConfiguration); - const reportManager = new ReportManager_1.ReportManager(reportProvider, new HTMLReportCreator_1.HTMLReportCreator(), new EmailSender_1.EmailSender()); - const mailSent = yield reportManager.sendReportAsync(reportConfiguration); - if (mailSent) { - // Wait for 10 sec and timeout - let val = yield Promise.race([sleep(10000), setEmailSentVariable(mailSent)]); - if (!val) { - console.log("Unable to set variable value in 10 sec. Exiting task."); - } - } - } - catch (err) { - if (err instanceof ReportError_1.ReportError) { - console.log(err.getMessage()); - } - else { - console.log(err); - } - // Fail task - throw err; - } - finally { - console.log("Task Processing Complete."); - } - }); -} -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms, false)); -} -function setEmailSentVariable(mailSent) { - return __awaiter(this, void 0, void 0, function* () { - console.log("Setting EmailReportTask.EmailSent Variable value."); - console.log(`##vso[task.setvariable variable=EmailReportTask.EmailSent;]${mailSent}`); - console.log(`EmailReportTask.EmailSent Variable value set as ${mailSent}`); - return true; - }); -} -run(); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js.map deleted file mode 100644 index c285d1a8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,sEAAmE;AACnE,0EAAuE;AACvE,mDAAgD;AAChD,+DAA4D;AAC5D,yEAAsE;AACtE,sEAAmE;AACnE,+CAA4C;AAC5C,0DAAuD;AACvD,iEAA8D;AAE9D,SAAe,GAAG;;QAChB,IAAI;YAEF,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAEhD,MAAM,cAAc,GAAG,IAAI,6CAAqB,EAAE,CAAC;YACnD,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,CAAC,cAAc,CAAC,CAAC;YACpE,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,yCAAmB,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAE9G,+CAA+C;YAC/C,iCAAe,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YAEnD,MAAM,aAAa,GAAG,IAAI,6BAAa,CACrC,cAAc,EACd,IAAI,qCAAiB,EAAE,EACvB,IAAI,yBAAW,EAAE,CAAC,CAAC;YAErB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YAC1E,IAAG,QAAQ,EAAE;gBACX,8BAA8B;gBAC9B,IAAI,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAG,CAAC,GAAG,EAAE;oBACP,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;iBACtE;aACF;SACF;QACD,OAAO,GAAG,EAAE;YACV,IAAI,GAAG,YAAY,yBAAW,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;aAC/B;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClB;YACD,YAAY;YACZ,MAAM,GAAG,CAAC;SACX;gBACO;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;SAC1C;IACH,CAAC;CAAA;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAe,oBAAoB,CAAC,QAAiB;;QACnD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,8DAA8D,QAAQ,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;CAAA;AAED,GAAG,EAAE,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js deleted file mode 100644 index 90c7aa30..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js +++ /dev/null @@ -1,79 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildReport = void 0; -const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); -const Report_1 = require("./Report"); -const util_1 = require("util"); -const PipelineConfiguration_1 = require("../config/pipeline/PipelineConfiguration"); -const PipelineType_1 = require("../config/pipeline/PipelineType"); -const BuildReferenceViewModel_1 = require("./viewmodel/BuildReferenceViewModel"); -class BuildReport extends Report_1.Report { - setBuildData($build, $timeline, $lastCompletedBuild, $lastCompletedTimeline, $phases, $changes) { - this.build = $build; - this.timeline = $timeline; - this.lastCompletedBuild = $lastCompletedBuild; - this.lastCompletedTimeline = $lastCompletedTimeline; - this.phases = $phases; - this.associatedChanges = $changes; - } - hasPrevGotSameFailures() { - if (this.lastCompletedBuild == null) { - return false; - } - console.log(`Using Last Completed Build: '${this.lastCompletedBuild.id}'.`); - if (this.lastCompletedBuild.id > this.build.id) { - // We are in a situation where current build completed latter compared to the newer one - // Newer one would have already evaluated the failures and sent a mail to committers anyway - // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer - // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line - return true; - } - return null; - } - hasFailedTasks() { - return this.timelineHasFailedTasks(this.timeline); - } - hasPrevFailedTasks() { - return this.timelineHasFailedTasks(this.lastCompletedTimeline); - } - arePrevFailedTasksSame() { - var prevfailedTask = this.getTasksByResultinTimeline(this.lastCompletedTimeline, BuildInterfaces_1.TaskResult.Failed)[0]; - var currentFailedTask = this.getTasksByResultinTimeline(this.timeline, BuildInterfaces_1.TaskResult.Failed)[0]; - // if both releases failed without executing any tasks, then they can be null - // otherwise, use name matching - return (prevfailedTask == null && currentFailedTask == null) - || (!util_1.isNullOrUndefined(prevfailedTask) && !util_1.isNullOrUndefined(currentFailedTask) && prevfailedTask.name.toLowerCase() == currentFailedTask.name.toLowerCase()); - } - getPrevConfig(config) { - var buildConfig = new PipelineConfiguration_1.PipelineConfiguration(PipelineType_1.PipelineType.Build, this.lastCompletedBuild.id, config.$projectId, config.$projectName, null, null, config.$usePreviousEnvironment, config.$teamUri, config.$accessKey); - return buildConfig; - } - getEnvironmentStatus() { - if (this.hasFailedTasks()) { - return "Failed"; - } - else if (this.getTasksByResultinTimeline(this.timeline, BuildInterfaces_1.TaskResult.SucceededWithIssues).length > 0) { - return "Partially Succeeded"; - } - else { - return "Succeeded"; - } - } - getPipelineViewModel(config) { - return new BuildReferenceViewModel_1.BuildReferenceViewModel(config, null, this.build); - } - getArtifactViewModels(config) { - return []; - } - hasCanceledPhases() { - return false; - } - timelineHasFailedTasks(timeLine) { - return this.getTasksByResultinTimeline(timeLine, BuildInterfaces_1.TaskResult.Failed).length > 0; - } - getTasksByResultinTimeline(timeLine, taskResult) { - return this.timeline == null || this.timeline.records == null ? [] : this.timeline.records.filter(r => r.result == taskResult); - } -} -exports.BuildReport = BuildReport; -//# sourceMappingURL=BuildReport.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js.map deleted file mode 100644 index 3811e9f5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildReport.js","sourceRoot":"","sources":["BuildReport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js deleted file mode 100644 index 615c8481..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ChangeModel = void 0; -class ChangeModel { - constructor($id, $author, $location, $timeStamp, $message) { - this.id = $id; - this.author = $author; - this.location = $location; - this.timeStamp = $timeStamp; - this.message = $message; - } - /** - * Getter $id - * @return {string} - */ - get $id() { - return this.id; - } - /** - * Getter $author - * @return {IdentityRef} - */ - get $author() { - return this.author; - } - /** - * Getter $location - * @return {string} - */ - get $location() { - return this.location; - } - /** - * Getter $timeStamp - * @return {Date} - */ - get $timeStamp() { - return this.timeStamp; - } - /** - * Getter $message - * @return {string} - */ - get $message() { - return this.message; - } -} -exports.ChangeModel = ChangeModel; -//# sourceMappingURL=ChangeModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js.map deleted file mode 100644 index 590feb10..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ChangeModel.js","sourceRoot":"","sources":["ChangeModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,WAAW;IAQtB,YAAY,GAAW,EAAE,OAAoB,EAAE,SAAiB,EAAE,UAAgB,EAAE,QAAgB;QAClG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAvDD,kCAuDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js deleted file mode 100644 index 957d866e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.IssueModel = void 0; -class IssueModel { - constructor($issueType, $message) { - this.message = $message; - this.issueType = $issueType; - } - /** - * Getter $message - * @return {string} - */ - get $message() { - return this.message; - } - /** - * Getter $issueType - * @return {string} - */ - get $issueType() { - return this.issueType; - } -} -exports.IssueModel = IssueModel; -//# sourceMappingURL=IssueModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js.map deleted file mode 100644 index e1100e93..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IssueModel.js","sourceRoot":"","sources":["IssueModel.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;IAKrB,YAAY,UAAkB,EAAE,QAAgB;QAC9C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAzBD,gCAyBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js deleted file mode 100644 index 8c8162b7..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.JobModel = void 0; -class JobModel { - constructor($jobName, $jobStatus, $issues, $tasks) { - this.tasks = $tasks; - this.jobStatus = $jobStatus; - this.issues = $issues; - this.jobName = $jobName; - } - /** - * Getter $jobName - * @return {string} - */ - get $jobName() { - return this.jobName; - } - /** - * Getter $issues - * @return {IssueModel[]} - */ - get $issues() { - return this.issues; - } - /** - * Getter $tasks - * @return {TaskModel[]} - */ - get $tasks() { - return this.tasks; - } - /** - * Getter $jobStatus - * @return {TaskStatus} - */ - get $jobStatus() { - return this.jobStatus; - } -} -exports.JobModel = JobModel; -//# sourceMappingURL=JobModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js.map deleted file mode 100644 index 600b4903..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"JobModel.js","sourceRoot":"","sources":["JobModel.ts"],"names":[],"mappings":";;;AAIA,MAAa,QAAQ;IAOnB,YAAY,QAAgB,EAAE,UAAsB,EAAE,OAAqB,EAAE,MAAmB;QAC9F,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACD,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;KAGC;IACD,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA7CD,4BA6CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js deleted file mode 100644 index 28608efa..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PhaseModel = void 0; -class PhaseModel { - constructor($name, $jobs, $status, $rank) { - this.name = $name; - this.jobs = $jobs; - this.status = $status; - this.rank = $rank; - } - /** - * Getter $name - * @return {string} - */ - get $name() { - return this.name; - } - /** - * Getter $jobs - * @return {JobModel[]} - */ - get $jobs() { - return this.jobs; - } - /** - * Getter $status - * @return {string} - */ - get $status() { - return this.status; - } - /** - * Getter $rank - * @return {number} - */ - get $rank() { - return this.rank; - } -} -exports.PhaseModel = PhaseModel; -//# sourceMappingURL=PhaseModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js.map deleted file mode 100644 index 18d51840..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PhaseModel.js","sourceRoot":"","sources":["PhaseModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAOrB,YAAY,KAAa,EAAE,KAAiB,EAAE,OAAe,EAAE,KAAa;QAC1E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AA7CD,gCA6CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js deleted file mode 100644 index 6f58a957..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js +++ /dev/null @@ -1,179 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseReport = void 0; -const Report_1 = require("./Report"); -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const PipelineConfiguration_1 = require("../config/pipeline/PipelineConfiguration"); -const ArtifactViewModel_1 = require("./viewmodel/ArtifactViewModel"); -const ReleaseViewModel_1 = require("./viewmodel/ReleaseViewModel"); -const util_1 = require("util"); -class ReleaseReport extends Report_1.Report { - constructor() { - super(...arguments); - this.artifacts = []; - } - setReleaseData($release, $environment, $lastCompletedRelease, $phases, $changes, $lastCompletedEnvironment) { - this.artifacts = $release.artifacts == null ? [] : $release.artifacts; - this.createdBy = $release.createdBy; - this.phases = $phases; - this.associatedChanges = $changes; - this.release = $release; - this.environment = $environment; - this.lastCompletedRelease = $lastCompletedRelease; - if ($lastCompletedEnvironment == null) { - if ($lastCompletedRelease != null && $lastCompletedRelease.environments != null) { - var lastEnvironments = $lastCompletedRelease.environments.filter(e => e.definitionEnvironmentId == $environment.definitionEnvironmentId); - if (lastEnvironments != null && lastEnvironments.length > 0) { - this.lastCompletedEnvironment = lastEnvironments[0]; - } - } - } - else { - this.lastCompletedEnvironment = $lastCompletedEnvironment; - } - } - /** - * Getter $artifacts - * @return {Artifact[]} - */ - get $artifacts() { - return this.artifacts; - } - /** - * Getter $release - * @return {Release} - */ - get $release() { - return this.release; - } - /** - * Getter $environment - * @return {ReleaseEnvironment} - */ - get $environment() { - return this.environment; - } - /** - * Getter $lastCompletedRelease - * @return {Release} - */ - get $lastCompletedRelease() { - return this.lastCompletedRelease; - } - /** - * Getter $lastCompletedEnvironment - * @return {ReleaseEnvironment} - */ - get $lastCompletedEnvironment() { - return this.lastCompletedEnvironment; - } - hasPrevGotSameFailures() { - const lastId = this.lastCompletedRelease == null ? "null" : this.lastCompletedRelease.id; - console.log(`Using Last Completed Release: '${lastId}'`); - if (this.lastCompletedRelease == null || this.$lastCompletedEnvironment == null) { - return false; - } - if (lastId > this.release.id) { - // We are in a situation where current build completed latter compared to the newer one - // Newer one would have already evaluated the failures and sent a mail to committers anyway - // No need to send mail again because there won't be any committers in this mail as associated changes are already evaluated by newer - // Treat as same failures because it would be noise to M2s and other standard owners in the To-Line - return true; - } - return null; - } - hasFailedTasks() { - const tasks = this.getReleaseTasks(this.environment); - return tasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed).length > 0; - } - hasPrevFailedTasks() { - const tasks = this.getReleaseTasks(this.lastCompletedEnvironment); - return tasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed).length > 0; - } - arePrevFailedTasksSame() { - const lastTasks = this.getReleaseTasks(this.lastCompletedEnvironment); - const lastFailedTasks = lastTasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed); - var prevfailedTask = lastFailedTasks.length > 0 ? lastFailedTasks[0] : null; - const currentTasks = this.getReleaseTasks(this.environment); - const currentFailedTasks = currentTasks.filter(task => task.status == ReleaseInterfaces_1.TaskStatus.Failed); - var currfailedTask = currentFailedTasks.length > 0 ? currentFailedTasks[0] : null; - const prevfailedTaskName = prevfailedTask == null ? "" : prevfailedTask.name; - const currfailedTaskName = currfailedTask == null ? "" : currfailedTask.name; - // if both releases failed without executing any tasks, then they can be null - // otherwise, use name matching - return (prevfailedTask == null && currfailedTask == null) || prevfailedTaskName == currfailedTaskName; - } - getPrevConfig(config) { - if (util_1.isNullOrUndefined(this.lastCompletedRelease) || util_1.isNullOrUndefined(this.lastCompletedEnvironment)) { - return null; - } - var prevConfig = new PipelineConfiguration_1.PipelineConfiguration(config.$pipelineType, this.lastCompletedRelease.id, config.$projectId, config.$projectName, this.lastCompletedEnvironment.id, this.lastCompletedEnvironment.definitionEnvironmentId, config.$usePreviousEnvironment, config.$teamUri, config.$accessKey); - return prevConfig; - } - getEnvironmentStatus() { - if (this.hasFailedTasks() || this.hasCanceledPhases()) { - return "Failed"; - } - else if (this.hasPartiallySucceededTasks(this.environment)) { - return "Partially Succeeded"; - } - else { - return "Succeeded"; - } - } - hasPartiallySucceededTasks(source) { - if (source == null) { - return false; - } - const tasks = this.getReleaseTasks(source); - return tasks.filter(t => t.status == ReleaseInterfaces_1.TaskStatus.PartiallySucceeded).length > 0; - } - hasCanceledPhases() { - if (this.phases == null) { - return false; - } - const jobs = []; - this.phases.forEach(p => { - if (p.$jobs != null) { - p.$jobs.forEach(j => { - if (j.$jobStatus == ReleaseInterfaces_1.TaskStatus.Canceled) { - jobs.push(j); - } - }); - } - }); - return jobs.length > 0; - } - getPipelineViewModel(config) { - return new ReleaseViewModel_1.ReleaseViewModel(this.environment, config); - } - getArtifactViewModels(config) { - var artifacts = []; - if (this.artifacts != null && this.artifacts.length > 0) { - this.artifacts.forEach(artifact => { - artifacts.push(new ArtifactViewModel_1.ArtifactViewModel(artifact, config)); - }); - } - return artifacts; - } - getReleaseTasks(source) { - const tasks = []; - if (source != null && source.deploySteps != null && source.deploySteps.length > 0) { - let attempt = 0; - let deploymentAttempt = source.deploySteps[0]; - for (var i = 0; i < source.deploySteps.length; i++) { - if (source.deploySteps[i].attempt > attempt) { - deploymentAttempt = source.deploySteps[i]; - } - } - deploymentAttempt.releaseDeployPhases.forEach(releaseDeployPhase => { - releaseDeployPhase.deploymentJobs.forEach(deploymentJob => { - tasks.push(...deploymentJob.tasks); - }); - }); - } - return tasks; - } -} -exports.ReleaseReport = ReleaseReport; -//# sourceMappingURL=ReleaseReport.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js.map deleted file mode 100644 index f45029cf..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseReport.js","sourceRoot":"","sources":["ReleaseReport.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAClC,0FAAuJ;AAGvJ,oFAAiF;AAEjF,qEAAkE;AAClE,mEAAgE;AAChE,+BAAyC;AAEzC,MAAa,aAAc,SAAQ,eAAM;IAAzC;;QAEU,cAAS,GAAe,EAAE,CAAC;IA4MrC,CAAC;IAtMQ,cAAc,CAAC,QAAiB,EAAE,YAAgC,EAAE,qBAA8B,EAAE,OAAqB,EAAE,QAAuB,EAAE,yBAA8C;QACvM,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QAElC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC;QAElD,IAAI,yBAAyB,IAAI,IAAI,EAAE;YACrC,IAAI,qBAAqB,IAAI,IAAI,IAAI,qBAAqB,CAAC,YAAY,IAAI,IAAI,EAAE;gBAC/E,IAAI,gBAAgB,GAAG,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,IAAI,YAAY,CAAC,uBAAuB,CAAC,CAAC;gBACzI,IAAI,gBAAgB,IAAI,IAAI,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3D,IAAI,CAAC,wBAAwB,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;iBACrD;aACF;SACF;aACI;YACH,IAAI,CAAC,wBAAwB,GAAG,yBAAyB,CAAC;SAC3D;IACH,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED;;;KAGC;IACD,IAAW,yBAAyB;QAClC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;IAEM,sBAAsB;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,kCAAkC,MAAM,GAAG,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,IAAI,IAAI,CAAC,yBAAyB,IAAI,IAAI,EAAE;YAC/E,OAAO,KAAK,CAAC;SACd;QAED,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;YAC5B,uFAAuF;YACvF,2FAA2F;YAC3F,qIAAqI;YACrI,mGAAmG;YACnG,OAAO,IAAI,CAAC;SACb;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,cAAc;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,8BAAU,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3E,CAAC;IAEM,kBAAkB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,8BAAU,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3E,CAAC;IAEM,sBAAsB;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtE,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,8BAAU,CAAC,MAAM,CAAC,CAAC;QACnF,IAAI,cAAc,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE5E,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,8BAAU,CAAC,MAAM,CAAC,CAAC;QACzF,IAAI,cAAc,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAElF,MAAM,kBAAkB,GAAG,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;QAC7E,MAAM,kBAAkB,GAAG,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;QAC7E,8EAA8E;QAC9E,+BAA+B;QAC/B,OAAO,CAAC,cAAc,IAAI,IAAI,IAAI,cAAc,IAAI,IAAI,CAAC,IAAI,kBAAkB,IAAI,kBAAkB,CAAC;IACxG,CAAC;IAEM,aAAa,CAAC,MAA6B;QAChD,IAAG,wBAAiB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,wBAAiB,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE;YACnG,OAAO,IAAI,CAAC;SACb;QACD,IAAI,UAAU,GAAG,IAAI,6CAAqB,CACxC,MAAM,CAAC,aAAa,EACpB,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAC5B,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,YAAY,EACnB,IAAI,CAAC,wBAAwB,CAAC,EAAE,EAChC,IAAI,CAAC,wBAAwB,CAAC,uBAAuB,EACrD,MAAM,CAAC,uBAAuB,EAC9B,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,UAAU,CAAC,CAAC;QAErB,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,oBAAoB;QACzB,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;YACrD,OAAO,QAAQ,CAAC;SACjB;aACI,IAAI,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC1D,OAAO,qBAAqB,CAAC;SAC9B;aACI;YACH,OAAO,WAAW,CAAC;SACpB;IACH,CAAC;IAEO,0BAA0B,CAAC,MAA0B;QAC3D,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,OAAO,KAAK,CAAC;SACd;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,8BAAU,CAAC,kBAAkB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,CAAC;IAEM,iBAAiB;QACtB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;YACvB,OAAO,KAAK,CAAC;SACd;QACD,MAAM,IAAI,GAAe,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACtB,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE;gBACnB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAClB,IAAI,CAAC,CAAC,UAAU,IAAI,8BAAU,CAAC,QAAQ,EAAE;wBACvC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBACd;gBACH,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;IAEM,oBAAoB,CAAC,MAA6B;QACvD,OAAO,IAAI,mCAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAEM,qBAAqB,CAAC,MAA6B;QACxD,IAAI,SAAS,GAAwB,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACvD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAChC,SAAS,CAAC,IAAI,CAAC,IAAI,qCAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;SACJ;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,eAAe,CAAC,MAA0B;QAC/C,MAAM,KAAK,GAAkB,EAAE,CAAC;QAEhC,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACjF,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,iBAAiB,GAAsB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACjE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC1D,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE;oBAC3C,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;iBAC3C;aACF;YAED,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;gBACjE,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;oBACxD,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;SACJ;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA9MD,sCA8MC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js deleted file mode 100644 index acded510..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js +++ /dev/null @@ -1,99 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Report = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const util_1 = require("util"); -class Report { - constructor() { - this.dataMissing = false; - this.sendMailConditionSatisfied = false; - this.associatedChanges = []; - this.phases = []; - this.failedTestOwners = []; - this.filteredResults = []; - this.hasFilteredTests = false; - this.testSummaryGroups = []; - } - /** - * Getter $dataMissing - * @return {boolean} - */ - get $dataMissing() { - return this.dataMissing; - } - /** - * Getter $associatedChanges - * @return {ChangeModel[]} - */ - get $associatedChanges() { - return this.associatedChanges; - } - /** - * Getter $associatedChanges - * @return {ChangeModel[]} - */ - get $phases() { - return this.phases; - } - /** - * Getter $sendMailConditionSatisfied - * @return {boolean} - */ - get $sendMailConditionSatisfied() { - return this.sendMailConditionSatisfied; - } - /** - * Setter $dataMissing - * @param {boolean} value - */ - set $dataMissing(value) { - this.dataMissing = value; - } - /** - * Setter $sendMailConditionSatisfied - * @param {boolean} value - */ - set $sendMailConditionSatisfied(value) { - this.sendMailConditionSatisfied = value; - } - /** - * Getter $testSummaryGroups - * @return {TestSummaryGroupModel[]} - */ - get $testSummaryGroups() { - return this.testSummaryGroups; - } - /** - * Getter $failedTestOwners - * @return {IdentityRef[] } - */ - get $failedTestOwners() { - return this.failedTestOwners; - } - hasFailedTests(includeOthersInTotal) { - if (util_1.isNullOrUndefined(this.testResultSummary)) { - return false; - } - if (!includeOthersInTotal) { - return this.getTestCountForOutcome(TestInterfaces_1.TestOutcome.Failed) > 0; - } - // Others need to be included - Calculate failed as (total - passed) - const passedCount = this.getTestCountForOutcome(TestInterfaces_1.TestOutcome.Passed); - if (passedCount > 0) { - return (this.testResultSummary.aggregatedResultsAnalysis.totalTests - passedCount) > 0; - } - // If no passed tests, then anything ran should be considered as failed since "other" outcomes need to be considered as failures - // if no tests ran, then we don't have failed tests - return this.testResultSummary.aggregatedResultsAnalysis.totalTests > 0; - } - getTestCountForOutcome(outcome) { - const resultsByOutcome = this.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome; - let testsForOutcome = 0; - if (!util_1.isNullOrUndefined(resultsByOutcome) && !util_1.isNullOrUndefined(resultsByOutcome[outcome])) { - testsForOutcome += resultsByOutcome[outcome].count; - } - return testsForOutcome; - } -} -exports.Report = Report; -//# sourceMappingURL=Report.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js.map deleted file mode 100644 index 7d2f9b8c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Report.js","sourceRoot":"","sources":["Report.ts"],"names":[],"mappings":";;;AAIA,oFAA6H;AAG7H,+BAAyC;AAKzC,MAAsB,MAAM;IAA5B;QACU,gBAAW,GAAY,KAAK,CAAC;QAE7B,+BAA0B,GAAY,KAAK,CAAC;QAI1C,sBAAiB,GAAkB,EAAE,CAAC;QAEtC,WAAM,GAAiB,EAAE,CAAC;QAE5B,qBAAgB,GAAkB,EAAE,CAAC;QAEtC,oBAAe,GAA4B,EAAE,CAAC;QAE9C,qBAAgB,GAAY,KAAK,CAAC;QAEjC,sBAAiB,GAA4B,EAAE,CAAC;IAqH1D,CAAC;IAjHC;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;IAGA;IACA,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B;QACpC,OAAO,IAAI,CAAC,0BAA0B,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B,CAAC,KAAc;QACnD,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAGD;;;OAGG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAkBM,cAAc,CAAC,oBAA6B;QACjD,IAAI,wBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;YAC7C,OAAO,KAAK,CAAC;SACd;QAED,IAAI,CAAC,oBAAoB,EAAE;YACzB,OAAO,IAAI,CAAC,sBAAsB,CAAC,4BAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC5D;QAED,oEAAoE;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,WAAW,GAAG,CAAC,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;SACxF;QAED,gIAAgI;QAChI,oDAAoD;QACpD,OAAO,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,UAAU,GAAG,CAAC,CAAC;IACzE,CAAC;IAEO,sBAAsB,CAAC,OAAoB;QACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;QAEzF,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE;YACzF,eAAe,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;SACpD;QAED,OAAO,eAAe,CAAC;IAC3B,CAAC;CAGF;AAtID,wBAsIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js deleted file mode 100644 index 1d372832..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportFactory = void 0; -const ReleaseReport_1 = require("./ReleaseReport"); -const PipelineType_1 = require("../config/pipeline/PipelineType"); -const BuildReport_1 = require("./BuildReport"); -class ReportFactory { - static createNewReport(pipelineConfig) { - return (pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build) ? new BuildReport_1.BuildReport() : new ReleaseReport_1.ReleaseReport(); - } - static mergeReports(reports) { - if (reports == null || reports.length == 0) - return null; - if (reports.length == 1) - return reports[0]; - let finalReport = reports[0]; - for (var i = 1; i < reports.length; i++) { - finalReport = ReportFactory.mergeTwoReports(finalReport, reports[i]); - } - return finalReport; - } - static mergeTwoReports(source, target) { - let associatedChanges = []; - let phases = []; - if (target.$testSummaryGroups != null) { - source.$testSummaryGroups.push(...target.$testSummaryGroups); - } - if (target.$associatedChanges != null) { - associatedChanges = target.$associatedChanges; - } - if (target.$failedTestOwners != null) { - source.$failedTestOwners.push(...target.$failedTestOwners); - } - if (target.filteredResults != null) { - source.filteredResults = target.filteredResults; - } - if (target.hasFilteredTests) { - source.hasFilteredTests = target.hasFilteredTests; - } - if (target.testResultSummary != null) { - source.testResultSummary = target.testResultSummary; - } - if (target.$phases != null) { - phases = target.$phases; - } - if (source instanceof ReleaseReport_1.ReleaseReport) { - var releaseTarget = target; - var releaseSource = source; - let targetRelease = null; - let targetEnv = null; - let targetLastRelease = null; - let targetLastEnv = null; - if (releaseTarget.$release != null) { - targetRelease = releaseTarget.$release; - } - if (releaseTarget.$environment != null) { - targetEnv = releaseTarget.$environment; - } - if (releaseTarget.$lastCompletedEnvironment != null) { - targetLastRelease = releaseTarget.$lastCompletedRelease; - } - if (releaseTarget.$lastCompletedEnvironment != null) { - targetLastEnv = releaseTarget.$lastCompletedEnvironment; - } - if (targetRelease != null) { - releaseSource.setReleaseData(targetRelease, targetEnv, targetLastRelease, phases, associatedChanges, targetLastEnv); - } - } - return source; - } -} -exports.ReportFactory = ReportFactory; -//# sourceMappingURL=ReportFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js.map deleted file mode 100644 index 46ca8c40..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportFactory.js","sourceRoot":"","sources":["ReportFactory.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js deleted file mode 100644 index 0e7a9d5c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskModel = void 0; -class TaskModel { - constructor($name, $status, $issues, $agentName, $finishTime, $startTime) { - this.name = $name; - this.status = $status; - this.issues = $issues; - this.agentName = $agentName; - this.finishTime = $finishTime; - this.startTime = $startTime; - } - /** - * Getter $name - * @return {string} - */ - get $name() { - return this.name; - } - /** - * Getter $status - * @return {TaskStatus} - */ - get $status() { - return this.status; - } - /** - * Getter $issues - * @return {IssueModel[]} - */ - get $issues() { - return this.issues; - } - /** - * Getter $agentName - * @return {string} - */ - get $agentName() { - return this.agentName; - } - /** - * Getter $finishTime - * @return {Date} - */ - get $finishTime() { - return this.finishTime; - } - /** - * Getter $startTime - * @return {Date} - */ - get $startTime() { - return this.startTime; - } -} -exports.TaskModel = TaskModel; -//# sourceMappingURL=TaskModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js.map deleted file mode 100644 index de1c9842..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskModel.js","sourceRoot":"","sources":["TaskModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,SAAS;IASpB,YAAY,KAAa,EAAE,OAAmB,EAAE,OAAqB,EAAE,UAAkB,EAAE,WAAiB,EAAE,UAAgB;QAC5H,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAjED,8BAiEC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js deleted file mode 100644 index df8c399f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js +++ /dev/null @@ -1,125 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LinkHelper = void 0; -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -class LinkHelper { - static getBuildDefinitionLinkById(definitionId, config) { - var collectionUri = config.$teamUri; - var parameters = new Map(); - parameters.set("definitionId", definitionId.toString()); - parameters.set("_a", "summary"); - var uri = this.getBuildLink(config, collectionUri, parameters); - return uri; - } - static getBuildLink(config, collectionUri, parameters) { - return collectionUri + "/" + this.getBuildRelativeUrl(config.$projectName) + "/results" + this.getQueryParameter(parameters); - } - static getCommitLink(changeId, changeUri, config) { - var collectionUri = config.$teamUri; - let repoId = null; - var pos = changeUri.indexOf("repositories"); - if (pos > 0) { - repoId = changeUri.substr(pos).split("/")[1]; - } - var uri = collectionUri + `/${config.$projectName}/_git/${repoId}/commit/${changeId})`; - return uri; - } - static getCreateBugLinkForTest(config, testResult) { - const testRunId = testResult.testRun == null ? null : testResult.testRun.id; - const parameters = new Map(); - parameters.set("create-bug", "true"); - return LinkHelper.getTestResultLink(config, testRunId, testResult.id, parameters); - } - static getQueryParameter(parameterValues) { - var queryString = ""; - parameterValues.forEach((value, key) => { - queryString = (queryString == "") - ? "?" + key + "=" + value - : queryString + "&" + key + "=" + value; - }); - return queryString; - } - static getReleaseDefinitionLink(config, releaseDefinitionId) { - var collectionUri = config.$teamUri; - const parameters = new Map(); - parameters.set("definitionId", releaseDefinitionId.toString()); - parameters.set("_a", "environments-editor"); - return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseDefView + "/" + LinkHelper.getQueryParameter(parameters); - } - static getReleaseLogsTabLink(config) { - var collectionUri = config.$teamUri; - const queryParams = new Map(); - queryParams.set("releaseId", config.$pipelineId.toString()); - queryParams.set("_a", LinkHelper.ReleaseEnvironmentLogsExtension); - queryParams.set("environmentId", config.$environmentId.toString()); - return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); - } - static getReleaseSummaryLink(config) { - var collectionUri = config.$teamUri; - const queryParams = new Map(); - queryParams.set("releaseId", config.$pipelineId.toString()); - return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); - } - static getTestResultLink(config, runId, resultId, queryParams) { - var collectionUri = config.$teamUri; - const parameters = new Map(); - parameters.set("runId", runId); - parameters.set("_a", "resultSummary"); - parameters.set("resultId", resultId.toString()); - if (queryParams != null) { - queryParams.forEach((value, key) => { - 6; - parameters.set(key, value); - }); - } - return collectionUri + "\\" + LinkHelper.getTcmRelativeUrl(config.$projectName) + "\\" + LinkHelper.getQueryParameter(parameters); - } - static getTestTabLinkInRelease(config) { - var collectionUri = config.$teamUri; - const queryParams = new Map(); - queryParams.set("releaseId", config.$pipelineId.toString()); - queryParams.set("_a", LinkHelper.ReleaseEnvironmentExtension); - queryParams.set("environmentId", config.$environmentId.toString()); - queryParams.set("extensionId", LinkHelper.ReleaseLinkTestExtensionId); - return collectionUri + "/" + config.$projectName + "/" + LinkHelper.ReleaseProgressView + LinkHelper.getQueryParameter(queryParams); - } - static getWorkItemLink(config, workItemId) { - const queryParams = new Map(); - queryParams.set("id", workItemId.toString()); - return config.$teamUri + "/" + LinkHelper.getWorkItemRelativeUrl(config.$projectName) + "/" + LinkHelper.getQueryParameter(queryParams); - } - static getBuildRelativeUrl(projectName) { - return projectName + "/" + LinkHelper.BuildPipelineExtension; - } - static getTestTabLinkInBuild(config) { - var collectionUri = config.$teamUri; - var parameters = new Map([ - ["buildId", config.$pipelineId.toString()], - ["view", "ms.vss-test-web.build-test-results-tab"] - ]); - var uri = this.getBuildLink(config, collectionUri, parameters); - return uri; - } - static getTcmRelativeUrl(projectName) { - return projectName + "/" + LinkHelper.TcmPipelineExtension; - } - static getWorkItemRelativeUrl(projectName) { - return projectName + "/" + LinkHelper.WorkItemPipelineExtension; - } - static getTestTabLink(pipelineConfiguration) { - return pipelineConfiguration.$pipelineType == PipelineType_1.PipelineType.Release ? - this.getTestTabLinkInRelease(pipelineConfiguration) : - this.getTestTabLinkInBuild(pipelineConfiguration); - } -} -exports.LinkHelper = LinkHelper; -LinkHelper.TcmPipelineExtension = "_TestManagement/Runs"; -// Release related strings -LinkHelper.ReleaseProgressView = "_releaseProgress"; -LinkHelper.ReleaseDefView = "_releaseDefinition"; -LinkHelper.ReleaseEnvironmentExtension = "release-environment-extension"; -LinkHelper.ReleaseEnvironmentLogsExtension = "release-environment-logs"; -LinkHelper.ReleaseLinkTestExtensionId = "ms.vss-test-web.test-result-in-release-environment-editor-tab"; -LinkHelper.WorkItemPipelineExtension = "_workitems"; -LinkHelper.BuildPipelineExtension = "_build"; -//# sourceMappingURL=LinkHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js.map deleted file mode 100644 index bec637f7..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"LinkHelper.js","sourceRoot":"","sources":["LinkHelper.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js deleted file mode 100644 index ffb3f0a9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsHelper = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TestOutcomeForPriority_1 = require("../testresults/TestOutcomeForPriority"); -class TestResultsHelper { - static getTestOutcomePercentage(testCountForOutcome, totalTests) { - if (totalTests == 0) { - console.log("Total Test count is 0. Setting outcome percentage to 0"); - } - let testOutcomePercentage = totalTests == 0 ? - 0 : - testCountForOutcome / totalTests * 100; - return TestResultsHelper.getCustomizedDecimalValue(testOutcomePercentage); - } - static getCustomizedDecimalValue(value) { - var fixedValue = Math.pow(10, TestResultsHelper.PercentagePrecision); - return ((Math.floor(value * fixedValue)) / fixedValue); - } - static getTestOutcomePercentageString(testCountForOutcome, totalTests) { - return this.getTestOutcomePercentage(testCountForOutcome, totalTests) + "%"; - } - static getTotalTestCountBasedOnUserConfiguration(testCountsByOutcome, includeOthersInTotal) { - var totalTests = 0; - testCountsByOutcome.forEach((testCount, testOutcome) => { - var isPassedTest = testOutcome == TestInterfaces_1.TestOutcome.Passed; - var isFailedTest = testOutcome == TestInterfaces_1.TestOutcome.Failed; - if (isPassedTest || isFailedTest || includeOthersInTotal) { - totalTests += testCount; - } - }); - return totalTests; - } - static getTotalTestCountBasedOnUserConfigurationPriority(testCountsByOutcome, includeOthersInTotal) { - var totalTests = 0; - testCountsByOutcome.forEach((testCount, testOutcome) => { - var isPassedTest = testOutcome == TestOutcomeForPriority_1.TestOutcomeForPriority.Passed; - var isFailedTest = testOutcome == TestOutcomeForPriority_1.TestOutcomeForPriority.Failed; - if (isPassedTest || isFailedTest || includeOthersInTotal) { - totalTests += testCount; - } - }); - return totalTests; - } -} -exports.TestResultsHelper = TestResultsHelper; -TestResultsHelper.PercentagePrecision = 2; -//# sourceMappingURL=TestResultsHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js.map deleted file mode 100644 index f0422c22..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultsHelper.js","sourceRoot":"","sources":["TestResultsHelper.ts"],"names":[],"mappings":";;;AAAA,oFAA8E;AAC9E,kFAA+E;AAE/E,MAAa,iBAAiB;IAGrB,MAAM,CAAC,wBAAwB,CAAC,mBAA2B,EAAE,UAAkB;QACpF,IAAI,UAAU,IAAI,CAAC,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;SACvE;QAED,IAAI,qBAAqB,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,mBAAmB,GAAG,UAAU,GAAG,GAAG,CAAC;QAEzC,OAAO,iBAAiB,CAAC,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAEO,MAAM,CAAC,yBAAyB,CAAC,KAAa;QACpD,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;IACzD,CAAC;IAEM,MAAM,CAAC,8BAA8B,CAAC,mBAA2B,EAAE,UAAkB;QAC1F,OAAO,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC;IAC9E,CAAC;IAEM,MAAM,CAAC,yCAAyC,CACrD,mBAA6C,EAC7C,oBAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,WAAwB,EAAE,EAAE;YAC1E,IAAI,YAAY,GAAG,WAAW,IAAI,4BAAW,CAAC,MAAM,CAAC;YACrD,IAAI,YAAY,GAAG,WAAW,IAAI,4BAAW,CAAC,MAAM,CAAC;YAErD,IAAI,YAAY,IAAI,YAAY,IAAI,oBAAoB,EAAE;gBACxD,UAAU,IAAI,SAAS,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,MAAM,CAAC,iDAAiD,CAC7D,mBAAwD,EACxD,oBAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,WAAmC,EAAE,EAAE;YACrF,IAAI,YAAY,GAAG,WAAW,IAAI,+CAAsB,CAAC,MAAM,CAAC;YAChE,IAAI,YAAY,GAAG,WAAW,IAAI,+CAAsB,CAAC,MAAM,CAAC;YAEhE,IAAI,YAAY,IAAI,YAAY,IAAI,oBAAoB,EAAE;gBACxD,UAAU,IAAI,SAAS,CAAC;aACzB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;;AAxDH,8CAyDC;AAxDwB,qCAAmB,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js deleted file mode 100644 index d7b813fc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js +++ /dev/null @@ -1,79 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TimeFormatter = void 0; -const util_1 = require("util"); -class TimeFormatter { - static ConvertTimeStringToMilliSeconds(duration) { - const timeSpanArray = duration.split("."); - let durationNum = 0; - let hmsIndex = 0; - if (timeSpanArray.length > 3) { - console.warn("cannot format time duration"); - return 0; - } - else if (timeSpanArray.length == 3) { - // Eg: 1.03:04:05.567 = 1 day, 3 hours, 4 min, 5 seconds and 567 ms. - // Days to ms - durationNum += Number(timeSpanArray[0]) * 24 * 3600; - hmsIndex = 1; - } - let timeStrArray = timeSpanArray[hmsIndex].split(":"); - if (timeStrArray.length != 3) { - console.warn("cannot format time duration properly. test run duration will not be accurate"); - } - else { - durationNum += Number(timeStrArray[2]); // secs - durationNum += Number(timeStrArray[1]) * 60; // mins to secs - durationNum += Number(timeStrArray[0]) * 3600; // hours to secs - } - return durationNum * 1000; - } - static FormatDuration(timeInMilliseconds) { - let timeStr = ""; - // 1- Convert to seconds: - var seconds = timeInMilliseconds / 1000; - // 2- Extract hours: - var hours = Math.round(seconds / 3600); // 3,600 seconds in 1 hour - seconds = seconds % 3600; // seconds remaining after extracting hours - // 3- Extract minutes: - var minutes = Math.round(seconds / 60); // 60 seconds in 1 minute - // 4- Keep only seconds not extracted to minutes: - seconds = seconds % 60; - seconds = Math.round(seconds); - if (minutes == 60) { - hours += 1; - minutes = 0; - } - return this.getCombinedTimeString(hours, minutes, seconds); - } - static FormatDurationStr(timeStr) { - let resultStr = ""; - if (!util_1.isNullOrUndefined(timeStr)) { - // strip off milliseconds if any, and then split into hh:mm:ss - const timeStrArray = timeStr.split(".")[0].split(":"); - if (timeStrArray.length != 3) { - // not supported - return timeStr; - } - // 1- Convert to seconds: - var seconds = Math.round(Number.parseInt(timeStrArray[2])); - var minutes = Math.round(Number.parseInt(timeStrArray[1])); - var hours = Math.round(Number.parseInt(timeStrArray[0])); - resultStr = this.getCombinedTimeString(hours, minutes, seconds); - } - return resultStr; - } - static getCombinedTimeString(hours, minutes, seconds) { - let timeStr = ""; - timeStr += this.getTimeUnitString(hours, "h"); - timeStr += this.getTimeUnitString(minutes, "m"); - timeStr += this.getTimeUnitString(seconds, "s"); - timeStr = timeStr.trim(); - return (timeStr == "" ? "0s" : timeStr); - } - static getTimeUnitString(timeUnit, suffix) { - return timeUnit < 1 ? "" : timeUnit + suffix + " "; - } -} -exports.TimeFormatter = TimeFormatter; -//# sourceMappingURL=TimeFormatter.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js.map deleted file mode 100644 index f96973ac..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TimeFormatter.js","sourceRoot":"","sources":["TimeFormatter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js deleted file mode 100644 index 5677cc8c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestOutcomeForPriority = void 0; -var TestOutcomeForPriority; -(function (TestOutcomeForPriority) { - TestOutcomeForPriority[TestOutcomeForPriority["Failed"] = 0] = "Failed"; - TestOutcomeForPriority[TestOutcomeForPriority["Inconclusive"] = 1] = "Inconclusive"; - TestOutcomeForPriority[TestOutcomeForPriority["NotExecuted"] = 2] = "NotExecuted"; - TestOutcomeForPriority[TestOutcomeForPriority["Passed"] = 3] = "Passed"; - TestOutcomeForPriority[TestOutcomeForPriority["Other"] = 4] = "Other"; -})(TestOutcomeForPriority = exports.TestOutcomeForPriority || (exports.TestOutcomeForPriority = {})); -//# sourceMappingURL=TestOutcomeForPriority.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js.map deleted file mode 100644 index d6f1e5c2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestOutcomeForPriority.js","sourceRoot":"","sources":["TestOutcomeForPriority.ts"],"names":[],"mappings":";;;AAAA,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,uEAAM,CAAA;IACN,mFAAY,CAAA;IACZ,iFAAW,CAAA;IACX,uEAAM,CAAA;IACN,qEAAK,CAAA;AACP,CAAC,EANW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAMjC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js deleted file mode 100644 index 9625859d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsGroupModel = void 0; -class TestResultsGroupModel { - constructor() { - this.testResults = new Map(); - } -} -exports.TestResultsGroupModel = TestResultsGroupModel; -//# sourceMappingURL=TestResultGroupModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js.map deleted file mode 100644 index f04389a5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultGroupModel.js","sourceRoot":"","sources":["TestResultGroupModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAAlC;QAGS,gBAAW,GAAwC,IAAI,GAAG,EAAkC,CAAC;IACtG,CAAC;CAAA;AAJD,sDAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js deleted file mode 100644 index 4062bcef..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultModel = void 0; -class TestResultModel { - constructor() { - this.associatedBugRefs = []; - this.associatedBugs = []; - } -} -exports.TestResultModel = TestResultModel; -//# sourceMappingURL=TestResultModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js.map deleted file mode 100644 index 2131536d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultModel.js","sourceRoot":"","sources":["TestResultModel.ts"],"names":[],"mappings":";;;AAIA,MAAa,eAAe;IAA5B;QAES,sBAAiB,GAAwB,EAAE,CAAC;QAC5C,mBAAc,GAAe,EAAE,CAAC;IACzC,CAAC;CAAA;AAJD,0CAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js deleted file mode 100644 index 957749b7..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryGroupModel = void 0; -class TestSummaryGroupModel { - constructor() { - this.runs = []; - } -} -exports.TestSummaryGroupModel = TestSummaryGroupModel; -//# sourceMappingURL=TestSummaryGroupModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js.map deleted file mode 100644 index 4b893cd0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryGroupModel.js","sourceRoot":"","sources":["TestSummaryGroupModel.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAAlC;QAIS,SAAI,GAA2B,EAAE,CAAC;IAC3C,CAAC;CAAA;AALD,sDAKC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js deleted file mode 100644 index 6fc6b60f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js +++ /dev/null @@ -1,91 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryItemModel = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -class TestSummaryItemModel { - constructor($name, $id) { - this.name = $name; - this.id = $id; - this.testCountByOutcome = new Map(); - this.testCountForOutcomeByPriority = new Map(); - } - /** - * Getter $name - * @return {string} - */ - get $name() { - return this.name; - } - /** - * Getter $id - * @return {string} - */ - get $id() { - return this.id; - } - /** - * Getter $totalTestCount - * @return {number} - */ - get $totalTestCount() { - return this.totalTestCount; - } - /** - * Getter $testCountByOutcome - * @return {Map} - */ - get $testCountByOutcome() { - return this.testCountByOutcome; - } - /** - * Getter $testCountForOutcomeByPriority - * @return {Map} - */ - get $testCountForOutcomeByPriority() { - return this.testCountForOutcomeByPriority; - } - /** - * Getter $duration - * @return {any} - */ - get $duration() { - return this.duration; - } - /** - * Setter $totalTestCount - * @param {number} value - */ - set $totalTestCount(value) { - this.totalTestCount = value; - } - /** - * Setter $duration - * @param {any} value - */ - set $duration(value) { - this.duration = value; - } - getFailedTestsCount() { - return this.getTestOutcomeCount(TestInterfaces_1.TestOutcome.Failed); - } - getOtherTestsCount() { - let totalCount = 0; - this.testCountByOutcome.forEach((value, key) => { - if (key != TestInterfaces_1.TestOutcome.Passed && key != TestInterfaces_1.TestOutcome.Failed) { - totalCount += value; - } - }); - return totalCount; - } - getPassedTestsCount() { - return this.getTestOutcomeCount(TestInterfaces_1.TestOutcome.Passed); - } - getTestOutcomeCount(testOutcome) { - if (this.testCountByOutcome.has(testOutcome)) { - return this.testCountByOutcome.get(testOutcome); - } - return 0; - } -} -exports.TestSummaryItemModel = TestSummaryItemModel; -//# sourceMappingURL=TestSummaryItemModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js.map deleted file mode 100644 index a7c29bfd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryItemModel.js","sourceRoot":"","sources":["TestSummaryItemModel.ts"],"names":[],"mappings":";;;AACA,oFAA8E;AAE9E,MAAa,oBAAoB;IAQ/B,YAAY,KAAa,EAAE,GAAW;QACpC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;QACzD,IAAI,CAAC,6BAA6B,GAAG,IAAI,GAAG,EAA+C,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,8BAA8B;QACvC,OAAO,IAAI,CAAC,6BAA6B,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAGD;;;OAGG;IACH,IAAW,eAAe,CAAC,KAAa;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS,CAAC,KAAa;QAChC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEM,kBAAkB;QACvB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,GAAgB,EAAE,EAAE;YAClE,IAAI,GAAG,IAAI,4BAAW,CAAC,MAAM,IAAI,GAAG,IAAI,4BAAW,CAAC,MAAM,EAAE;gBAC1D,UAAU,IAAI,KAAK,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEO,mBAAmB,CAAC,WAAwB;QAClD,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;SACjD;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAxGD,oDAwGC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js deleted file mode 100644 index 999dcd2a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ArtifactViewModel = exports.ArtifactViewModelWrapper = void 0; -const util_1 = require("util"); -class ArtifactViewModelWrapper { -} -exports.ArtifactViewModelWrapper = ArtifactViewModelWrapper; -class ArtifactViewModel { - constructor(artifact, config) { - this.Version = this.getArtifactInfo(artifact, "version"); - this.BranchName = this.getArtifactInfo(artifact, "branch"); - this.Name = artifact.alias; - this.IsPrimary = artifact.isPrimary; - if (!util_1.isNullOrUndefined(artifact.definitionReference)) { - if (!util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl) && - !util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceDefinitionUrl.id)) { - this.ArtifactDefinitionUrl = artifact.definitionReference.artifactSourceDefinitionUrl.id; - } - if (!util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl) && - !util_1.isNullOrUndefined(artifact.definitionReference.artifactSourceVersionUrl.id)) { - this.BuildSummaryUrl = artifact.definitionReference.artifactSourceVersionUrl.id; - } - } - } - getArtifactInfo(artifact, key) { - const sourceRef = artifact.definitionReference[key]; - return util_1.isNullOrUndefined(sourceRef) ? null : sourceRef.name; - } -} -exports.ArtifactViewModel = ArtifactViewModel; -//# sourceMappingURL=ArtifactViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js.map deleted file mode 100644 index d26a37f4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ArtifactViewModel.js","sourceRoot":"","sources":["ArtifactViewModel.ts"],"names":[],"mappings":";;;AAEA,+BAAyC;AAGzC,MAAa,wBAAwB;CAEpC;AAFD,4DAEC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,QAAkB,EAAE,MAA6B;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;YACpD,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC;gBAC9E,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,CAAC,EAAE;gBACjF,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,EAAE,CAAC;aAC1F;YAED,IAAI,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC;gBAC3E,CAAC,wBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE;gBAC9E,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,CAAC;aACjF;SACF;IACH,CAAC;IAEO,eAAe,CAAC,QAAkB,EAAE,GAAW;QACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,wBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IAC9D,CAAC;CACF;AA/BD,8CA+BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js deleted file mode 100644 index 68ee5557..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildReferenceViewModel = void 0; -const LinkHelper_1 = require("../helpers/LinkHelper"); -const util_1 = require("util"); -class BuildReferenceViewModel { - constructor(config, buildReference, build) { - if (buildReference != null) { - this.Id = buildReference.id.toString(); - this.Number = buildReference.buildNumber; - if (!util_1.isNullOrUndefined(buildReference._links) && !util_1.isNullOrUndefined(buildReference._links.web) && !util_1.isNullOrUndefined(buildReference._links.web.href)) { - this.Url = buildReference._links.web.href; - } - } - else if (build != null) { - this.Id = build.id.toString(); - this.Number = build.buildNumber; - this.Branch = build.sourceBranch; - if (!util_1.isNullOrUndefined(build._links) && !util_1.isNullOrUndefined(build._links.web) && !util_1.isNullOrUndefined(build._links.web.href)) { - this.Url = build._links.web.href; - } - this.DefinitionUrl = LinkHelper_1.LinkHelper.getBuildDefinitionLinkById(build.definition.id, config); - this.DefinitionName = build.definition.name; - } - } -} -exports.BuildReferenceViewModel = BuildReferenceViewModel; -//# sourceMappingURL=BuildReferenceViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js.map deleted file mode 100644 index 88ab2f9d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildReferenceViewModel.js","sourceRoot":"","sources":["BuildReferenceViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,+BAAyC;AAEzC,MAAa,uBAAuB;IAQlC,YAAY,MAA6B,EAAE,cAA8B,EAAE,KAAY;QACrF,IAAG,cAAc,IAAI,IAAI,EAAE;YACzB,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC;YACzC,IAAG,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnJ,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAC3C;SACF;aAAM,IAAI,KAAK,IAAI,IAAI,EAAE;YACxB,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YACjC,IAAG,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACxH,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAClC;YACD,IAAI,CAAC,aAAa,GAAG,uBAAU,CAAC,0BAA0B,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACxF,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;SAC7C;IACH,CAAC;CACF;AA1BD,0DA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js deleted file mode 100644 index e3e7c956..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ChangeViewModel = exports.ChangeViewModelWrapper = void 0; -const StringUtils_1 = require("../../utils/StringUtils"); -const LinkHelper_1 = require("../helpers/LinkHelper"); -class ChangeViewModelWrapper { -} -exports.ChangeViewModelWrapper = ChangeViewModelWrapper; -class ChangeViewModel { - constructor(change, config) { - this.ConstHashLength = 8; - this.Id = change.$id; - this.ShortId = isNaN(Number.parseInt(this.Id)) ? this.Id : this.Id.substring(0, this.ConstHashLength); - this.Message = StringUtils_1.StringUtils.CompressNewLines(change.$message); - this.AuthorName = change.$author == null ? null : change.$author.displayName; - this.TimeStamp = change.$timeStamp.toDateString(); - this.Url = LinkHelper_1.LinkHelper.getCommitLink(change.$id, change.$location, config); - } -} -exports.ChangeViewModel = ChangeViewModel; -//# sourceMappingURL=ChangeViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js.map deleted file mode 100644 index f4fc902c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ChangeViewModel.js","sourceRoot":"","sources":["ChangeViewModel.ts"],"names":[],"mappings":";;;AAEA,yDAAsD;AACtD,sDAAmD;AAEnD,MAAa,sBAAsB;CAElC;AAFD,wDAEC;AAED,MAAa,eAAe;IAS1B,YAAY,MAAmB,EAAE,MAA6B;QAR9C,oBAAe,GAAG,CAAC,CAAC;QASlC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACtG,IAAI,CAAC,OAAO,GAAG,yBAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7E,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAElD,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;CACF;AAlBD,0CAkBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js deleted file mode 100644 index b723545f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DeploymentJobViewModel = void 0; -const TaskResultViewModel_1 = require("./TaskResultViewModel"); -class DeploymentJobViewModel { - constructor(jobs) { - this.Tasks = new TaskResultViewModel_1.TaskResultViewModelWrapper(); - this.Tasks.TaskResultViewModel = []; - if (jobs.length > 0) { - let taskIndex = 0; - let releaseTasks = []; - do { - releaseTasks = []; - jobs.forEach(job => { - // Not all jobs have same set of tasks - if (taskIndex < job.$tasks.length) { - releaseTasks.push(job.$tasks[taskIndex]); - this.MinTaskStartTime = this.getMinTime(this.MinTaskStartTime, job.$tasks[taskIndex].$startTime); - this.MaxTaskFinishTime = this.getMaxTime(this.MaxTaskFinishTime, job.$tasks[taskIndex].$finishTime); - } - }); - if (releaseTasks != null && releaseTasks.length > 0) { - this.Tasks.TaskResultViewModel.push(new TaskResultViewModel_1.TaskResultViewModel(releaseTasks)); - } - taskIndex++; - } while (releaseTasks.length > 0); - } - } - getMinTime(time1, time2) { - if (time1 == null) { - return time2; - } - else if (time2 != null && time2 < time1) { - return time2; - } - return time1; - } - getMaxTime(time1, time2) { - if (time1 == null) { - return time2; - } - else if (time2 != null && time2 > time1) { - return time2; - } - return time1; - } -} -exports.DeploymentJobViewModel = DeploymentJobViewModel; -//# sourceMappingURL=DeploymentJobViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js.map deleted file mode 100644 index bece72f8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DeploymentJobViewModel.js","sourceRoot":"","sources":["DeploymentJobViewModel.ts"],"names":[],"mappings":";;;AAEA,+DAAwF;AAExF,MAAa,sBAAsB;IAKjC,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,gDAA0B,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,YAAY,GAAgB,EAAE,CAAC;YACnC,GAAG;gBACD,YAAY,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBACjB,sCAAsC;oBACtC,IAAI,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;wBACjC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;wBACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC;wBACjG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;qBACrG;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;iBAC5E;gBAED,SAAS,EAAE,CAAC;aAEb,QAAQ,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;SACnC;IACH,CAAC;IAEO,UAAU,CAAC,KAAW,EAAE,KAAW;QACzC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;aACI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,KAAW,EAAE,KAAW;QACzC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;aACI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAtDD,wDAsDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js deleted file mode 100644 index 88dac581..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js +++ /dev/null @@ -1,132 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EmailReportViewModel = void 0; -const util_1 = require("util"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const LinkHelper_1 = require("../helpers/LinkHelper"); -const PhaseViewModel_1 = require("./PhaseViewModel"); -const PhaseIssuesViewModel_1 = require("./PhaseIssuesViewModel"); -const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); -const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); -const ArtifactViewModel_1 = require("./ArtifactViewModel"); -const ChangeViewModel_1 = require("./ChangeViewModel"); -const TestSummaryGroupViewModel_1 = require("./TestSummaryGroupViewModel"); -const TestResultsGroupViewModel_1 = require("./TestResultsGroupViewModel"); -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -class EmailReportViewModel { - constructor(report, reportConfiguration) { - this.ProjectName = reportConfiguration.$pipelineConfiguration.$projectName; - this.HasTaskFailures = report.hasFailedTasks(); - if (reportConfiguration.$pipelineConfiguration.$pipelineType == PipelineType_1.PipelineType.Build) { - this.Build = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration); - } - else { - this.Release = report.getPipelineViewModel(reportConfiguration.$pipelineConfiguration); - } - this.Artifacts = new ArtifactViewModel_1.ArtifactViewModelWrapper(); - this.Artifacts.ArtifactViewModel = report.getArtifactViewModels(reportConfiguration.$pipelineConfiguration); - this.HasCanceledPhases = report.hasCanceledPhases(); - this.InitializePhases(report); - this.SetMailSubject(report, reportConfiguration); - this.HasFailedTests = report.hasFailedTests(reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); - if (report.testResultSummary != null) { - this.AllTests = new TestResultSummaryViewModel_1.TestResultSummaryViewModel(null, report.testResultSummary, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal); - } - this.InitializeSummaryGroupViewModel(report, reportConfiguration); - this.ShowAssociatedChanges = reportConfiguration.$reportDataConfiguration.$includeCommits; - if (this.ShowAssociatedChanges) { - this.InitializeAssociatedChanges(report, reportConfiguration.$pipelineConfiguration); - } - this.InitializeTestResultGroups(report, reportConfiguration); - this.TestTabLink = LinkHelper_1.LinkHelper.getTestTabLink(reportConfiguration.$pipelineConfiguration); - this.DataMissing = report.$dataMissing; - } - InitializePhases(report) { - const phases = []; - if (util_1.isNullOrUndefined(report.$phases) || report.$phases.length < 1) { - return; - } - report.$phases.forEach(phase => { - phases.push(new PhaseViewModel_1.PhaseViewModel(phase)); - }); - this.Phases = new PhaseViewModel_1.PhaseViewModelWrapper(); - this.Phases.PhaseViewModel = phases; - if (this.HasCanceledPhases) { - this.PhaseIssuesSummary = new PhaseIssuesViewModel_1.PhaseIssuesViewModel(report.$phases); - } - } - SetMailSubject(report, reportConfig) { - var subject = reportConfig.$mailConfiguration.$mailSubject; - if (subject.includes("{passPercentage}")) { - var passPercentage = this.GetPassPercentage(report, reportConfig.$reportDataConfiguration.$includeOthersInTotal); - subject = subject.replace("{passPercentage}", passPercentage); - } - if (subject.includes("{environmentStatus}")) { - subject = subject.replace("{environmentStatus}", report.getEnvironmentStatus()); - } - reportConfig.$mailConfiguration.$mailSubject = subject; - } - InitializeAssociatedChanges(report, pipelineConfig) { - if (!util_1.isNullOrUndefined(report.$associatedChanges) && report.$associatedChanges.length > 0) { - this.AssociatedChanges = new ChangeViewModel_1.ChangeViewModelWrapper(); - this.AssociatedChanges.ChangeViewModel = []; - report.$associatedChanges.forEach(associatedChange => { - this.AssociatedChanges.ChangeViewModel.push(new ChangeViewModel_1.ChangeViewModel(associatedChange, pipelineConfig)); - }); - } - } - InitializeSummaryGroupViewModel(report, reportConfiguration) { - this.SummaryGroups = new TestSummaryGroupViewModel_1.TestSummaryGroupViewModelWrapper(); - this.SummaryGroups.TestSummaryGroupViewModel = []; - if (!util_1.isNullOrUndefined(report.$testSummaryGroups)) { - report.$testSummaryGroups.forEach(summaryGroup => { - reportConfiguration.$reportDataConfiguration.$groupTestSummaryBy.forEach(group => { - if (summaryGroup.groupedBy == group) { - console.log(`Creating summary group viewmodel for ${summaryGroup.groupedBy}`); - this.SummaryGroups.TestSummaryGroupViewModel.push(new TestSummaryGroupViewModel_1.TestSummaryGroupViewModel(summaryGroup, reportConfiguration.$pipelineConfiguration, reportConfiguration.$reportDataConfiguration.$includeOthersInTotal)); - } - }); - }); - } - } - InitializeTestResultGroups(report, reportConfig) { - this.TestResultsGroups = new TestResultsGroupViewModel_1.TestResultsGroupViewModelWrapper(); - this.TestResultsGroups.TestResultsGroupViewModel = []; - if (report.filteredResults != null) { - report.filteredResults.forEach(testResultGroupModel => { - var testResultsGroupViewModel = new TestResultsGroupViewModel_1.TestResultsGroupViewModel(testResultGroupModel, reportConfig); - this.TestResultsGroups.TestResultsGroupViewModel.push(testResultsGroupViewModel); - }); - } - this.HasFilteredTests = report.hasFilteredTests; - if (this.TestResultsGroups.TestResultsGroupViewModel.length > 0) { - const testResultsConfig = reportConfig.$reportDataConfiguration.$testResultsConfig; - if (testResultsConfig.$includePassedTests) { - this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.PassedTests.TestResultViewModel.length > 0).length > 0; - } - if (testResultsConfig.$includeFailedTests) { - this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.FailedTests.TestResultViewModel.length > 0).length > 0; - } - if (testResultsConfig.$includeOtherTests) { - this.HasTestResultsToShow = this.HasTestResultsToShow || this.TestResultsGroups.TestResultsGroupViewModel.filter(t => t.OtherTests.TestResultViewModel.length > 0).length > 0; - } - } - } - GetPassPercentage(report, includeOthersInTotal) { - var summary = report.testResultSummary; - let passedTests = 0, totalTests = 0; - if (summary != null) { - const passedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Passed]; - passedTests = util_1.isNullOrUndefined(passedTestsAggregation) ? 0 : passedTestsAggregation.count; - const failedTestsAggregation = report.testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; - const failedTests = util_1.isNullOrUndefined(failedTestsAggregation) ? 0 : failedTestsAggregation.count; - totalTests = summary.aggregatedResultsAnalysis.totalTests; - if (!includeOthersInTotal) { - totalTests = passedTests + failedTests; - } - } - return TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(passedTests, totalTests); - } -} -exports.EmailReportViewModel = EmailReportViewModel; -//# sourceMappingURL=EmailReportViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js.map deleted file mode 100644 index 88e2c7cb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EmailReportViewModel.js","sourceRoot":"","sources":["EmailReportViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js deleted file mode 100644 index f6cf22ed..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js +++ /dev/null @@ -1,128 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MailAddressViewModel = void 0; -const util_1 = require("util"); -const StringUtils_1 = require("../../utils/StringUtils"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -class MailAddressViewModel { - constructor(report, mailConfig) { - this.cc = []; - this.to = []; - this.from = mailConfig.$smtpConfig.$userName; - this.defaultDomain = mailConfig.$defaultDomain; - console.log("computing email addresses for to section"); - this.to = this.getMailAddresses(report, mailConfig.$toRecipientsConfig); - console.log("computing email addresses for Cc section"); - this.cc = this.getMailAddresses(report, mailConfig.$ccRecipientsConfig); - } - getMailAddresses(report, recipientsConfiguration) { - var addressHashSet = new Set(); - if (recipientsConfiguration.$includeTestOwners) { - const owners = this.getFailedTestOwners(report); - owners.forEach(o => addressHashSet.add(o)); - } - if (recipientsConfiguration.$includeActiveBugOwners) { - const bugOwners = this.getActiveBugOwnersForFailedTests(report); - bugOwners.forEach(o => addressHashSet.add(o)); - } - if (recipientsConfiguration.$includeChangesetOwners) { - const changesetOwners = this.getChangesetOwners(report.$associatedChanges); - changesetOwners.forEach(o => addressHashSet.add(o)); - } - if (recipientsConfiguration.$includeCreatedBy) { - if (!util_1.isNullOrUndefined(report.createdBy)) { - addressHashSet.add(report.createdBy.uniqueName); - } - } - if (!util_1.isNullOrUndefined(recipientsConfiguration.$defaultRecipients)) { - recipientsConfiguration.$defaultRecipients.split(";").forEach(a => addressHashSet.add(a)); - } - return this.filterValidMailAddresses(addressHashSet); - } - getFailedTestOwners(report) { - var mailAddresses = []; - if (!util_1.isNullOrUndefined(report.$failedTestOwners)) { - report.$failedTestOwners.forEach(identity => { - var mailAddress = this.getMailAddressFromIdentityRef(identity); - if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(mailAddress)) { - mailAddresses.push(mailAddress); - } - }); - } - console.log(`Failed Test owners - ${mailAddresses.join(",")}`); - return mailAddresses; - } - getActiveBugOwnersForFailedTests(report) { - if (report.filteredResults == null) { - return []; - } - const bugOwners = []; - report.filteredResults.forEach(group => { - if (group.testResults.has(TestInterfaces_1.TestOutcome.Failed)) { - group.testResults.forEach(tr => { - tr.forEach(tr => { - tr.associatedBugs.forEach(bug => { - const bugState = bug.fields["System.State"]; - if (!util_1.isNullOrUndefined(bugState) && bugState.toLowerCase() == "Active".toLowerCase()) { - bugOwners.push(bug.fields["System.AssignedTo"]); - } - }); - }); - }); - } - }); - console.log(`Failed Test owners - ${bugOwners.join(",")}`); - return bugOwners; - } - getChangesetOwners(associatedChanges) { - var mailAddresses = []; - if (!util_1.isNullOrUndefined(associatedChanges) && associatedChanges.length < 1) { - console.log("No changeset owner mail addresses"); - return mailAddresses; - } - associatedChanges.forEach(associatedChange => { - var mailAddress = associatedChange.$author.uniqueName; - if (StringUtils_1.StringUtils.isNullOrWhiteSpace(mailAddress)) { - console.log(`Unable to get mail address for associated change - ${associatedChange.$id}`); - } - else { - mailAddresses.push(mailAddress); - } - }); - console.log(`Changeset owner mail addresses - ${mailAddresses.join(",")}`); - return mailAddresses; - } - filterValidMailAddresses(addressHashSet) { - var mailAddresses = []; - addressHashSet.forEach(address => { - var validAddress = this.getValidEmailAddress(address); - if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(validAddress)) { - mailAddresses.push(validAddress); - } - }); - return mailAddresses; - } - getValidEmailAddress(address) { - if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(address) && !this.isValidEmail(address)) { - console.log(`Address ${address} is not a valid email address. Adding domain: ${this.defaultDomain}`); - address = `${address}@${this.defaultDomain}`; - } - return address; - } - isValidEmail(email) { - var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(String(email)); - } - getMailAddressFromIdentityRef(identity) { - if (!identity.isContainer) { - return this.getUniqueName(identity); - } - console.log(`Not fetching email address for container - ${identity.displayName}`); - return null; - } - getUniqueName(identity) { - return identity.uniqueName == null ? identity.displayName : identity.uniqueName; - } -} -exports.MailAddressViewModel = MailAddressViewModel; -//# sourceMappingURL=MailAddressViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js.map deleted file mode 100644 index af2439d7..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MailAddressViewModel.js","sourceRoot":"","sources":["MailAddressViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js deleted file mode 100644 index 110679ef..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PhaseIssuesViewModel = void 0; -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const TaskResultViewModel_1 = require("./TaskResultViewModel"); -const TaskModel_1 = require("../TaskModel"); -class PhaseIssuesViewModel { - constructor(phases) { - /// - /// Use TaskResultViewModel as Phase level issue as the viewmodel is same - /// - this.Tasks = new TaskResultViewModel_1.TaskResultViewModelWrapper(); - this.Name = "Phase Issues"; - this.Tasks.TaskResultViewModel = []; - phases.forEach(phase => { - if (phase != null && phase.$jobs != null) { - const canceledJobs = phase.$jobs.filter(job => job.$jobStatus == ReleaseInterfaces_1.TaskStatus.Canceled); - if (canceledJobs.length > 0) { - var failedJobsAsTasks = canceledJobs.map(job => { - return new TaskModel_1.TaskModel(job.$jobName, job.$jobStatus, job.$issues, null, null, null); - }); - var taskResViewModel = new TaskResultViewModel_1.TaskResultViewModel(failedJobsAsTasks); - taskResViewModel.IssuesSummary.ErrorMessage = `Failed on ${canceledJobs.length}/${phase.$jobs.length} Agents`; - this.Tasks.TaskResultViewModel.push(taskResViewModel); - } - } - }); - } -} -exports.PhaseIssuesViewModel = PhaseIssuesViewModel; -//# sourceMappingURL=PhaseIssuesViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js.map deleted file mode 100644 index b351c0f9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PhaseIssuesViewModel.js","sourceRoot":"","sources":["PhaseIssuesViewModel.ts"],"names":[],"mappings":";;;AAAA,0FAAgF;AAChF,+DAAwF;AAExF,4CAAyC;AAEzC,MAAa,oBAAoB;IAO/B,YAAY,MAAoB;QANhC,aAAa;QACb,yEAAyE;QACzE,cAAc;QACP,UAAK,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAI1E,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;gBACxC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,8BAAU,CAAC,QAAQ,CAAC,CAAC;gBACtF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3B,IAAI,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBAC7C,OAAO,IAAI,qBAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBACpF,CAAC,CAAC,CAAC;oBACH,IAAI,gBAAgB,GAAG,IAAI,yCAAmB,CAAC,iBAAiB,CAAC,CAAC;oBAClE,gBAAgB,CAAC,aAAa,CAAC,YAAY,GAAG,aAAa,YAAY,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;oBAC9G,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;iBACvD;aACF;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAxBD,oDAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js deleted file mode 100644 index 51d18967..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PhaseViewModel = exports.PhaseViewModelWrapper = void 0; -const DeploymentJobViewModel_1 = require("./DeploymentJobViewModel"); -const TimeFormatter_1 = require("../helpers/TimeFormatter"); -class PhaseViewModelWrapper { -} -exports.PhaseViewModelWrapper = PhaseViewModelWrapper; -class PhaseViewModel { - constructor(phase) { - this.Status = phase.$status; - this.Rank = phase.$rank; - this.Name = phase.$name; - this.InitializeDeploymentJobs(phase); - } - InitializeDeploymentJobs(phase) { - const deploymentJobs = phase.$jobs; - if (deploymentJobs.length > 0) { - this.DeploymentJob = new DeploymentJobViewModel_1.DeploymentJobViewModel(deploymentJobs); - this.InitializeTasksDuration(); - } - else { - // This can happen if we have an empty phase or a phase with only disabled steps - console.warn(`No deployment jobs found in phase ${this.Name}`); - } - } - InitializeTasksDuration() { - // Evaluate job duration and format it - if (this.DeploymentJob.MaxTaskFinishTime != null && this.DeploymentJob.MinTaskStartTime != null) { - this.TasksDuration = `${TimeFormatter_1.TimeFormatter.FormatDuration(this.DeploymentJob.MaxTaskFinishTime.getTime() - this.DeploymentJob.MinTaskStartTime.getTime())}`; - } - } -} -exports.PhaseViewModel = PhaseViewModel; -//# sourceMappingURL=PhaseViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js.map deleted file mode 100644 index 9126235d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PhaseViewModel.js","sourceRoot":"","sources":["PhaseViewModel.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAElE,4DAAyD;AAEzD,MAAa,qBAAqB;CAEjC;AAFD,sDAEC;AAED,MAAa,cAAc;IAOzB,YAAY,KAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,wBAAwB,CAAC,KAAiB;QAChD,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC;QAEnC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,+CAAsB,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAChC;aACI;YACH,gFAAgF;YAChF,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SAChE;IACH,CAAC;IAEO,uBAAuB;QAC7B,sCAAsC;QACtC,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,gBAAgB,IAAI,IAAI,EAAE;YAC/F,IAAI,CAAC,aAAa,GAAG,GAAG,6BAAa,CAAC,cAAc,CAClD,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;SACrG;IACH,CAAC;CACF;AAlCD,wCAkCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js deleted file mode 100644 index 6669729c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseEnvironmentViewModel = void 0; -class ReleaseEnvironmentViewModel { - constructor(environment) { - this.EnvironmentName = environment == null ? null : environment.name; - this.EnvironmentOwnerEmail = environment != null && environment.owner != null ? environment.owner.uniqueName : null; - } -} -exports.ReleaseEnvironmentViewModel = ReleaseEnvironmentViewModel; -//# sourceMappingURL=ReleaseEnvironmentViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js.map deleted file mode 100644 index d13d67d3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseEnvironmentViewModel.js","sourceRoot":"","sources":["ReleaseEnvironmentViewModel.ts"],"names":[],"mappings":";;;AAEA,MAAa,2BAA2B;IAItC,YAAY,WAA+B;QACzC,IAAI,CAAC,eAAe,GAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QACrE,IAAI,CAAC,qBAAqB,GAAG,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IACtH,CAAC;CACF;AARD,kEAQC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js deleted file mode 100644 index 552b3b6e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseReferenceViewModel = void 0; -const LinkHelper_1 = require("../helpers/LinkHelper"); -class ReleaseReferenceViewModel { - constructor(config, releaseReference) { - this.Id = releaseReference.id; - this.Name = releaseReference.name; - this.Url = LinkHelper_1.LinkHelper.getReleaseSummaryLink(config); - } -} -exports.ReleaseReferenceViewModel = ReleaseReferenceViewModel; -//# sourceMappingURL=ReleaseReferenceViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js.map deleted file mode 100644 index d4f2c9ad..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseReferenceViewModel.js","sourceRoot":"","sources":["ReleaseReferenceViewModel.ts"],"names":[],"mappings":";;;AAAA,sDAAmD;AAInD,MAAa,yBAAyB;IAKpC,YAAY,MAA6B,EAAE,gBAAkC;QAC3E,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;CACF;AAVD,8DAUC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js deleted file mode 100644 index 54e00f22..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseViewModel = void 0; -const LinkHelper_1 = require("../helpers/LinkHelper"); -const ReleaseEnvironmentViewModel_1 = require("./ReleaseEnvironmentViewModel"); -const util_1 = require("util"); -class ReleaseViewModel { - constructor(currentEnvironment, releaseConfig) { - if (currentEnvironment != null) { - this.CurrentEnvironment = new ReleaseEnvironmentViewModel_1.ReleaseEnvironmentViewModel(currentEnvironment); - this.ReleaseDefinitionName = currentEnvironment.releaseDefinition == null ? null : currentEnvironment.releaseDefinition.name; - if (currentEnvironment.releaseDefinition != null) { - this.ReleaseDefinitionUrl = LinkHelper_1.LinkHelper.getReleaseDefinitionLink(releaseConfig, currentEnvironment.releaseDefinition.id); - } - this.ReleaseName = currentEnvironment.release == null ? null : currentEnvironment.release.name; - } - this.ReleaseId = releaseConfig.$pipelineId; - if (!util_1.isNullOrUndefined(currentEnvironment.release) && !util_1.isNullOrUndefined(currentEnvironment.release._links) && !util_1.isNullOrUndefined(currentEnvironment.release._links.web)) { - this.ReleaseSummaryUrl = currentEnvironment.release._links.web.href; - } - this.ReleaseLogsLink = LinkHelper_1.LinkHelper.getReleaseLogsTabLink(releaseConfig); - } -} -exports.ReleaseViewModel = ReleaseViewModel; -//# sourceMappingURL=ReleaseViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js.map deleted file mode 100644 index e1966291..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseViewModel.js","sourceRoot":"","sources":["ReleaseViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,+EAA4E;AAC5E,+BAAyC;AAEzC,MAAa,gBAAgB;IAS3B,YAAY,kBAAsC,EAAE,aAAoC;QACtF,IAAI,kBAAkB,IAAI,IAAI,EAAE;YAC9B,IAAI,CAAC,kBAAkB,GAAG,IAAI,yDAA2B,CAAC,kBAAkB,CAAC,CAAC;YAC9E,IAAI,CAAC,qBAAqB,GAAG,kBAAkB,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAE7H,IAAI,kBAAkB,CAAC,iBAAiB,IAAI,IAAI,EAAE;gBAChD,IAAI,CAAC,oBAAoB,GAAG,uBAAU,CAAC,wBAAwB,CAAC,aAAa,EAC3E,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;aAC5C;YAED,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC;SAChG;QAED,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC;QAC3C,IAAG,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACvK,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;SACrE;QACD,IAAI,CAAC,eAAe,GAAG,uBAAU,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACzE,CAAC;CACF;AA5BD,4CA4BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js deleted file mode 100644 index d2ac789c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.IssueTypeConstants = exports.TaskIssueSummaryViewModel = void 0; -const TaskIssueViewModel_1 = require("./TaskIssueViewModel"); -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const StringUtils_1 = require("../../utils/StringUtils"); -class TaskIssueSummaryViewModel { - constructor(tasks) { - this.ErrorMessage = ""; - this.ErrorCount = 0; - this.WarningCount = 0; - var allIssues = []; - this.ErrorMessage = `Failed on ${tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Failed || t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length}/${tasks.length} Agents`; - tasks.forEach(task => { - if (task.$issues != null && task.$issues.length > 0) { - task.$issues.forEach(issue => { - if (!StringUtils_1.StringUtils.isNullOrWhiteSpace(issue.$message)) { - if (issue.$issueType.toLowerCase() == IssueTypeConstants.Error) { - this.ErrorCount++; - } - else if (issue.$issueType.toLowerCase() == IssueTypeConstants.Warning) { - this.WarningCount++; - } - allIssues.push(new TaskIssueViewModel_1.TaskIssueViewModel(issue.$message, issue.$issueType, task.$agentName)); - } - }); - } - }); - this.Issues = new TaskIssueViewModel_1.TaskIssueViewModelWrapper(); - this.Issues.TaskIssueViewModel = this.TruncateIssues(allIssues); - } - TruncateIssues(issues, characterLimit = 1000) { - const truncatedIssues = []; - var warningIssues = issues.filter(t => t.IssueType.toLowerCase() != IssueTypeConstants.Error); - var errorIssues = issues.filter(t => t.IssueType.toLowerCase() == IssueTypeConstants.Error); - const sortedIssues = []; - sortedIssues.push(...warningIssues); - sortedIssues.push(...errorIssues); - let currentCharCount = 0; - for (var i = 0; i < sortedIssues.length; i++) { - const issue = sortedIssues[i]; - if (currentCharCount >= characterLimit) { - return truncatedIssues; - } - issue.Message = issue.Message.substring(0, characterLimit - currentCharCount); - currentCharCount += issue.Message.length; - truncatedIssues.push(issue); - } - return truncatedIssues; - } -} -exports.TaskIssueSummaryViewModel = TaskIssueSummaryViewModel; -class IssueTypeConstants { -} -exports.IssueTypeConstants = IssueTypeConstants; -IssueTypeConstants.Error = "error"; -IssueTypeConstants.Warning = "warning"; -//# sourceMappingURL=TaskIssueSummaryViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js.map deleted file mode 100644 index 18f293c1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskIssueSummaryViewModel.js","sourceRoot":"","sources":["TaskIssueSummaryViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js deleted file mode 100644 index 6b55d0f3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js +++ /dev/null @@ -1,15 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskIssueViewModel = exports.TaskIssueViewModelWrapper = void 0; -class TaskIssueViewModelWrapper { -} -exports.TaskIssueViewModelWrapper = TaskIssueViewModelWrapper; -class TaskIssueViewModel { - constructor(issueMessage, issueType, agentName) { - this.Message = `(${agentName}) ${issueMessage.trim()}`; - this.IssueType = issueType; - this.AgentName = agentName; - } -} -exports.TaskIssueViewModel = TaskIssueViewModel; -//# sourceMappingURL=TaskIssueViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js.map deleted file mode 100644 index c68bb95a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskIssueViewModel.js","sourceRoot":"","sources":["TaskIssueViewModel.ts"],"names":[],"mappings":";;;AAAA,MAAa,yBAAyB;CAErC;AAFD,8DAEC;AAED,MAAa,kBAAkB;IAM7B,YAAY,YAAoB,EAAE,SAAiB,EAAE,SAAiB;QACpE,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,KAAK,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAXD,gDAWC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js deleted file mode 100644 index 5a7b0e2f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js +++ /dev/null @@ -1,82 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskResultViewModel = exports.TaskResultViewModelWrapper = void 0; -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const TaskIssueSummaryViewModel_1 = require("./TaskIssueSummaryViewModel"); -const TimeFormatter_1 = require("../helpers/TimeFormatter"); -class TaskResultViewModelWrapper { -} -exports.TaskResultViewModelWrapper = TaskResultViewModelWrapper; -class TaskResultViewModel { - constructor(tasks) { - this.Name = tasks.length > 0 ? tasks[0].$name : ""; - this.HasFailed = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Failed || t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length > 0; - this.HasSkipped = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length == tasks.length; - this.NotYetRun = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.InProgress || t.$status == ReleaseInterfaces_1.TaskStatus.Unknown || t.$status == ReleaseInterfaces_1.TaskStatus.Pending).length > 0; - this.HasPartiallySucceeded = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.PartiallySucceeded).length > 0; - this.GotCancelled = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Canceled).length > 0; - const inProgressTasks = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.InProgress); - if (inProgressTasks.length == 1) { - // Must be this task - Mark it as completed assuming we will pass - // If we don't, then the email report won't be sent with this data - this.NotYetRun = false; - } - if (tasks.length > 1) { - this.HasNotRunOnSomeAgents = tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length > 0; - this.NotRunMessage = `Not run on ${tasks.filter(t => t.$status == ReleaseInterfaces_1.TaskStatus.Skipped).length}/${tasks.length} agents`; - } - this.IssuesSummary = new TaskIssueSummaryViewModel_1.TaskIssueSummaryViewModel(tasks); - // No point in calculating duration for skipped/cancelled/not-yet-run tasks - if (!this.HasSkipped && !this.NotYetRun && !this.GotCancelled) { - this.InitializeDuration(tasks.filter(t => t.$status != ReleaseInterfaces_1.TaskStatus.Skipped)); - } - else { - this.Duration = ""; - } - } - InitializeDuration(tasks) { - if (tasks.length == 1) { - var firstTask = tasks[0]; - if (firstTask.$finishTime != null && firstTask.$startTime != null) { - this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(this.getTimeDiff(firstTask)); - } - } - else { - const nonNullTasks = tasks.filter(t => t.$finishTime != null && t.$startTime != null); - if (nonNullTasks.length > 0) { - var minTime = this.getMinTime(nonNullTasks); - var maxTime = this.getMaxTime(nonNullTasks); - if (minTime != null && maxTime != null) { - const minTimeStr = TimeFormatter_1.TimeFormatter.FormatDuration(minTime); - const maxTimeStr = TimeFormatter_1.TimeFormatter.FormatDuration(maxTime); - this.Duration = minTimeStr == maxTimeStr ? minTimeStr : `${minTimeStr} - ${maxTimeStr}`; - } - } - } - } - getMinTime(tasks) { - let minTime = this.getTimeDiff(tasks[0]); - for (var i = 1; i < tasks.length; i++) { - const diffTime = this.getTimeDiff(tasks[i]); - if (diffTime < minTime) { - minTime = diffTime; - } - } - return minTime; - } - getMaxTime(tasks) { - let maxTime = this.getTimeDiff(tasks[0]); - for (var i = 1; i < tasks.length; i++) { - const diffTime = this.getTimeDiff(tasks[i]); - if (diffTime > maxTime) { - maxTime = diffTime; - } - } - return maxTime; - } - getTimeDiff(task) { - return task.$finishTime.getTime() - task.$startTime.getTime(); - } -} -exports.TaskResultViewModel = TaskResultViewModel; -//# sourceMappingURL=TaskResultViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js.map deleted file mode 100644 index 95a2c073..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TaskResultViewModel.js","sourceRoot":"","sources":["TaskResultViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js deleted file mode 100644 index 5d78c3bc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestInfoByPriorityViewModel = exports.TestInfoByPriorityViewModelWrapper = void 0; -const TestOutcomeForPriority_1 = require("../testresults/TestOutcomeForPriority"); -const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); -class TestInfoByPriorityViewModelWrapper { -} -exports.TestInfoByPriorityViewModelWrapper = TestInfoByPriorityViewModelWrapper; -class TestInfoByPriorityViewModel { - constructor(priority, testCountByOutcome, includeOthersInTotal) { - this.Priority = priority; - this.TestCount = TestResultsHelper_1.TestResultsHelper.getTotalTestCountBasedOnUserConfigurationPriority(testCountByOutcome, includeOthersInTotal); - if (this.TestCount > 0) { - var passingTests = this.getPassingTestCountByOutcome(testCountByOutcome); - this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(passingTests, this.TestCount); - } - } - getPassingTestCountByOutcome(testCountByOutcome) { - return testCountByOutcome.has(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed) - ? testCountByOutcome.get(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed) - : 0; - } -} -exports.TestInfoByPriorityViewModel = TestInfoByPriorityViewModel; -//# sourceMappingURL=TestInfoByPriorityViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js.map deleted file mode 100644 index be888529..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestInfoByPriorityViewModel.js","sourceRoot":"","sources":["TestInfoByPriorityViewModel.ts"],"names":[],"mappings":";;;AAAA,kFAA+E;AAC/E,oEAAiE;AAEjE,MAAa,kCAAkC;CAE9C;AAFD,gFAEC;AAED,MAAa,2BAA2B;IAKtC,YAAY,QAAgB,EAC1B,kBAAuD,EACvD,oBAA6B;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,qCAAiB,CAAC,iDAAiD,CAClF,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;YACtB,IAAI,YAAY,GAAG,IAAI,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;YACzE,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;SACnG;IACH,CAAC;IAEO,4BAA4B,CAAC,kBAAuD;QAC1F,OAAO,kBAAkB,CAAC,GAAG,CAAC,+CAAsB,CAAC,MAAM,CAAC;YAC1D,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,+CAAsB,CAAC,MAAM,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;CACF;AAtBD,kEAsBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js deleted file mode 100644 index 91a1d6c0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultSummaryViewModel = void 0; -const TimeFormatter_1 = require("../helpers/TimeFormatter"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TestResultsHelper_1 = require("../helpers/TestResultsHelper"); -const util_1 = require("util"); -class TestResultSummaryViewModel { - constructor(summaryItemModel, summary, pipelineConfiguration, includeOthersInTotal) { - if (summaryItemModel != null) { - this.PassedTests = summaryItemModel.getPassedTestsCount(); - this.FailedTests = summaryItemModel.getFailedTestsCount(); - this.OtherTests = summaryItemModel.getOtherTestsCount(); - this.TotalTests = TestResultsHelper_1.TestResultsHelper.getTotalTestCountBasedOnUserConfiguration(summaryItemModel.$testCountByOutcome, includeOthersInTotal); - this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); - this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(summaryItemModel.$duration); - this.Url = pipelineConfiguration.getTestTabLink(); - } - else if (summary != null) { - const passedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Passed]; - const failedAnalysis = summary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; - this.PassedTests = util_1.isNullOrUndefined(passedAnalysis) ? 0 : passedAnalysis.count; - this.FailedTests = util_1.isNullOrUndefined(failedAnalysis) ? 0 : failedAnalysis.count; - this.TotalTests = summary.aggregatedResultsAnalysis.totalTests; - this.OtherTests = this.TotalTests - this.PassedTests - this.FailedTests; - if (!includeOthersInTotal) { - this.TotalTests -= this.OtherTests; - } - this.Duration = TimeFormatter_1.TimeFormatter.FormatDurationStr(summary.aggregatedResultsAnalysis.duration); - this.PassingRate = TestResultsHelper_1.TestResultsHelper.getTestOutcomePercentageString(this.PassedTests, this.TotalTests); - this.Url = pipelineConfiguration.getTestTabLink(); - } - } -} -exports.TestResultSummaryViewModel = TestResultSummaryViewModel; -TestResultSummaryViewModel.MaxSupportedPriority = 2; -//# sourceMappingURL=TestResultSummaryViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js.map deleted file mode 100644 index bc2bc776..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultSummaryViewModel.js","sourceRoot":"","sources":["TestResultSummaryViewModel.ts"],"names":[],"mappings":";;;AAEA,4DAAyD;AACzD,oFAAiG;AACjG,oEAAiE;AACjE,+BAAyC;AAEzC,MAAa,0BAA0B;IAUrC,YAAY,gBAAsC,EAAE,OAA0B,EAAE,qBAA4C,EAAE,oBAA6B;QACzJ,IAAI,gBAAgB,IAAI,IAAI,EAAE;YAC5B,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;YAExD,IAAI,CAAC,UAAU,GAAG,qCAAiB,CAAC,yCAAyC,CAAC,gBAAgB,CAAC,mBAAmB,EAChH,oBAAoB,CAAC,CAAC;YAExB,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvG,IAAI,CAAC,QAAQ,GAAG,6BAAa,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAEzE,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;SACnD;aACI,IAAI,OAAO,IAAI,IAAI,EAAE;YACxB,MAAM,cAAc,GAAG,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;YAC9F,MAAM,cAAc,GAAG,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC;YAC9F,IAAI,CAAC,WAAW,GAAG,wBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAChF,IAAI,CAAC,WAAW,GAAG,wBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAChF,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,yBAAyB,CAAC,UAAU,CAAC;YAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAExE,IAAI,CAAC,oBAAoB,EAAE;gBACzB,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;aACpC;YAED,IAAI,CAAC,QAAQ,GAAG,6BAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;YAC5F,IAAI,CAAC,WAAW,GAAG,qCAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACvG,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;SACnD;IACH,CAAC;;AAzCH,gEA0CC;AAzCwB,+CAAoB,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js deleted file mode 100644 index 1d8005b1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultViewModel = exports.TestResultViewModelWrapper = void 0; -const WorkItemViewModel_1 = require("./WorkItemViewModel"); -const StringUtils_1 = require("../../utils/StringUtils"); -const LinkHelper_1 = require("../helpers/LinkHelper"); -const TimeFormatter_1 = require("../helpers/TimeFormatter"); -const DisplayNameHelper_1 = require("../../utils/DisplayNameHelper"); -const ReleaseReferenceViewModel_1 = require("./ReleaseReferenceViewModel"); -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -const BuildReferenceViewModel_1 = require("./BuildReferenceViewModel"); -const util_1 = require("util"); -class TestResultViewModelWrapper { -} -exports.TestResultViewModelWrapper = TestResultViewModelWrapper; -class TestResultViewModel { - constructor(testResultModel, config) { - this.StackTraceLineCount = 5; - const result = testResultModel.testResult; - this.Id = result.id; - this.TestCaseTitle = result.testCaseTitle; - this.ErrorMessage = ""; - this.TestOutcome = result.outcome; - this.StackTrace = ""; - if (result.priority != 255) { - this.Priority = DisplayNameHelper_1.DisplayNameHelper.getPriorityDisplayName(result.priority == null ? "" : result.priority.toString()); - } - this.InitializeAssociatedBugs(config, testResultModel.associatedBugs); - this.Url = LinkHelper_1.LinkHelper.getTestResultLink(config, result.testRun.id, this.Id); - this.Owner = result.owner == null ? null : result.owner.displayName; - if (result.failingSince != null) { - const failingSincePipeline = config.$pipelineType == PipelineType_1.PipelineType.Build ? result.failingSince.release : result.failingSince.build; - const failingSinceNotCurrent = failingSincePipeline == null ? false : failingSincePipeline.id != config.$pipelineId; - if (failingSinceNotCurrent) { - this.FailingSinceTime = result.failingSince.date.toDateString(); - if (result.failingSince.release != null && result.failingSince.release.id > 0) { - this.FailingSinceRelease = new ReleaseReferenceViewModel_1.ReleaseReferenceViewModel(config, result.failingSince.release); - } - if (result.failingSince.build != null && result.failingSince.build.id > 0) { - this.FailingSinceBuild = new BuildReferenceViewModel_1.BuildReferenceViewModel(config, null, result.failingSince.build); - } - } - } - if (util_1.isNullOrUndefined(result.durationInMs)) { - if (!util_1.isNullOrUndefined(result.startedDate) && !util_1.isNullOrUndefined(result.completedDate)) { - result.durationInMs = result.completedDate.getTime() - result.startedDate.getTime(); - } - if (util_1.isNullOrUndefined(result.durationInMs) || result.durationInMs < 0) { - // unknown duration - assume test didn't run instead of displaying "Undefined/NaN" in email - result.durationInMs = 0; - } - } - this.Duration = TimeFormatter_1.TimeFormatter.FormatDuration(result.durationInMs); - this.CreateBugLink = LinkHelper_1.LinkHelper.getCreateBugLinkForTest(config, testResultModel.testResult); - } - InitializeAssociatedBugs(config, associatedBugs) { - this.AssociatedBugs = new WorkItemViewModel_1.WorkItemViewModelWrapper(); - this.AssociatedBugs.WorkItemViewModel = []; - if (associatedBugs == null) { - return; - } - associatedBugs.forEach(workItem => { - if (workItem.id != null) { - this.AssociatedBugs.WorkItemViewModel.push(new WorkItemViewModel_1.WorkItemViewModel(config, workItem)); - } - }); - } -} -exports.TestResultViewModel = TestResultViewModel; -//# sourceMappingURL=TestResultViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js.map deleted file mode 100644 index f87e77ba..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultViewModel.js","sourceRoot":"","sources":["TestResultViewModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js deleted file mode 100644 index 9d67303e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsGroupViewModel = exports.TestResultsGroupViewModelWrapper = void 0; -const TestResultViewModel_1 = require("./TestResultViewModel"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -const DisplayNameHelper_1 = require("../../utils/DisplayNameHelper"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TcmHelper_1 = require("../../providers/tcmproviders/TcmHelper"); -class TestResultsGroupViewModelWrapper { -} -exports.TestResultsGroupViewModelWrapper = TestResultsGroupViewModelWrapper; -class TestResultsGroupViewModel { - constructor(resultsGroupModel, reportConfig) { - this.FailedTests = new TestResultViewModel_1.TestResultViewModelWrapper(); - this.OtherTests = new TestResultViewModel_1.TestResultViewModelWrapper(); - this.PassedTests = new TestResultViewModel_1.TestResultViewModelWrapper(); - this.setGroupName(resultsGroupModel, reportConfig); - this.FailedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestInterfaces_1.TestOutcome.Failed]); - this.PassedTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, [TestInterfaces_1.TestOutcome.Passed]); - this.OtherTests.TestResultViewModel = this.getTestResultViewModels(resultsGroupModel, reportConfig.$pipelineConfiguration, TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed])); - } - setGroupName(resultsGroupModel, reportConfig) { - var groupTestResultsBy = reportConfig.$reportDataConfiguration.$testResultsConfig.$groupTestResultsBy; - this.GroupName = groupTestResultsBy == GroupTestResultsBy_1.GroupTestResultsBy.Priority ? - DisplayNameHelper_1.DisplayNameHelper.getPriorityDisplayName(resultsGroupModel.groupName) : - resultsGroupModel.groupName; - } - getTestResultViewModels(resultsGroupModel, config, testOutcomes) { - return this.getTestResultsByOutcomes(resultsGroupModel, testOutcomes) - .map(result => new TestResultViewModel_1.TestResultViewModel(result, config)); - } - getTestResultsByOutcomes(source, outcomes) { - const testResults = []; - outcomes.forEach(outcome => { - if (source.testResults.has(outcome)) { - testResults.push(...source.testResults.get(outcome)); - } - }); - return testResults; - } -} -exports.TestResultsGroupViewModel = TestResultsGroupViewModel; -//# sourceMappingURL=TestResultsGroupViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js.map deleted file mode 100644 index 96653582..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultsGroupViewModel.js","sourceRoot":"","sources":["TestResultsGroupViewModel.ts"],"names":[],"mappings":";;;AAAA,+DAAwF;AAGxF,+EAA4E;AAC5E,qEAAkE;AAElE,oFAA8E;AAE9E,sEAAmE;AAEnE,MAAa,gCAAgC;CAE5C;AAFD,4EAEC;AAED,MAAa,yBAAyB;IAMpC,YAAY,iBAAwC,EAAE,YAAiC;QALhF,gBAAW,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAE3E,eAAU,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAC1E,gBAAW,GAA+B,IAAI,gDAA0B,EAAE,CAAC;QAGhF,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClJ,IAAI,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClJ,IAAI,CAAC,UAAU,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,YAAY,CAAC,sBAAsB,EACvH,qBAAS,CAAC,cAAc,CAAC,CAAC,4BAAW,CAAC,MAAM,EAAE,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,YAAY,CAAC,iBAAwC,EAAE,YAAiC;QAC9F,IAAI,kBAAkB,GAAG,YAAY,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;QACtG,IAAI,CAAC,SAAS,GAAG,kBAAkB,IAAI,uCAAkB,CAAC,QAAQ,CAAC,CAAC;YAClE,qCAAiB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;YACvE,iBAAiB,CAAC,SAAS,CAAC;IAChC,CAAC;IAEO,uBAAuB,CAC7B,iBAAwC,EACxC,MAA6B,EAC7B,YAA2B;QAC3B,OAAO,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,YAAY,CAAC;aAClE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,yCAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEM,wBAAwB,CAC7B,MAA6B,EAC7B,QAAuB;QACvB,MAAM,WAAW,GAAsB,EAAE,CAAC;QAE1C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBACnC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtD;QACH,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAzCD,8DAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js deleted file mode 100644 index 2c67732d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryGroupViewModel = exports.TestSummaryGroupViewModelWrapper = void 0; -const TestSummaryItemViewModel_1 = require("./TestSummaryItemViewModel"); -const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -class TestSummaryGroupViewModelWrapper { -} -exports.TestSummaryGroupViewModelWrapper = TestSummaryGroupViewModelWrapper; -class TestSummaryGroupViewModel { - constructor(testSummaryGroup, config, includeOthersInTotal) { - this.GroupName = this.getDescription(testSummaryGroup.groupedBy); - this.InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal); - this.InitializeSupportedPriorityColumns(); - } - InitializeSummaryItems(testSummaryGroup, config, includeOthersInTotal) { - this.SummaryItems = new TestSummaryItemViewModel_1.TestSummaryItemViewModelWrapper(); - this.SummaryItems.TestSummaryItemViewModel = []; - testSummaryGroup.runs.forEach(testSummaryItem => { - this.SummaryItems.TestSummaryItemViewModel.push(new TestSummaryItemViewModel_1.TestSummaryItemViewModel(testSummaryGroup.groupedBy, testSummaryItem, config, includeOthersInTotal)); - }); - } - InitializeSupportedPriorityColumns() { - this.SupportedPriorityColumns = new Set(); - this.SummaryItems.TestSummaryItemViewModel.forEach(item => item.TestsByPriority.TestInfoByPriorityViewModel.forEach(testsByPriorityVm => { - if (testsByPriorityVm.Priority <= TestResultSummaryViewModel_1.TestResultSummaryViewModel.MaxSupportedPriority) { - this.SupportedPriorityColumns.add(testsByPriorityVm.Priority); - } - })); - } - getDescription(groupedBy) { - switch (groupedBy) { - case GroupTestResultsBy_1.GroupTestResultsBy.Priority: return "Priority"; - case GroupTestResultsBy_1.GroupTestResultsBy.Run: return "Test Run"; - default: return "Team"; - } - } -} -exports.TestSummaryGroupViewModel = TestSummaryGroupViewModel; -//# sourceMappingURL=TestSummaryGroupViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js.map deleted file mode 100644 index 320e62a9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryGroupViewModel.js","sourceRoot":"","sources":["TestSummaryGroupViewModel.ts"],"names":[],"mappings":";;;AAEA,yEAAuG;AACvG,6EAA0E;AAC1E,+EAA4E;AAE5E,MAAa,gCAAgC;CAE5C;AAFD,4EAEC;AAED,MAAa,yBAAyB;IAKpC,YAAY,gBAAuC,EACjD,MAA6B,EAC7B,oBAA6B;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAE5E,IAAI,CAAC,kCAAkC,EAAE,CAAC;IAC5C,CAAC;IAEO,sBAAsB,CAC5B,gBAAuC,EACvC,MAA6B,EAC7B,oBAA6B;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,0DAA+B,EAAE,CAAC;QAC1D,IAAI,CAAC,YAAY,CAAC,wBAAwB,GAAG,EAAE,CAAC;QAChD,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;YAC9C,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,mDAAwB,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3J,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,kCAAkC;QACxC,IAAI,CAAC,wBAAwB,GAAG,IAAI,GAAG,EAAU,CAAC;QAElD,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CACxD,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;YAC3E,IAAI,iBAAiB,CAAC,QAAQ,IAAI,uDAA0B,CAAC,oBAAoB,EAAE;gBACjF,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;aAC/D;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,SAA6B;QAClD,QAAQ,SAAS,EAAE;YACjB,KAAK,uCAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,UAAU,CAAC;YACpD,KAAK,uCAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,UAAU,CAAC;YAC/C,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;SACxB;IACH,CAAC;CACF;AA5CD,8DA4CC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js deleted file mode 100644 index 78194d33..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryItemViewModel = exports.TestSummaryItemViewModelWrapper = void 0; -const TestResultSummaryViewModel_1 = require("./TestResultSummaryViewModel"); -const TestInfoByPriorityViewModel_1 = require("./TestInfoByPriorityViewModel"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -class TestSummaryItemViewModelWrapper { -} -exports.TestSummaryItemViewModelWrapper = TestSummaryItemViewModelWrapper; -class TestSummaryItemViewModel extends TestResultSummaryViewModel_1.TestResultSummaryViewModel { - constructor(groupedBy, summaryItem, config, includeOthersInTotal) { - super(summaryItem, null, config, includeOthersInTotal); - this.TestsByPriority = new TestInfoByPriorityViewModel_1.TestInfoByPriorityViewModelWrapper(); - this.Name = (groupedBy == GroupTestResultsBy_1.GroupTestResultsBy.Priority) ? - this.getDisplayName(summaryItem.$name) : - summaryItem.$name; - this.setupPriorityData(summaryItem, includeOthersInTotal); - } - setupPriorityData(summaryItem, includeOthersInTotal) { - this.TestsByPriority.TestInfoByPriorityViewModel = []; - const testCountForOutcomeByPriority = summaryItem.$testCountForOutcomeByPriority; - testCountForOutcomeByPriority.forEach((value, priority) => { - if (priority <= TestResultSummaryViewModel_1.TestResultSummaryViewModel.MaxSupportedPriority) { - this.TestsByPriority.TestInfoByPriorityViewModel.push(new TestInfoByPriorityViewModel_1.TestInfoByPriorityViewModel(priority, value, includeOthersInTotal)); - } - }); - } - getDisplayName(priority) { - const priorityInt = Number.parseInt(priority); - if (!isNaN(priorityInt) && priorityInt == 255) { - return "Priority unspecified"; - } - return `Priority: ${priority}`; - } -} -exports.TestSummaryItemViewModel = TestSummaryItemViewModel; -//# sourceMappingURL=TestSummaryItemViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js.map deleted file mode 100644 index 19641149..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryItemViewModel.js","sourceRoot":"","sources":["TestSummaryItemViewModel.ts"],"names":[],"mappings":";;;AAAA,6EAA0E;AAC1E,+EAAgH;AAGhH,+EAA4E;AAG5E,MAAa,+BAA+B;CAE3C;AAFD,0EAEC;AAED,MAAa,wBAAyB,SAAQ,uDAA0B;IAItE,YACE,SAA6B,EAC7B,WAAiC,EACjC,MAA6B,EAC7B,oBAA6B;QAC7B,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAPlD,oBAAe,GAAuC,IAAI,gEAAkC,EAAE,CAAC;QAQpG,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,IAAI,uCAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,WAAW,CAAC,KAAK,CAAC;QAEpB,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IAC5D,CAAC;IAEO,iBAAiB,CAAC,WAAiC,EAAE,oBAA6B;QACxF,IAAI,CAAC,eAAe,CAAC,2BAA2B,GAAG,EAAE,CAAC;QAEtD,MAAM,6BAA6B,GACjC,WAAW,CAAC,8BAA8B,CAAC;QAE7C,6BAA6B,CAAC,OAAO,CAAC,CAAC,KAA0C,EAAE,QAAgB,EAAE,EAAE;YACrG,IAAI,QAAQ,IAAI,uDAA0B,CAAC,oBAAoB,EAAE;gBAC/D,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,yDAA2B,CAAC,QAAQ,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC;aAC/H;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,QAAgB;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE;YAC7C,OAAO,sBAAsB,CAAC;SAC/B;QACD,OAAO,aAAa,QAAQ,EAAE,CAAC;IACjC,CAAC;CACF;AArCD,4DAqCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js deleted file mode 100644 index acde0aad..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.WorkItemViewModel = exports.WorkItemViewModelWrapper = void 0; -const LinkHelper_1 = require("../helpers/LinkHelper"); -const StringUtils_1 = require("../../utils/StringUtils"); -const util_1 = require("util"); -class WorkItemViewModelWrapper { -} -exports.WorkItemViewModelWrapper = WorkItemViewModelWrapper; -class WorkItemViewModel { - constructor(config, workItem) { - if (workItem.id != null) { - this.Id = workItem.id; - this.Url = LinkHelper_1.LinkHelper.getWorkItemLink(config, workItem.id); - } - this.Title = workItem.fields["System.Title"]; - // This is for display in email report only - var assignToRef = workItem.fields["System.AssignedTo"]; - // Prefer Display name to Unique Name in report - this.AssignedTo = util_1.isNullOrUndefined(assignToRef) ? "" : (StringUtils_1.StringUtils.isNullOrWhiteSpace(assignToRef.displayName) ? assignToRef.uniqueName : assignToRef.displayName); - // Unassigned workitem - this.AssignedTo = util_1.isNullOrUndefined(this.AssignedTo) ? "" : this.AssignedTo; - this.State = workItem.fields["System.State"]; - this.ChangedDate = workItem.fields["System.ChangedDate"]; - } -} -exports.WorkItemViewModel = WorkItemViewModel; -//# sourceMappingURL=WorkItemViewModel.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js.map deleted file mode 100644 index 5324f5b6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"WorkItemViewModel.js","sourceRoot":"","sources":["WorkItemViewModel.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AACnD,yDAAsD;AACtD,+BAAyC;AAEzC,MAAa,wBAAwB;CAEpC;AAFD,4DAEC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,MAA6B,EAAE,QAAkB;QAC3D,IAAI,QAAQ,CAAC,EAAE,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,GAAG,uBAAU,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC5D;QAED,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE7C,2CAA2C;QAC3C,IAAI,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACvD,+CAA+C;QAC/C,IAAI,CAAC,UAAU,GAAG,wBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACrK,sBAAsB;QACtB,IAAI,CAAC,UAAU,GAAG,wBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAE5E,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC;CACF;AA1BD,8CA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js deleted file mode 100644 index 3bcb7b68..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DataProviderFactory = void 0; -const PipelineType_1 = require("../config/pipeline/PipelineType"); -const ReleaseDataProvider_1 = require("./pipeline/ReleaseDataProvider"); -const ReleaseClient_1 = require("./restclients/ReleaseClient"); -const TestOwnersDataProvider_1 = require("./tcmproviders/TestOwnersDataProvider"); -const TestSummaryDataProvider_1 = require("./tcmproviders/TestSummaryDataProvider"); -const TestResultsDataProvider_1 = require("./tcmproviders/TestResultsDataProvider"); -const WorkItemClient_1 = require("./restclients/WorkItemClient"); -const SendMailConditionProcessor_1 = require("./SendMailConditionProcessor"); -const BuildClient_1 = require("./restclients/BuildClient"); -const BuildDataProvider_1 = require("./pipeline/BuildDataProvider"); -const BuildTestResultsClient_1 = require("./restclients/BuildTestResultsClient"); -const ReleaseTestResultsClient_1 = require("./restclients/ReleaseTestResultsClient"); -class DataProviderFactory { - constructor($pipelineConfig) { - this.dataProviders = []; - this.postProcessors = []; - this.pipelineConfig = $pipelineConfig; - } - getDataProviders() { - if (this.dataProviders.length < 1) { - if (this.pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Release) { - const pipelineRestClient = new ReleaseClient_1.ReleaseRestClient(this.pipelineConfig); - this.dataProviders.push(new ReleaseDataProvider_1.ReleaseDataProvider(pipelineRestClient)); - } - else { - const pipelineRestClient = new BuildClient_1.BuildRestClient(this.pipelineConfig); - this.dataProviders.push(new BuildDataProvider_1.BuildDataProvider(pipelineRestClient)); - } - const testResultsClient = this.getTestResultsClient(); - const workItemClient = new WorkItemClient_1.WorkItemClient(this.pipelineConfig); - this.dataProviders.push(new TestOwnersDataProvider_1.TestOwnersDataProvider(testResultsClient)); - this.dataProviders.push(new TestSummaryDataProvider_1.TestSummaryDataProvider(testResultsClient)); - this.dataProviders.push(new TestResultsDataProvider_1.TestResultsDataProvider(testResultsClient, workItemClient)); - } - return this.dataProviders; - } - getPostProcessors() { - if (this.postProcessors.length < 1) { - this.postProcessors.push(new SendMailConditionProcessor_1.SendMailConditionProcessor(this.getTestResultsClient())); - } - return this.postProcessors; - } - getTestResultsClient() { - if (this.testResultsClient == null) { - this.testResultsClient = this.pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build ? - new BuildTestResultsClient_1.BuildTestResultsClient(this.pipelineConfig) : - new ReleaseTestResultsClient_1.ReleaseTestResultsClient(this.pipelineConfig); - } - return this.testResultsClient; - } -} -exports.DataProviderFactory = DataProviderFactory; -//# sourceMappingURL=DataProviderFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js.map deleted file mode 100644 index 8c21bdb2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DataProviderFactory.js","sourceRoot":"","sources":["DataProviderFactory.ts"],"names":[],"mappings":";;;AAIA,kEAA+D;AAC/D,wEAAqE;AACrE,+DAAgE;AAChE,kFAA+E;AAC/E,oFAAiF;AACjF,oFAAiF;AACjF,iEAA8D;AAC9D,6EAA0E;AAC1E,2DAA4D;AAC5D,oEAAiE;AAEjE,iFAA8E;AAC9E,qFAAkF;AAElF,MAAa,mBAAmB;IAQ9B,YAAY,eAAsC;QAL1C,kBAAa,GAAoB,EAAE,CAAC;QACpC,mBAAc,GAAqB,EAAE,CAAC;QAK5C,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;IACxC,CAAC;IAEM,gBAAgB;QACrB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,OAAO,EAAE;gBAC7D,MAAM,kBAAkB,GAAG,IAAI,iCAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACtE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC;aACtE;iBAAM;gBACL,MAAM,kBAAkB,GAAG,IAAI,6BAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACpE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,qCAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC;aACpE;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE/D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,+CAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iDAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iDAAuB,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;SACzF;QAED,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEM,iBAAiB;QACtB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,uDAA0B,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;SACvF;QAED,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,oBAAoB;QAC1B,IAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE;YACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC;gBAChF,IAAI,+CAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACjD,IAAI,mDAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACrD;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AAhDD,kDAgDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js deleted file mode 100644 index b8225b61..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js.map deleted file mode 100644 index 48b33d63..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IDataProvider.js","sourceRoot":"","sources":["IDataProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js deleted file mode 100644 index 1653e44f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IDataProviderFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js.map deleted file mode 100644 index ee835e22..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IDataProviderFactory.js","sourceRoot":"","sources":["IDataProviderFactory.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js deleted file mode 100644 index b119f9a9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IPostProcessor.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js.map deleted file mode 100644 index 64da73b0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IPostProcessor.js","sourceRoot":"","sources":["IPostProcessor.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js deleted file mode 100644 index 462734a9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IReportProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js.map deleted file mode 100644 index 141696fa..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IReportProvider.js","sourceRoot":"","sources":["IReportProvider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js deleted file mode 100644 index a4eb6732..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js +++ /dev/null @@ -1,86 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReportProvider = void 0; -const ReportFactory_1 = require("../model/ReportFactory"); -const ReportError_1 = require("../exceptions/ReportError"); -const DataProviderError_1 = require("../exceptions/DataProviderError"); -const PostProcessorError_1 = require("../exceptions/PostProcessorError"); -const TelemetryLogger_1 = require("../telemetry/TelemetryLogger"); -class ReportProvider { - constructor(dataProviderFactory) { - this.dataProviders = []; - this.postProcessors = []; - this.dataProviders.push(...dataProviderFactory.getDataProviders()); - this.postProcessors.push(...dataProviderFactory.getPostProcessors()); - } - createReportAsync(reportConfig) { - return __awaiter(this, void 0, void 0, function* () { - let finalReport; - try { - const reportTaskArray = this.dataProviders.map(dataProvider => TelemetryLogger_1.TelemetryLogger.InvokeWithPerfLogger(() => __awaiter(this, void 0, void 0, function* () { return this.callDataProvider(dataProvider, reportConfig); }), dataProvider.constructor.name)); - const reports = yield Promise.all(reportTaskArray); - finalReport = ReportFactory_1.ReportFactory.mergeReports(reports); - // Post Process data collected - const processorTasks = this.postProcessors.map(processor => TelemetryLogger_1.TelemetryLogger.InvokeWithPerfLogger(() => __awaiter(this, void 0, void 0, function* () { return this.callPostProcessor(processor, reportConfig, finalReport); }), processor.constructor.name)); - // Wait for all processors - yield Promise.all(processorTasks); - } - catch (err) { - ReportError_1.ReportError.HandleError(err); - if (finalReport == null) - finalReport = ReportFactory_1.ReportFactory.createNewReport(reportConfig.$pipelineConfiguration); - finalReport.$dataMissing = true; - } - return finalReport; - }); - } - callDataProvider(dataProvider, reportConfig) { - return __awaiter(this, void 0, void 0, function* () { - let report = null; - try { - report = yield dataProvider.getReportDataAsync(reportConfig.$pipelineConfiguration, reportConfig.$reportDataConfiguration); - } - catch (err) { - // Do not error out until all data providers are done - console.log(err); - if (!(err instanceof ReportError_1.ReportError)) { - const reportError = new DataProviderError_1.DataProviderError(`Error fetching data using ${dataProvider.constructor.name}: ${err.message}`); - reportError.innerError = err; - throw reportError; - } - throw err; - } - return report; - }); - } - callPostProcessor(postProcessor, reportConfig, report) { - return __awaiter(this, void 0, void 0, function* () { - let retVal = false; - try { - retVal = yield postProcessor.processReportAsync(reportConfig, report); - } - catch (err) { - // Do not error out until all post processors are done - console.log(err); - if (!(err instanceof ReportError_1.ReportError)) { - const reportError = new PostProcessorError_1.PostProcessorError(`Error fetching data using ${postProcessor.constructor.name}: ${err.message}`); - reportError.innerError = err; - throw reportError; - } - throw err; - } - return retVal; - }); - } -} -exports.ReportProvider = ReportProvider; -//# sourceMappingURL=ReportProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js.map deleted file mode 100644 index 71491088..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportProvider.js","sourceRoot":"","sources":["ReportProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js deleted file mode 100644 index 992128e1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.SendMailConditionProcessor = void 0; -const SendMailCondition_1 = require("../config/report/SendMailCondition"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const util_1 = require("util"); -const TcmHelper_1 = require("./tcmproviders/TcmHelper"); -const AbstractTestResultsClient_1 = require("./restclients/AbstractTestResultsClient"); -const EnumUtils_1 = require("../utils/EnumUtils"); -class SendMailConditionProcessor { - constructor(testResultsClient) { - this.TestResultFieldsToQuery = ["TestCaseReferenceId", "OutcomeConfidence"]; - this.testResultsClient = testResultsClient; - } - processReportAsync(reportConfig, report) { - return __awaiter(this, void 0, void 0, function* () { - var shouldSendMail = false; - if (!report.$dataMissing) { - const sendMailCondition = reportConfig.$sendMailCondition; - shouldSendMail = sendMailCondition == SendMailCondition_1.SendMailCondition.Always; - if (!shouldSendMail) { - var hasTestFailures = report.hasFailedTests(reportConfig.$reportDataConfiguration.$includeOthersInTotal); - var hasFailedTasks = report.hasFailedTasks(); - var hasCanceledPhases = report.hasCanceledPhases(); - var hasFailure = hasTestFailures || hasFailedTasks || hasCanceledPhases; - if ((sendMailCondition == SendMailCondition_1.SendMailCondition.OnFailure && hasFailure) - || (sendMailCondition == SendMailCondition_1.SendMailCondition.OnSuccess && !hasFailure)) { - shouldSendMail = true; - } - else if (sendMailCondition == SendMailCondition_1.SendMailCondition.OnNewFailuresOnly && hasFailure) { - // Always treat phase cancellation issues as new failure as we cannot distinguish/compare phase level issues - // Still compare failed tests and failed tasks where possible to reduce noise - if (hasCanceledPhases && !hasTestFailures && !hasFailedTasks) { - shouldSendMail = true; - console.log(`Has Phase cancellation(s) issues. Treating as new failure.`); - } - else { - console.log(`Looking for new failures, as the user send mail condition is '${EnumUtils_1.EnumUtils.GetMailConditionString(sendMailCondition)}'.`); - shouldSendMail = !(yield this.hasPreviousReleaseGotSameFailuresAsync(report, reportConfig.$pipelineConfiguration, hasTestFailures, hasFailedTasks)); - } - } - } - } - report.$sendMailConditionSatisfied = shouldSendMail; - return shouldSendMail; - }); - } - hasPreviousReleaseGotSameFailuresAsync(report, config, hasTestFailures, hasFailedTasks) { - return __awaiter(this, void 0, void 0, function* () { - var hasPrevGotSameFailures = report.hasPrevGotSameFailures(); - if (!util_1.isNullOrUndefined(hasPrevGotSameFailures) && hasPrevGotSameFailures) { - return hasPrevGotSameFailures; - } - const hasPrevFailedTasks = report.hasPrevFailedTasks(); - if (report.testResultSummary == null) { - return false; - } - if (hasTestFailures) { - var prevConfig = report.getPrevConfig(config); - if (util_1.isNullOrUndefined(prevConfig)) { - // we don't know anything about prev pipeline failures if we have no info - assume they are not same - return false; - } - var lastCompletedTestResultSummary = yield this.testResultsClient.queryTestResultsReportAsync(prevConfig); - var failedInCurrent = this.getFailureCountFromSummary(report.testResultSummary); - var failedinPrev = this.getFailureCountFromSummary(lastCompletedTestResultSummary); - // Threshold is 10 to decide whether they are same failures - console.log(`Current Failures Found: '${failedInCurrent}'.`); - console.log(`Previous Failures Found: '${failedinPrev}'.`); - var hasSameFailures = failedInCurrent == failedinPrev; - // No point in moving ahead if number of failures is different - if (hasSameFailures) { - var currFailedTestCaseRefIds = yield this.fetchFailedTestCaseIdsAsync(config); - var prevFailedTestCaseRefIds = yield this.fetchFailedTestCaseIdsAsync(prevConfig); - const leftJoin = currFailedTestCaseRefIds.filter(c => !prevFailedTestCaseRefIds.includes(c)); - if (leftJoin.length > 0) { - console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); - hasSameFailures = false; - } - else { - const rightJoin = prevFailedTestCaseRefIds.filter(p => !currFailedTestCaseRefIds.includes(p)); - if (rightJoin.length > 0) { - console.log(`Difference in Failed Test Reference Ids found between current and prev pipeline.`); - hasSameFailures = false; - } - else { - console.log(`Failed Test Reference Ids match. No new failures found.`); - hasSameFailures = true; - } - } - } - return hasSameFailures; - } - else if (hasFailedTasks && hasPrevFailedTasks) { - return report.arePrevFailedTasksSame(); - } - return false; - }); - } - getFailureCountFromSummary(testResultSummary) { - const failedOutcome = testResultSummary.aggregatedResultsAnalysis.resultsByOutcome[TestInterfaces_1.TestOutcome.Failed]; - return !util_1.isNullOrUndefined(failedOutcome) ? failedOutcome.count : 0; - } - fetchFailedTestCaseIdsAsync(pipelineConfig) { - return __awaiter(this, void 0, void 0, function* () { - var testSummary = yield this.testResultsClient.getTestResultsDetailsAsync(null, [TestInterfaces_1.TestOutcome.Failed], pipelineConfig); - var resultsToQuery = []; - testSummary.resultsForGroup.forEach(r => resultsToQuery.push(...r.results)); - var testCaseIds = []; - if (resultsToQuery.length > 0) { - // API supports only 100 results at a time - const tasks = []; - for (let i = 0, j = resultsToQuery.length; i < j; i += 100) { - const tempArray = resultsToQuery.slice(i, i + 100); - let query = new AbstractTestResultsClient_1.TestResultsQueryImpl(); - query.fields = this.TestResultFieldsToQuery; - query.results = tempArray; - tasks.push(this.testResultsClient.getTestResultsByQueryAsync(query)); - } - const resultQueries = yield Promise.all(tasks); - resultQueries.forEach(rq => { - let tempIds = rq.results.filter(r => TcmHelper_1.TcmHelper.isTestFlaky(r)).map(r1 => r1.testCaseReferenceId); - testCaseIds.push(...tempIds); - }); - } - return testCaseIds; - }); - } -} -exports.SendMailConditionProcessor = SendMailConditionProcessor; -//# sourceMappingURL=SendMailConditionProcessor.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js.map deleted file mode 100644 index 113e7bc5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SendMailConditionProcessor.js","sourceRoot":"","sources":["SendMailConditionProcessor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js deleted file mode 100644 index 1e57f6fe..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AbstractTestResultsDetailsParser = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const util_1 = require("util"); -const TimeFormatter_1 = require("../../model/helpers/TimeFormatter"); -class AbstractTestResultsDetailsParser { - constructor(testResultDetails) { - this.testResultDetails = testResultDetails; - } - /// - /// Get Duration, TotalTests & test count by outcome - /// Calculating total duration, as the tcm data has duration by test outcome only. - /// - parseBaseData(resultsForGroup, summaryItem) { - let duration = 0; - for (let item in TestInterfaces_1.TestOutcome) { - if (!isNaN(Number(item))) { - const resultsByOutCome = resultsForGroup.resultsCountByOutcome[Number(item)]; - if (!util_1.isNullOrUndefined(resultsByOutCome)) { - summaryItem.$testCountByOutcome.set(resultsByOutCome.outcome, resultsByOutCome.count); - duration += TimeFormatter_1.TimeFormatter.ConvertTimeStringToMilliSeconds(resultsByOutCome.duration); - } - } - } - // // HACK - SHould get data directly from resultsGroup.resultsCountByOutcome - but that data is coming wrong - // resultsForGroup.results.forEach(r => { - // duration += isNaN(r.durationInMs) ? 0 : r.durationInMs; - // }); - summaryItem.$duration = duration; - summaryItem.$totalTestCount = resultsForGroup.results.length; - } -} -exports.AbstractTestResultsDetailsParser = AbstractTestResultsDetailsParser; -//# sourceMappingURL=AbstractTestResultsDetailsParser.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js.map deleted file mode 100644 index d2aa53e6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AbstractTestResultsDetailsParser.js","sourceRoot":"","sources":["AbstractTestResultsDetailsParser.ts"],"names":[],"mappings":";;;AAAA,oFAA0K;AAE1K,+BAAyC;AACzC,qEAAkE;AAElE,MAAsB,gCAAgC;IAIpD,YAAY,iBAAqC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAMD,aAAa;IACb,oDAAoD;IACpD,kFAAkF;IAClF,cAAc;IACJ,aAAa,CAAC,eAA2C,EAAE,WAAiC;QACpG,IAAI,QAAQ,GAAW,CAAC,CAAC;QACzB,KAAK,IAAI,IAAI,IAAI,4BAAW,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;gBACxB,MAAM,gBAAgB,GAAG,eAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7E,IAAI,CAAC,wBAAiB,CAAC,gBAAgB,CAAC,EAAE;oBACxC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACtF,QAAQ,IAAI,6BAAa,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;iBACtF;aACF;SACF;QAED,6GAA6G;QAC7G,yCAAyC;QACzC,4DAA4D;QAC5D,MAAM;QAEN,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC;QACjC,WAAW,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/D,CAAC;CAMF;AAzCD,4EAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js deleted file mode 100644 index 28109614..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultDetailsParserFactory = void 0; -const TestResultDetailsParserForRun_1 = require("./TestResultDetailsParserForRun"); -const TestResultDetailsParserForPriority_1 = require("./TestResultDetailsParserForPriority"); -const DataProviderError_1 = require("../../exceptions/DataProviderError"); -class TestResultDetailsParserFactory { - static getParser(resultDetails) { - var groupByField = resultDetails.groupByField; - if (groupByField.toLowerCase() == "TestRun".toLowerCase()) { - return new TestResultDetailsParserForRun_1.TestResultDetailsParserForRun(resultDetails); - } - if (groupByField.toLowerCase() == "Priority".toLowerCase()) { - return new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(resultDetails); - } - throw new DataProviderError_1.DataProviderError(`TestResultsDetails by group ${groupByField} not supported`); - } -} -exports.TestResultDetailsParserFactory = TestResultDetailsParserFactory; -//# sourceMappingURL=TestResultDetailsParserFactory.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js.map deleted file mode 100644 index 391d7fbc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultDetailsParserFactory.js","sourceRoot":"","sources":["TestResultDetailsParserFactory.ts"],"names":[],"mappings":";;;AAEA,mFAAgF;AAChF,6FAA0F;AAC1F,0EAAuE;AAEvE,MAAa,8BAA8B;IAClC,MAAM,CAAC,SAAS,CAAC,aAAiC;QACvD,IAAI,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAC9C,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YACzD,OAAO,IAAI,6DAA6B,CAAC,aAAa,CAAC,CAAC;SACzD;QAED,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE;YAC1D,OAAO,IAAI,uEAAkC,CAAC,aAAa,CAAC,CAAC;SAC9D;QAED,MAAM,IAAI,qCAAiB,CAAC,+BAA+B,YAAY,gBAAgB,CAAC,CAAC;IAC3F,CAAC;CACF;AAbD,wEAaC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js deleted file mode 100644 index 24e313c8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js +++ /dev/null @@ -1,64 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultDetailsParserForPriority = void 0; -const AbstractTestResultsDetailsParser_1 = require("./AbstractTestResultsDetailsParser"); -const TestSummaryItemModel_1 = require("../../model/testresults/TestSummaryItemModel"); -const InvalidTestResultDataError_1 = require("../../exceptions/InvalidTestResultDataError"); -class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser_1.AbstractTestResultsDetailsParser { - constructor(testResultDetails) { - super(testResultDetails); - if (testResultDetails.groupByField.toUpperCase() != "Priority".toUpperCase()) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); - } - } - getSummaryItems() { - const resultsForGroup = this.testResultDetails.resultsForGroup; - if (resultsForGroup != null && resultsForGroup.length > 0) { - return resultsForGroup.map(group => { - var priority = this.getPriority(group.groupByValue); - var summaryItem = new TestSummaryItemModel_1.TestSummaryItemModel(priority.toString(), priority.toString()); - this.parseBaseData(group, summaryItem); - return summaryItem; - }); - } - return []; - } - getGroupByValue(group) { - return this.getPriority(group.groupByValue).toString(); - } - getTestResultsForRun(runId) { - const testResultsByPriority = this.getTestCountByPriorityInTestRun(); - return testResultsByPriority.has(runId) ? testResultsByPriority.get(runId) : new Map(); - } - getPriority(groupByValue) { - let priority = Number.parseInt(groupByValue); - if (priority == null || Number.isNaN(priority)) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected priority value to be integer in ${groupByValue}`); - } - return priority; - } - getTestCountByPriorityInTestRun() { - var testResultsByPriority = new Map(); - this.testResultDetails.resultsForGroup.forEach(testResultsByGroup => { - var priority = this.getPriority(testResultsByGroup.groupByValue); - testResultsByGroup.results.forEach(result => { - if (result.testRun == null) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Test run field is null in Test result object with test id - ${result.id}`); - } - const testRunId = Number.parseInt(result.testRun.id); - if (testRunId == null || Number.isNaN(testRunId)) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Unable to parse test run id to integer in ${result.testRun.id}`); - } - if (!testResultsByPriority.has(testRunId)) { - testResultsByPriority.set(testRunId, new Map()); - } - const resultsByPriorityForRun = testResultsByPriority.get(testRunId); - var testCountByPriority = resultsByPriorityForRun.has(priority) ? resultsByPriorityForRun.get(priority) : 0; - resultsByPriorityForRun.set(priority, testCountByPriority + 1); - }); - }); - return testResultsByPriority; - } -} -exports.TestResultDetailsParserForPriority = TestResultDetailsParserForPriority; -//# sourceMappingURL=TestResultDetailsParserForPriority.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js.map deleted file mode 100644 index 3fa90f2c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultDetailsParserForPriority.js","sourceRoot":"","sources":["TestResultDetailsParserForPriority.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js deleted file mode 100644 index 100ed24f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestRunInfo = exports.TestResultDetailsParserForRun = void 0; -const AbstractTestResultsDetailsParser_1 = require("./AbstractTestResultsDetailsParser"); -const TestSummaryItemModel_1 = require("../../model/testresults/TestSummaryItemModel"); -const InvalidTestResultDataError_1 = require("../../exceptions/InvalidTestResultDataError"); -class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser_1.AbstractTestResultsDetailsParser { - constructor(testResultDetails) { - super(testResultDetails); - if (testResultDetails.groupByField.toUpperCase() != "TestRun".toUpperCase()) { - throw new InvalidTestResultDataError_1.InvalidTestResultDataError(`Expected test result group type to be Priority. But found ${testResultDetails.groupByField}`); - } - } - getSummaryItems() { - return this.testResultDetails.resultsForGroup.map(r => this.getTestRunSummaryInfo(r)); - } - getGroupByValue(group) { - const runinfo = this.readGroupByValue(group); - return runinfo.name; - } - getTestRunSummaryInfo(resultsForGroup) { - console.log(`Getting Test summary data for test run - ${resultsForGroup.groupByValue.name}`); - const runinfo = this.readGroupByValue(resultsForGroup); - var summaryItem = new TestSummaryItemModel_1.TestSummaryItemModel(runinfo.name == null ? runinfo.id.toString() : runinfo.name, runinfo.id.toString()); - this.parseBaseData(resultsForGroup, summaryItem); - return summaryItem; - } - readGroupByValue(resultsForGroup) { - const runinfo = new TestRunInfo(); - runinfo.id = resultsForGroup.groupByValue.id; - runinfo.name = resultsForGroup.groupByValue.name; - return runinfo; - } -} -exports.TestResultDetailsParserForRun = TestResultDetailsParserForRun; -class TestRunInfo { -} -exports.TestRunInfo = TestRunInfo; -//# sourceMappingURL=TestResultDetailsParserForRun.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js.map deleted file mode 100644 index 3e9c3db0..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultDetailsParserForRun.js","sourceRoot":"","sources":["TestResultDetailsParserForRun.ts"],"names":[],"mappings":";;;AAAA,yFAAsF;AACtF,uFAAoF;AAEpF,4FAAyF;AAEzF,MAAa,6BAA8B,SAAQ,mEAAgC;IAEjF,YAAY,iBAAqC;QAC/C,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzB,IAAI,iBAAiB,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YAC3E,MAAM,IAAI,uDAA0B,CAAC,6DAA6D,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC;SACrI;IACH,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IAEM,eAAe,CAAC,KAAiC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAEO,qBAAqB,CAAC,eAA2C;QACvE,OAAO,CAAC,GAAG,CAAC,4CAA4C,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAEvD,IAAI,WAAW,GAAG,IAAI,2CAAoB,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE/H,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAEjD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,gBAAgB,CAAC,eAA2C;QAClE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAnCD,sEAmCC;AAED,MAAa,WAAW;CAIvB;AAJD,kCAIC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js deleted file mode 100644 index a5a4f067..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js +++ /dev/null @@ -1,101 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildDataProvider = void 0; -const PipelineNotFoundError_1 = require("../../exceptions/PipelineNotFoundError"); -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const PhaseModel_1 = require("../../model/PhaseModel"); -const JobModel_1 = require("../../model/JobModel"); -const TaskModel_1 = require("../../model/TaskModel"); -const IssueModel_1 = require("../../model/IssueModel"); -const ReportFactory_1 = require("../../model/ReportFactory"); -const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); -const util_1 = require("util"); -const RetryablePromise_1 = require("../restclients/RetryablePromise"); -const DataProviderError_1 = require("../../exceptions/DataProviderError"); -class BuildDataProvider { - constructor(pipelineRestClient) { - this.pipelineRestClient = pipelineRestClient; - } - getReportDataAsync(pipelineConfig, reportDataConfiguration) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - const build = yield this.getBuildAsync(pipelineConfig); - if (build == null) { - throw new PipelineNotFoundError_1.PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); - } - const timeline = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineTimelineAsync(build.id); }), "GetBuildTimeline"); - const changes = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineChangesAsync(build.id); }), "GetPipelineChanges"); - const phases = this.getPhases(timeline); - const lastCompletedBuild = yield this.pipelineRestClient.getLastPipelineAsync(build.definition.id, null, build.sourceBranch); - const lastCompletedTimeline = lastCompletedBuild != null ? yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineTimelineAsync(lastCompletedBuild.id); }), "GetLastCompletedTimeline") : null; - console.log("Fetched release data"); - report.setBuildData(build, timeline, lastCompletedBuild, lastCompletedTimeline, phases, changes); - return report; - }); - } - getBuildAsync(pipelineConfig) { - return __awaiter(this, void 0, void 0, function* () { - var build = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineAsync(); }), "GetPipeline"); - if (util_1.isNullOrUndefined(build)) { - throw new DataProviderError_1.DataProviderError(`Unable to find build with id: ${pipelineConfig.$pipelineId}`); - } - return build; - }); - } - getPhases(timeline) { - const records = timeline.records.sort((a, b) => this.getOrder(a) - this.getOrder(b)); - const phases = records.filter(r => r.type == "Phase"); - if (phases.length > 0) { - const jobs = records.filter(r => r.type == "Job"); - if (jobs.length > 0) { - const tasks = records.filter(r => r.type == "Task"); - const phaseModels = phases.map(phase => { - const jobModels = jobs - .filter(j => j.parentId == phase.id) - .map(j => { - const tasksForThisJob = tasks.filter(t => t.parentId == j.id); - const taskModels = tasksForThisJob.map(task => { - const issues = util_1.isNullOrUndefined(task.issues) || task.issues.length < 1 ? [] : - task.issues.map(i => new IssueModel_1.IssueModel(i.type == BuildInterfaces_1.IssueType.Error ? "Error" : "Warning", i.message)); - return new TaskModel_1.TaskModel(task.name, this.getTaskState(task.result), issues, task.workerName, task.finishTime, task.startTime); - }); - return new JobModel_1.JobModel(j.name, this.getTaskState(j.result), [], taskModels); - }); - return new PhaseModel_1.PhaseModel(phase.name, jobModels, util_1.isNullOrUndefined(phase.result) ? "Unknown" : phase.result.toString(), this.getOrder(phase)); - }); - return phaseModels; - } - } - return []; - } - getTaskState(result) { - switch (result) { - case BuildInterfaces_1.TaskResult.Succeeded: - return ReleaseInterfaces_1.TaskStatus.Succeeded; - case BuildInterfaces_1.TaskResult.SucceededWithIssues: - return ReleaseInterfaces_1.TaskStatus.PartiallySucceeded; - case BuildInterfaces_1.TaskResult.Failed: - return ReleaseInterfaces_1.TaskStatus.Failed; - case BuildInterfaces_1.TaskResult.Canceled: - return ReleaseInterfaces_1.TaskStatus.Canceled; - case BuildInterfaces_1.TaskResult.Skipped: - return ReleaseInterfaces_1.TaskStatus.Skipped; - default: - return ReleaseInterfaces_1.TaskStatus.Unknown; - } - } - getOrder(timelineRecord) { - return util_1.isNullOrUndefined(timelineRecord.order) ? 0 : timelineRecord.order; - } -} -exports.BuildDataProvider = BuildDataProvider; -//# sourceMappingURL=BuildDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js.map deleted file mode 100644 index 8f9239be..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildDataProvider.js","sourceRoot":"","sources":["BuildDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js deleted file mode 100644 index e6f2cf14..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js +++ /dev/null @@ -1,116 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseDataProvider = void 0; -const PipelineNotFoundError_1 = require("../../exceptions/PipelineNotFoundError"); -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const DataProviderError_1 = require("../../exceptions/DataProviderError"); -const PhaseModel_1 = require("../../model/PhaseModel"); -const EnvironmentExtensions_1 = require("../../utils/EnvironmentExtensions"); -const JobModel_1 = require("../../model/JobModel"); -const TaskModel_1 = require("../../model/TaskModel"); -const IssueModel_1 = require("../../model/IssueModel"); -const ReportFactory_1 = require("../../model/ReportFactory"); -const RetryablePromise_1 = require("../restclients/RetryablePromise"); -const util_1 = require("util"); -class ReleaseDataProvider { - constructor(pipelineRestClient) { - this.pipelineRestClient = pipelineRestClient; - } - getReportDataAsync(pipelineConfig, reportDataConfiguration) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - const release = yield this.getReleaseAsync(pipelineConfig); - if (release == null) { - throw new PipelineNotFoundError_1.PipelineNotFoundError(`ProjectId: ${pipelineConfig.$projectId}, ${pipelineConfig.$pipelineId}`); - } - const environment = this.getEnvironment(release, pipelineConfig); - const phases = this.getPhases(environment); - const lastCompletedRelease = yield this.getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment); - let changes = []; - // check if last completed one isn't latter one, then changes don't make sense - if (lastCompletedRelease != null && lastCompletedRelease.id < release.id) { - console.log(`Getting changes between releases ${release.id} & ${lastCompletedRelease.id}`); - try { - changes = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineChangesAsync(lastCompletedRelease.id); }), "GetPipelineChanges"); - } - catch (err) { - // Changes happened in current release w.r.t previous one isn't strictly required to send mail - ignoring any errors - console.warn(`Error while comparing current release - '${release.id}' with previous one - '${lastCompletedRelease.id}': ${err}`); - } - } - else { - console.log("Unable to find any last completed release"); - } - console.log("Fetched release data"); - report.setReleaseData(release, environment, lastCompletedRelease, phases, changes); - return report; - }); - } - getReleaseAsync(pipelineConfig) { - return __awaiter(this, void 0, void 0, function* () { - var release = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.pipelineRestClient.getPipelineAsync(); }), "GetPipeline"); - if (util_1.isNullOrUndefined(release)) { - throw new DataProviderError_1.DataProviderError(`Unable to find release with release id: ${pipelineConfig.$pipelineId}`); - } - return release; - }); - } - getEnvironment(release, pipelineConfig) { - let environment; - const environments = release.environments; - for (var i = 0; i < environments.length; i++) { - if (environments[i].id == pipelineConfig.$environmentId) { - environment = environments[i]; - break; - } - } - if (pipelineConfig.$usePreviousEnvironment && environments.indexOf(environment) > 0) { - environment = environments[environments.indexOf(environment) - 1]; - } - if (environment != null) { - return environment; - } - throw new DataProviderError_1.DataProviderError(`Unable to find environment with environment id - ${pipelineConfig.$environmentId} in release - ${release.id}`); - } - getPhases(environment) { - var releaseDeployPhases = EnvironmentExtensions_1.EnvironmentExtensions.getPhases(environment); - return releaseDeployPhases.map(r => new PhaseModel_1.PhaseModel(r.name, this.getJobModelsFromPhase(r.deploymentJobs), ReleaseInterfaces_1.DeployPhaseStatus[r.status], r.rank)); - } - getJobModelsFromPhase(deploymentJobs) { - const jobModels = deploymentJobs.map(job => { - const issues = job.job.issues.map(i => new IssueModel_1.IssueModel(i.issueType, i.message)); - const tasks = job.tasks.map(t => { - const issues = t.issues.map(i => new IssueModel_1.IssueModel(i.issueType, i.message)); - return new TaskModel_1.TaskModel(t.name, t.status, issues, t.agentName, t.finishTime, t.startTime); - }); - return new JobModel_1.JobModel(job.job.name, job.job.status, issues, tasks); - }); - return jobModels; - } - getReleaseByLastCompletedEnvironmentAsync(pipelineConfig, release, environment) { - return __awaiter(this, void 0, void 0, function* () { - let branchId = null; - if (release.artifacts != null && release.artifacts.length > 0) { - const primaryArtifact = release.artifacts.filter(a => a.isPrimary)[0]; - const defRef = primaryArtifact.definitionReference["branch"]; - branchId = defRef != null ? defRef.id : null; - } - console.log(`Fetching last release by completed environment id - ${pipelineConfig.$environmentId} and branch id ${branchId}`); - const lastRelease = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { - return this.pipelineRestClient.getLastPipelineAsync(release.releaseDefinition.id, environment.definitionEnvironmentId, branchId, null); - }), "GetLastCompletedPipeline"); //Bug in API - release.createdOn); - return lastRelease; - }); - } -} -exports.ReleaseDataProvider = ReleaseDataProvider; -//# sourceMappingURL=ReleaseDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js.map deleted file mode 100644 index 6ea3a56a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseDataProvider.js","sourceRoot":"","sources":["ReleaseDataProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,kFAA+E;AAC/E,0FAA6I;AAE7I,0EAAuE;AACvE,uDAAoD;AACpD,6EAA0E;AAC1E,mDAAgD;AAChD,qDAAkD;AAClD,uDAAoD;AAIpD,6DAA0D;AAC1D,sEAAmE;AACnE,+BAAyC;AAEzC,MAAa,mBAAmB;IAI9B,YAAY,kBAAuC;QACjD,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAEK,kBAAkB,CAAC,cAAqC,EAAE,uBAAgD;;YAC9G,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,cAAc,CAAkB,CAAC;YAC9E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAC3D,IAAI,OAAO,IAAI,IAAI,EAAE;gBACnB,MAAM,IAAI,6CAAqB,CAAC,cAAc,cAAc,CAAC,UAAU,KAAK,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;aAC3G;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,yCAAyC,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAExH,IAAI,OAAO,GAAkB,EAAE,CAAC;YAChC,8EAA8E;YAC9E,IAAI,oBAAoB,IAAI,IAAI,IAAI,oBAAoB,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE;gBACxE,OAAO,CAAC,GAAG,CAAC,oCAAoC,OAAO,CAAC,EAAE,MAAM,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3F,IAAI;oBACF,OAAO,GAAG,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA,GAAA,EAAE,oBAAoB,CAAC,CAAC;iBACzJ;gBAAC,OAAM,GAAG,EAAE;oBACX,oHAAoH;oBACpH,OAAO,CAAC,IAAI,CAAC,4CAA4C,OAAO,CAAC,EAAE,0BAA0B,oBAAoB,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;iBAClI;aACF;iBACI;gBACH,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;aAC1D;YAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAEnF,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEa,eAAe,CAAC,cAAqC;;YACjE,IAAI,OAAO,GAAG,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE,gDAAC,OAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAA,GAAA,EAAE,aAAa,CAAC,CAAC;YACvH,IAAG,wBAAiB,CAAC,OAAO,CAAC,EAAE;gBAC7B,MAAM,IAAI,qCAAiB,CAAC,2CAA2C,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;aACtG;YACD,OAAO,OAAkB,CAAC;QAC5B,CAAC;KAAA;IAEO,cAAc,CAAC,OAAgB,EAAE,cAAqC;QAC5E,IAAI,WAA+B,CAAC;QACpC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpD,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,cAAc,CAAC,cAAc,EAAE;gBACvD,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM;aACP;SACF;QAED,IAAI,cAAc,CAAC,uBAAuB,IAAI,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;YACnF,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;SACnE;QAED,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,OAAO,WAAW,CAAC;SACpB;QAED,MAAM,IAAI,qCAAiB,CAAC,oDAAoD,cAAc,CAAC,cAAc,iBAAiB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9I,CAAC;IAEO,SAAS,CAAC,WAA+B;QAC/C,IAAI,mBAAmB,GAAG,6CAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACvE,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,uBAAU,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,qCAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjJ,CAAC;IAEO,qBAAqB,CAAC,cAA+B;QAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACzC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,uBAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,uBAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzE,OAAO,IAAI,qBAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YACzF,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,mBAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAEa,yCAAyC,CAAC,cAAqC,EAAE,OAAgB,EAAE,WAA+B;;YAC9I,IAAI,QAAQ,GAAW,IAAI,CAAC;YAE5B,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7D,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtE,MAAM,MAAM,GAAG,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC7D,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAC9C;YAED,OAAO,CAAC,GAAG,CAAC,uDAAuD,cAAc,CAAC,cAAc,kBAAkB,QAAQ,EAAE,CAAC,CAAC;YAC9H,MAAM,WAAW,GAAG,MAAM,mCAAgB,CAAC,UAAU,CAAC,GAAS,EAAE;gBAAC,OAAA,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EACzI,WAAW,CAAC,uBAAuB,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;cAAA,EAAE,0BAA0B,CAAC,CAAC,CAAC,kCAAkC;YAEvH,OAAO,WAAsB,CAAC;QAChC,CAAC;KAAA;CACF;AArGD,kDAqGC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js deleted file mode 100644 index 6b4925cb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AbstractClient = void 0; -const azure_devops_node_api_1 = require("azure-devops-node-api"); -class AbstractClient { - constructor(pipelineConfig) { - this.connection = this.createConnection(pipelineConfig.$teamUri, pipelineConfig.$accessKey); - this.pipelineConfig = pipelineConfig; - } - /** - * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api - * @param uri Default URL - * @param accessToken token to get credentials with access to Api calls - */ - createConnection(uri, accessToken) { - const creds = azure_devops_node_api_1.getPersonalAccessTokenHandler(accessToken); - return new azure_devops_node_api_1.WebApi(uri, creds); - } -} -exports.AbstractClient = AbstractClient; -//# sourceMappingURL=AbstractClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js.map deleted file mode 100644 index 4680d5a2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AbstractClient.js","sourceRoot":"","sources":["AbstractClient.ts"],"names":[],"mappings":";;;AACA,iEAG+B;AAG/B,MAAsB,cAAc;IAKlC,YAAY,cAAqC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5F,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CAAC,GAAW,EAAE,WAAmB;QACvD,MAAM,KAAK,GAAG,qDAA6B,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,IAAI,8BAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;CACF;AAnBD,wCAmBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js deleted file mode 100644 index 710c8de9..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js +++ /dev/null @@ -1,104 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsQueryImpl = exports.AbstractTestResultsClient = void 0; -const AbstractClient_1 = require("./AbstractClient"); -const RetryablePromise_1 = require("./RetryablePromise"); -class AbstractTestResultsClient extends AbstractClient_1.AbstractClient { - constructor(pipelineConfig) { - super(pipelineConfig); - this.MaxItemsSupported = 100; - this.testApiPromise = this.connection.getTestApi(); - } - queryTestResultBugs(automatedTestName, resultId) { - return __awaiter(this, void 0, void 0, function* () { - const testApi = yield this.testApiPromise; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { - return testApi.queryTestResultWorkItems(this.pipelineConfig.$projectName, "Microsoft.BugCategory", automatedTestName, resultId); - }), "QueryTestResultBugs"); - }); - } - getTestResultById(testRunId, resultId) { - return __awaiter(this, void 0, void 0, function* () { - const testApi = yield this.testApiPromise; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return testApi.getTestResultById(this.pipelineConfig.$projectName, testRunId, resultId); }), "GetTestResultById"); - }); - } - queryTestResultsReportAsync(parameterConfig = null) { - return __awaiter(this, void 0, void 0, function* () { - const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.queryTestResultsReportForPipelineAsync(config); }), "QueryTestResultsReport"); - }); - } - getTestResultOwnersAsync(resultsToFetch) { - return __awaiter(this, void 0, void 0, function* () { - var query = new TestResultsQueryImpl(); - query.fields = ["Owner"]; - const results = []; - const testApi = yield this.testApiPromise; - for (let i = 0, j = resultsToFetch.length; i < j; i += this.MaxItemsSupported) { - const tempArray = resultsToFetch.slice(i, i + this.MaxItemsSupported); - query.results = tempArray; - let queryResult = yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return testApi.getTestResultsByQuery(query, this.pipelineConfig.$projectName); }), "GetTestResultOwners"); - results.push(...queryResult.results); - } - const ownerMap = new Map(); - results.forEach(r => { - if (this.isValid(r.owner)) { - const key = this.getUniqueName(r.owner); - if (!ownerMap.has(key)) { - ownerMap.set(key, r.owner); - } - } - }); - const identities = []; - ownerMap.forEach((value, key) => identities.push(value)); - return identities; - }); - } - getTestResultsDetailsAsync(groupBy, outcomeFilters, parameterConfig = null) { - return __awaiter(this, void 0, void 0, function* () { - const filter = this.getOutcomeFilter(outcomeFilters); - const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.getTestResultsDetailsForPipelineAsync(config, groupBy, filter); }), "GetTestResultsDetails"); - }); - } - getTestResultSummaryAsync(includeFailures, parameterConfig = null) { - return __awaiter(this, void 0, void 0, function* () { - const config = parameterConfig != null ? parameterConfig : this.pipelineConfig; - return yield RetryablePromise_1.RetryablePromise.RetryAsync(() => __awaiter(this, void 0, void 0, function* () { return this.queryTestResultsReportForPipelineAsync(config, includeFailures); }), "GetTestResultSummary"); - }); - } - getTestResultsByQueryAsync(query) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).getTestResultsByQuery(query, this.pipelineConfig.$projectId); - }); - } - getOutcomeFilter(outcomes) { - let filter = null; - if (outcomes != null && outcomes.length > 0) { - const outComeString = Array.from(new Set(outcomes.map(o => Number(o)))).join(","); - filter = `Outcome eq ${outComeString}`; - } - return filter; - } - getUniqueName(identity) { - return identity.uniqueName == null ? identity.displayName : identity.uniqueName; - } - isValid(identity) { - return identity != null && (identity.displayName != null || identity.uniqueName != null); - } -} -exports.AbstractTestResultsClient = AbstractTestResultsClient; -class TestResultsQueryImpl { -} -exports.TestResultsQueryImpl = TestResultsQueryImpl; -//# sourceMappingURL=AbstractTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js.map deleted file mode 100644 index 5e8d40ff..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AbstractTestResultsClient.js","sourceRoot":"","sources":["AbstractTestResultsClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js deleted file mode 100644 index 57849fc2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js +++ /dev/null @@ -1,53 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildRestClient = void 0; -const BuildInterfaces_1 = require("azure-devops-node-api/interfaces/BuildInterfaces"); -const ChangeModel_1 = require("../../model/ChangeModel"); -const AbstractClient_1 = require("./AbstractClient"); -class BuildRestClient extends AbstractClient_1.AbstractClient { - constructor(pipelineConfig) { - super(pipelineConfig); - this.buildApi = this.connection.getBuildApi(); - } - getPipelineAsync() { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.buildApi).getBuild(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); - }); - } - getLastPipelineAsync(pipelineDefId, envDefId, sourceBranchFilter, maxCreatedDate) { - return __awaiter(this, void 0, void 0, function* () { - const builds = yield (yield this.buildApi).getBuilds(this.pipelineConfig.$projectId, [pipelineDefId], null, null, null, maxCreatedDate, null, null, null, BuildInterfaces_1.BuildResult.Succeeded | BuildInterfaces_1.BuildResult.PartiallySucceeded | BuildInterfaces_1.BuildResult.Failed | BuildInterfaces_1.BuildResult.Canceled, null, null, 1, null, null, null, BuildInterfaces_1.BuildQueryOrder.FinishTimeDescending, sourceBranchFilter); - if (builds != null && builds.length > 0) { - return builds[0]; - } - console.log(`Unable to find any build for definition id - ${pipelineDefId}`); - return null; - }); - } - getPipelineChangesAsync(prevPipelineId) { - return __awaiter(this, void 0, void 0, function* () { - const changes = yield (yield this.buildApi).getBuildChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); - if (changes == null || changes.length < 1) { - console.log(`No changes found for pipelineId - ${this.pipelineConfig.$pipelineId}`); - return []; - } - return changes.map(item => new ChangeModel_1.ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); - }); - } - getPipelineTimelineAsync(pipelineId) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.buildApi).getBuildTimeline(this.pipelineConfig.$projectId, pipelineId); - }); - } -} -exports.BuildRestClient = BuildRestClient; -//# sourceMappingURL=BuildClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js.map deleted file mode 100644 index ce1c3b65..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildClient.js","sourceRoot":"","sources":["BuildClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,sFAAiH;AACjH,yDAAsD;AACtD,qDAAkD;AAGlD,MAAa,eAAgB,SAAQ,+BAAc;IAIjD,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAEY,gBAAgB;;YAC3B,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC/G,CAAC;KAAA;IAEY,oBAAoB,CAAC,aAAqB,EAAE,QAAgB,EAAE,kBAA0B,EAAE,cAAqB;;YAC1H,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAClD,IAAI,CAAC,cAAc,CAAC,UAAU,EAC9B,CAAC,aAAa,CAAC,EACf,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,6BAAW,CAAC,SAAS,GAAG,6BAAW,CAAC,kBAAkB,GAAG,6BAAW,CAAC,MAAM,GAAG,6BAAW,CAAC,QAAQ,EAClG,IAAI,EACJ,IAAI,EACJ,CAAC,EACD,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,iCAAe,CAAC,oBAAoB,EACpC,kBAAkB,CAAC,CAAC;YACtB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;aAClB;YACD,OAAO,CAAC,GAAG,CAAC,gDAAgD,aAAa,EAAE,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEY,uBAAuB,CAAC,cAAsB;;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC7H,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpF,OAAO,EAAE,CAAC;aACX;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,yBAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjH,CAAC;KAAA;IAEY,wBAAwB,CAAC,UAAkB;;YACtD,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClG,CAAC;KAAA;CACF;AApDD,0CAoDC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js deleted file mode 100644 index 8bbc626c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BuildTestResultsClient = void 0; -const AbstractTestResultsClient_1 = require("./AbstractTestResultsClient"); -class BuildTestResultsClient extends AbstractTestResultsClient_1.AbstractTestResultsClient { - constructor(pipelineConfig) { - super(pipelineConfig); - } - queryTestResultsReportForPipelineAsync(config, includeFailures) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).queryTestResultsReportForBuild(config.$projectName, config.$pipelineId, null, includeFailures); - }); - } - getTestResultsDetailsForPipelineAsync(config, groupBy, filter) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).getTestResultDetailsForBuild(config.$projectName, config.$pipelineId, null, groupBy, filter); - }); - } -} -exports.BuildTestResultsClient = BuildTestResultsClient; -//# sourceMappingURL=BuildTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js.map deleted file mode 100644 index 9d63a129..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BuildTestResultsClient.js","sourceRoot":"","sources":["BuildTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2EAAwE;AAExE,MAAa,sBAAuB,SAAQ,qDAAyB;IAEnE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAEY,sCAAsC,CAAC,MAA6B,EAAE,eAAyB;;YAC1G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,8BAA8B,CACrE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,IAAI,EACJ,eAAe,CAAC,CAAC;QACrB,CAAC;KAAA;IAEY,qCAAqC,CAAC,MAA6B,EAAE,OAAgB,EAAE,MAAe;;YACjH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,4BAA4B,CACnE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,IAAI,EACJ,OAAO,EACP,MAAM,CAAC,CAAC;QACZ,CAAC;KAAA;CACF;AAtBD,wDAsBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js deleted file mode 100644 index 84a6db77..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IPipelineRestClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js.map deleted file mode 100644 index cd6b91b4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IPipelineRestClient.js","sourceRoot":"","sources":["IPipelineRestClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js deleted file mode 100644 index b07895ab..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=ITestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js.map deleted file mode 100644 index 79df6b69..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ITestResultsClient.js","sourceRoot":"","sources":["ITestResultsClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js deleted file mode 100644 index 058bea92..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=IWorkItemClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js.map deleted file mode 100644 index 37f3ef71..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IWorkItemClient.js","sourceRoot":"","sources":["IWorkItemClient.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js deleted file mode 100644 index 89c786bb..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js +++ /dev/null @@ -1,68 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseRestClient = void 0; -const ReleaseInterfaces_1 = require("azure-devops-node-api/interfaces/ReleaseInterfaces"); -const AbstractClient_1 = require("./AbstractClient"); -const ChangeModel_1 = require("../../model/ChangeModel"); -const util_1 = require("util"); -class ReleaseRestClient extends AbstractClient_1.AbstractClient { - constructor(pipelineConfig) { - super(pipelineConfig); - } - getPipelineAsync() { - return __awaiter(this, void 0, void 0, function* () { - return (yield this.connection.getReleaseApi()).getRelease(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId); - }); - } - getLastPipelineAsync(pipelineDefId, envDefId, sourceBranchFilter, maxCreatedDate) { - return __awaiter(this, void 0, void 0, function* () { - const releaseApi = yield this.connection.getReleaseApi(); - let lastRelease = null; - const releaseStatusFilter = ReleaseInterfaces_1.ReleaseStatus.Active; - const envStatusFilter = ReleaseInterfaces_1.EnvironmentStatus.Succeeded | ReleaseInterfaces_1.EnvironmentStatus.PartiallySucceeded | ReleaseInterfaces_1.EnvironmentStatus.Rejected | ReleaseInterfaces_1.EnvironmentStatus.Canceled; - const releases = yield releaseApi.getReleases(this.pipelineConfig.$projectId, pipelineDefId, envDefId, null, null, releaseStatusFilter, envStatusFilter, null, maxCreatedDate, ReleaseInterfaces_1.ReleaseQueryOrder.Descending, null, null, ReleaseInterfaces_1.ReleaseExpands.Environments, null, null, null, sourceBranchFilter); - if (!util_1.isNullOrUndefined(releases) && releases.length > 0) { - // Ideally, first one should be last completed one. Unless someone's running the report after the release has completed for some reason. - console.log(`Considering one of [${releases.map(r => r.id).join(",")}] as previous completed release for ${this.pipelineConfig.$pipelineId}`); - for (let i = 0; i < releases.length; i++) { - if (releases[i].id < this.pipelineConfig.$pipelineId) { - lastRelease = releases[i]; - break; - } - } - } - if (util_1.isNullOrUndefined(lastRelease)) { - console.log(`Unable to fetch last completed release for release definition:${pipelineDefId} and environmentid: ${envDefId}`); - } - else if (lastRelease.id < this.pipelineConfig.$pipelineId) { - return yield releaseApi.getRelease(this.pipelineConfig.$projectId, lastRelease.id); - } - return lastRelease; - }); - } - getPipelineChangesAsync(prevPipelineId) { - return __awaiter(this, void 0, void 0, function* () { - console.log(`Fetching changes between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); - const changes = yield (yield this.connection.getReleaseApi()).getReleaseChanges(this.pipelineConfig.$projectId, this.pipelineConfig.$pipelineId, prevPipelineId); - if (changes == null || changes.length < 1) { - console.log(`No changes found between releases - ${prevPipelineId} & ${this.pipelineConfig.$pipelineId}`); - return []; - } - return changes.map(item => new ChangeModel_1.ChangeModel(item.id, item.author, item.location, item.timestamp, item.message)); - }); - } - getPipelineTimelineAsync(pipelineId) { - throw new Error("Method not supported."); - } -} -exports.ReleaseRestClient = ReleaseRestClient; -//# sourceMappingURL=ReleaseClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js.map deleted file mode 100644 index 1c5d68f8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseClient.js","sourceRoot":"","sources":["ReleaseClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js deleted file mode 100644 index 0550db87..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ReleaseTestResultsClient = void 0; -const AbstractTestResultsClient_1 = require("./AbstractTestResultsClient"); -class ReleaseTestResultsClient extends AbstractTestResultsClient_1.AbstractTestResultsClient { - constructor(pipelineConfig) { - super(pipelineConfig); - } - queryTestResultsReportForPipelineAsync(config, includeFailures) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).queryTestResultsReportForRelease(config.$projectName, config.$pipelineId, config.$environmentId, null, includeFailures); - }); - } - getTestResultsDetailsForPipelineAsync(config, groupBy, filter) { - return __awaiter(this, void 0, void 0, function* () { - return yield (yield this.testApiPromise).getTestResultDetailsForRelease(config.$projectName, config.$pipelineId, config.$environmentId, null, groupBy, filter); - }); - } -} -exports.ReleaseTestResultsClient = ReleaseTestResultsClient; -//# sourceMappingURL=ReleaseTestResultsClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js.map deleted file mode 100644 index 2ea0d33f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReleaseTestResultsClient.js","sourceRoot":"","sources":["ReleaseTestResultsClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2EAAwE;AAExE,MAAa,wBAAyB,SAAQ,qDAAyB;IAErE,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAEY,sCAAsC,CAAC,MAA6B,EAAE,eAAyB;;YAC1G,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,gCAAgC,CACvE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,eAAe,CAAC,CAAC;QACrB,CAAC;KAAA;IAEY,qCAAqC,CAAC,MAA6B,EAAE,OAAgB,EAAE,MAAe;;YACjH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,8BAA8B,CACrE,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,IAAI,EACJ,OAAO,EACP,MAAM,CAAC,CAAC;QACZ,CAAC;KAAA;CACF;AAxBD,4DAwBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js deleted file mode 100644 index 3f13ad1e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RetryablePromise = void 0; -const TelemetryLogger_1 = require("../../telemetry/TelemetryLogger"); -const now = require('performance-now'); -class RetryablePromise { - static RetryAsync(executor, executorName, times = this.defaultRetryCount) { - return __awaiter(this, void 0, void 0, function* () { - const perfStart = now(); - let attemptNumber = 1; - let lastError; - try { - do { - try { - let returnVal = yield executor(); - if (attemptNumber > 1) { - console.log(`Completed on Retry attempt: ${attemptNumber}`); - } - return returnVal; - } - catch (err) { - lastError = err; - console.log(`Retry <${executorName}>: ${attemptNumber} : ${err}`); - } - attemptNumber++; - } while (attemptNumber <= times); - console.log(`All Retries exhausted. Throwing error: ${lastError}`); - throw lastError; - } - finally { - if (attemptNumber > 1) { - // Log time taken after all retries - TelemetryLogger_1.TelemetryLogger.LogModulePerf(executorName, now() - perfStart); - } - } - }); - } -} -exports.RetryablePromise = RetryablePromise; -RetryablePromise.defaultRetryCount = 3; -//# sourceMappingURL=RetryablePromise.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js.map deleted file mode 100644 index fcc42ea8..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"RetryablePromise.js","sourceRoot":"","sources":["RetryablePromise.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qEAAkE;AAClE,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAa,gBAAgB;IAIlB,MAAM,CAAO,UAAU,CAAI,QAA0B,EAAE,YAAoB,EAAE,QAAgB,IAAI,CAAC,iBAAiB;;YACtH,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACxB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,SAAgB,CAAC;YACrB,IAAI;gBACA,GAAG;oBACC,IAAI;wBACA,IAAI,SAAS,GAAG,MAAM,QAAQ,EAAE,CAAC;wBACjC,IAAI,aAAa,GAAG,CAAC,EAAE;4BACnB,OAAO,CAAC,GAAG,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;yBAC/D;wBACD,OAAO,SAAS,CAAC;qBACpB;oBACD,OAAO,GAAG,EAAE;wBACR,SAAS,GAAG,GAAG,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,UAAU,YAAY,MAAM,aAAa,MAAM,GAAG,EAAE,CAAC,CAAC;qBACrE;oBACD,aAAa,EAAE,CAAC;iBACnB,QAAQ,aAAa,IAAI,KAAK,EAAE;gBAEjC,OAAO,CAAC,GAAG,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;gBACnE,MAAM,SAAS,CAAC;aACnB;oBACO;gBACJ,IAAI,aAAa,GAAG,CAAC,EAAE;oBACnB,mCAAmC;oBACnC,iCAAe,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;iBAClE;aACJ;QACL,CAAC;KAAA;;AAjCL,4CAkCC;AAhCkB,kCAAiB,GAAW,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js deleted file mode 100644 index bcff8bf2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.WorkItemClient = void 0; -const AbstractClient_1 = require("./AbstractClient"); -class WorkItemClient extends AbstractClient_1.AbstractClient { - constructor(pipelineConfig) { - super(pipelineConfig); - this.workApiPromise = this.connection.getWorkItemTrackingApi(); - } - getWorkItemsAsync(workItemIds) { - return __awaiter(this, void 0, void 0, function* () { - const chunks = []; - var i, j, temparray, chunk = 100; - for (i = 0, j = workItemIds.length; i < j; i += chunk) { - temparray = workItemIds.slice(i, i + chunk); - chunks.push(temparray); - } - const workApi = yield this.workApiPromise; - const chunkResults = chunks.map(chunk => workApi.getWorkItems(chunk)); - const workItems = yield Promise.all(chunkResults); - const flatItemList = []; - workItems.forEach(wlist => flatItemList.push(...wlist)); - return flatItemList; - }); - } -} -exports.WorkItemClient = WorkItemClient; -//# sourceMappingURL=WorkItemClient.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js.map deleted file mode 100644 index 60fed502..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"WorkItemClient.js","sourceRoot":"","sources":["WorkItemClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkD;AAMlD,MAAa,cAAe,SAAQ,+BAAc;IAIhD,YAAY,cAAqC;QAC/C,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC;IACjE,CAAC;IAEY,iBAAiB,CAAC,WAAqB;;YAElD,MAAM,MAAM,GAAe,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,GAAG,GAAG,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE;gBACrD,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aACxB;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,YAAY,GAAe,EAAE,CAAC;YACpC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACxD,OAAO,YAAY,CAAC;QACtB,CAAC;KAAA;CACF;AA1BD,wCA0BC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js deleted file mode 100644 index 585e4aea..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TcmHelper = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -class TcmHelper { - static exceptOutcomes(outcomesToExclude) { - const otherOutComes = []; - for (let outcome in TestInterfaces_1.TestOutcome) { - var outcomeNum = Number(outcome); - if (!isNaN(outcomeNum) && !outcomesToExclude.includes(outcomeNum)) { - otherOutComes.push(outcomeNum); - } - } - return otherOutComes; - } - static parseOutcome(outcomeString) { - let result; - switch (outcomeString) { - case "Passed": - result = TestInterfaces_1.TestOutcome.Passed; - break; - case "Failed": - result = TestInterfaces_1.TestOutcome.Failed; - break; - case "Inconclusive": - result = TestInterfaces_1.TestOutcome.Inconclusive; - break; - case "NotExecuted": - result = TestInterfaces_1.TestOutcome.NotExecuted; - break; - default: - result = TestInterfaces_1.TestOutcome.None; - break; - } - return result; - } - static isTestFlaky(result) { - var outcomeConfidenceField = TcmHelper.getCustomField(result, "OutcomeConfidence"); - if (outcomeConfidenceField != null - && outcomeConfidenceField.value != null) { - const outcomeFieldValue = Number.parseFloat(outcomeConfidenceField.value); - if (!isNaN(outcomeFieldValue)) { - return outcomeFieldValue == TcmHelper.OutcomeConfidenceValue; - } - } - return false; - } - static getCustomField(result, fieldName) { - if (result.customFields == null) { - return null; - } - var cf = result.customFields.filter(c => c.fieldName.toLowerCase() == fieldName.toLowerCase()); - return cf.length > 0 ? cf[0] : null; - } - static Merge(source) { - const mergedResults = []; - source.forEach(item => { - if (item != null) { - mergedResults.push(...item); - } - }); - return mergedResults; - } -} -exports.TcmHelper = TcmHelper; -TcmHelper.OutcomeConfidenceValue = 0.0; -//# sourceMappingURL=TcmHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js.map deleted file mode 100644 index 032d716d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TcmHelper.js","sourceRoot":"","sources":["TcmHelper.ts"],"names":[],"mappings":";;;AAAA,oFAA+G;AAE/G,MAAa,SAAS;IAIb,MAAM,CAAC,cAAc,CAAC,iBAAgC;QAC3D,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,KAAK,IAAI,OAAO,IAAI,4BAAW,EAAE;YAC/B,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBACjE,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAChC;SACF;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,aAAqB;QAC9C,IAAI,MAAmB,CAAC;QACxB,QAAQ,aAAa,EAAE;YACrB,KAAK,QAAQ;gBAAE,MAAM,GAAG,4BAAW,CAAC,MAAM,CAAC;gBAAC,MAAM;YAClD,KAAK,QAAQ;gBAAE,MAAM,GAAG,4BAAW,CAAC,MAAM,CAAC;gBAAC,MAAM;YAClD,KAAK,cAAc;gBAAE,MAAM,GAAG,4BAAW,CAAC,YAAY,CAAC;gBAAC,MAAM;YAC9D,KAAK,aAAa;gBAAE,MAAM,GAAG,4BAAW,CAAC,WAAW,CAAC;gBAAC,MAAM;YAC5D;gBAAS,MAAM,GAAG,4BAAW,CAAC,IAAI,CAAC;gBAAC,MAAM;SAC3C;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,MAAsB;QAC9C,IAAI,sBAAsB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACnF,IAAI,sBAAsB,IAAI,IAAI;eAC7B,sBAAsB,CAAC,KAAK,IAAI,IAAI,EAAE;YACzC,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE;gBAC7B,OAAO,iBAAiB,IAAI,SAAS,CAAC,sBAAsB,CAAC;aAC9D;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,MAAsB,EAAE,SAAiB;QACpE,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;QAED,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAI,MAAuB;QAC5C,MAAM,aAAa,GAAQ,EAAE,CAAC;QAE9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACpB,IAAI,IAAI,IAAI,IAAI,EAAE;gBAChB,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;aAC7B;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;;AA5DH,8BA8DC;AA5DwB,gCAAsB,GAAW,GAAG,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js deleted file mode 100644 index 124e9e8b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestOwnersDataProvider = void 0; -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const ReportFactory_1 = require("../../model/ReportFactory"); -class TestOwnersDataProvider { - constructor(testResultsClient) { - this.testResultsClient = testResultsClient; - } - getReportDataAsync(pipelineConfig, reportDataConfig) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - const failedTestResultDetails = yield this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestInterfaces_1.TestOutcome.Failed]); - const resultsToFetch = []; - failedTestResultDetails.resultsForGroup.forEach(r => { - resultsToFetch.push(...r.results); - }); - const failedOwners = yield this.testResultsClient.getTestResultOwnersAsync(resultsToFetch); - report.$failedTestOwners.push(...failedOwners); - console.log("Fetched test owners data"); - return report; - }); - } -} -exports.TestOwnersDataProvider = TestOwnersDataProvider; -//# sourceMappingURL=TestOwnersDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js.map deleted file mode 100644 index 0cc5a285..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestOwnersDataProvider.js","sourceRoot":"","sources":["TestOwnersDataProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAKA,oFAA8F;AAC9F,6DAA0D;AAE1D,MAAa,sBAAsB;IAIjC,YAAY,iBAAqC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAEY,kBAAkB,CAAC,cAAqC,EAAE,gBAAyC;;YAC9G,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAC7D,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,SAAS,EAAE,CAAC,4BAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAEzH,MAAM,cAAc,GAAqB,EAAE,CAAC;YAC5C,uBAAuB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClD,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAC3F,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YAE/C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CACF;AAvBD,wDAuBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js deleted file mode 100644 index e02bdc0c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js +++ /dev/null @@ -1,177 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestResultsDataProvider = void 0; -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TcmHelper_1 = require("./TcmHelper"); -const TestResultGroupModel_1 = require("../../model/testresults/TestResultGroupModel"); -const TestResultModel_1 = require("../../model/testresults/TestResultModel"); -const TestResultDetailsParserFactory_1 = require("../helpers/TestResultDetailsParserFactory"); -const ReportFactory_1 = require("../../model/ReportFactory"); -const util_1 = require("util"); -class TestResultsDataProvider { - constructor(testResultsClient, workItemClient) { - this.testResultsClient = testResultsClient; - this.workItemClient = workItemClient; - } - getReportDataAsync(pipelineConfig, reportDataConfig) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - // This is to make sure the failing since information is computed before we fetch test results - yield this.testResultsClient.queryTestResultsReportAsync(); - yield this.setFilteredTestResults(pipelineConfig, reportDataConfig.$testResultsConfig, report); - return report; - }); - } - setFilteredTestResults(config, testResultsConfiguration, report) { - return __awaiter(this, void 0, void 0, function* () { - if (testResultsConfiguration.$includeFailedTests || testResultsConfiguration.$includeOtherTests || testResultsConfiguration.$includePassedTests) { - const groupBy = testResultsConfiguration.$groupTestResultsBy == GroupTestResultsBy_1.GroupTestResultsBy.Run ? "TestRun" : "Priority"; - const includedOutcomes = this.getIncludedOutcomes(testResultsConfiguration); - const resultIdsToFetch = yield this.testResultsClient.getTestResultsDetailsAsync(groupBy, includedOutcomes); - report.hasFilteredTests = this.filterTestResults(resultIdsToFetch, testResultsConfiguration.$maxItemsToShow); - const filteredTestResultGroups = yield this.getTestResultsWithWorkItems(resultIdsToFetch); - report.filteredResults = filteredTestResultGroups; - } - }); - } - getTestResultsWithWorkItems(resultIdsToFetch) { - return __awaiter(this, void 0, void 0, function* () { - const testResultDetailsParser = TestResultDetailsParserFactory_1.TestResultDetailsParserFactory.getParser(resultIdsToFetch); - const filteredTestResultGroups = resultIdsToFetch.resultsForGroup - .map(resultsForGroup => this.getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, testResultDetailsParser)); - const results = yield Promise.all(filteredTestResultGroups); - return results; - }); - } - getTestResultsForResultsGroupWithWorkItemsAsync(resultsForGroup, parser) { - return __awaiter(this, void 0, void 0, function* () { - var resultGroup = new TestResultGroupModel_1.TestResultsGroupModel(); - resultGroup.groupName = parser.getGroupByValue(resultsForGroup); - const bugsRefs = []; - const results = yield this.getTestResultsWithBugRefs(resultsForGroup, bugsRefs); - try { - const workItemDictionary = yield this.getWorkItemsAsync(bugsRefs); - results.forEach(result => { - if (result.associatedBugRefs != null && result.associatedBugRefs.length > 0) { - result.associatedBugRefs.forEach(workItemReference => { - result.associatedBugs.push(workItemDictionary.get(Number.parseInt(workItemReference.id))); - }); - } - }); - } - catch (ex) { - // ignore - console.warn(`Error while fetching workitems for bugrefs: ${bugsRefs.map(b => b.id)}`); - } - results.forEach(result => { - if (result.testResult.outcome != null) { - const testOutcome = TcmHelper_1.TcmHelper.parseOutcome(result.testResult.outcome); - if (!resultGroup.testResults.has(testOutcome)) { - resultGroup.testResults.set(testOutcome, []); - } - resultGroup.testResults.get(testOutcome).push(result); - } - else { - console.log(`Found test with outcome as null. Test result id ${result.testResult.id} in Test run ${result.testResult.testRun.id}`); - } - }); - return resultGroup; - }); - } - getWorkItemsAsync(bugsRefs) { - return __awaiter(this, void 0, void 0, function* () { - const workItemDictionary = new Map(); - if (bugsRefs != null && bugsRefs.length > 0) { - const workItems = yield this.workItemClient.getWorkItemsAsync(bugsRefs.map(bugRef => Number.parseInt(bugRef.id))); - workItems.forEach(workItem => { - if (workItem.id != null) { - workItemDictionary.set(workItem.id, workItem); - } - else { - console.log(`Unable to get id for a work item`); - } - }); - } - return workItemDictionary; - }); - } - getTestResultsWithBugRefs(resultsForGroup, bugReferencesInGroup) { - return __awaiter(this, void 0, void 0, function* () { - const resultModels = []; - for (var i = 0; i < resultsForGroup.results.length; i++) { - const resultIdObj = resultsForGroup.results[i]; - const testResult = yield this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); - // Remove flaky tests - if (util_1.isNullOrUndefined(testResult) || TcmHelper_1.TcmHelper.isTestFlaky(testResult)) { - continue; - } - const associatedBugRefs = yield this.testResultsClient.queryTestResultBugs(testResult.automatedTestName, testResult.id); - const resultModel = new TestResultModel_1.TestResultModel(); - resultModel.testResult = testResult; - resultModel.associatedBugRefs = associatedBugRefs; - resultModels.push(resultModel); - } - // let results = resultsForGroup.results - // .map(async resultIdObj => - // { - // const resultModel = new TestResultModel(); - // resultModel.testResult = await this.testResultsClient.getTestResultById(Number.parseInt(resultIdObj.testRun.id), resultIdObj.id); - // // Remove flaky tests - // if (TcmHelper.isTestFlaky(resultModel.testResult)) - // { - // return null; - // } - // resultModel.associatedBugRefs = await this.testResultsClient.queryTestResultBugs(resultModel.testResult.automatedTestName, resultModel.testResult.id); - // return resultModel; - // }); - //Remove all null values from array - //results = results.filter(r => r != null); - //results.forEach(async result => resultModels.push((await result))); - resultModels.forEach(result => bugReferencesInGroup.push(...result.associatedBugRefs)); - return resultModels; - }); - } - filterTestResults(resultIdsToFetch, maxItems) { - var hasFiltered = false; - var remainingItems = maxItems; - for (let i = 0; i < resultIdsToFetch.resultsForGroup.length; i++) { - const group = resultIdsToFetch.resultsForGroup[i]; - var currentItemsSize = group.results.length; - if (currentItemsSize > remainingItems) { - hasFiltered = true; - const results = []; - results.push(...group.results); - group.results = results.splice(0, remainingItems); - break; - } - remainingItems -= group.results.length; - } - resultIdsToFetch.resultsForGroup = resultIdsToFetch.resultsForGroup.filter(group => group.results.length > 0); - return hasFiltered; - } - getIncludedOutcomes(testResultsConfiguration) { - const includedOutcomes = []; - if (testResultsConfiguration.$includeFailedTests) { - includedOutcomes.push(TestInterfaces_1.TestOutcome.Failed); - } - if (testResultsConfiguration.$includeOtherTests) { - includedOutcomes.push(...TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed])); - } - if (testResultsConfiguration.$includePassedTests) { - includedOutcomes.push(TestInterfaces_1.TestOutcome.Passed); - } - return includedOutcomes; - } -} -exports.TestResultsDataProvider = TestResultsDataProvider; -//# sourceMappingURL=TestResultsDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js.map deleted file mode 100644 index 66c98667..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestResultsDataProvider.js","sourceRoot":"","sources":["TestResultsDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js deleted file mode 100644 index 985ef1d5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js +++ /dev/null @@ -1,120 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TestSummaryDataProvider = void 0; -const TestSummaryGroupModel_1 = require("../../model/testresults/TestSummaryGroupModel"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -const TestResultDetailsParserForRun_1 = require("../helpers/TestResultDetailsParserForRun"); -const TestOutcomeForPriority_1 = require("../../model/testresults/TestOutcomeForPriority"); -const TestResultDetailsParserForPriority_1 = require("../helpers/TestResultDetailsParserForPriority"); -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -const TestInterfaces_1 = require("azure-devops-node-api/interfaces/TestInterfaces"); -const TcmHelper_1 = require("./TcmHelper"); -const ReportFactory_1 = require("../../model/ReportFactory"); -class TestSummaryDataProvider { - constructor(testResultsClient) { - this.testResultsClient = testResultsClient; - } - getReportDataAsync(pipelineConfig, reportDataConfiguration) { - return __awaiter(this, void 0, void 0, function* () { - const report = ReportFactory_1.ReportFactory.createNewReport(pipelineConfig); - const testSummaryGroups = []; - const testSummaryGroupModelForRun = yield this.getTestRunSummaryWithPriorityAsync(pipelineConfig); - testSummaryGroups.push(testSummaryGroupModelForRun); - report.testResultSummary = yield this.testResultsClient.getTestResultSummaryAsync(true); - // Hack - above testresultsummary is incomplete - bug filed - //const passedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Passed]); - //const failedResults = await this.testResultsClient.getTestResultsDetailsAsync("TestRun", [TestOutcome.Failed]); - //this.setOutComeData(report, testSummaryGroups, TestOutcome.Passed, passedResults); - //this.setOutComeData(report, testSummaryGroups, TestOutcome.Failed, failedResults); - if (reportDataConfiguration.$groupTestSummaryBy.includes(GroupTestResultsBy_1.GroupTestResultsBy.Priority)) { - testSummaryGroups.push(yield this.getTestSummaryByPriorityAsync()); - } - report.$testSummaryGroups.push(...testSummaryGroups); - return report; - }); - } - getTestSummaryByPriorityAsync() { - return __awaiter(this, void 0, void 0, function* () { - const testSummaryItemsByRuns = yield this.testResultsClient.getTestResultsDetailsAsync("Priority"); - var testResultDetailsParserForPriority = new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(testSummaryItemsByRuns); - const testSummaryByPriority = new TestSummaryGroupModel_1.TestSummaryGroupModel(); - testSummaryByPriority.groupedBy = GroupTestResultsBy_1.GroupTestResultsBy.Priority; - const summaryItems = testResultDetailsParserForPriority.getSummaryItems(); - testSummaryByPriority.runs.push(...summaryItems); - return testSummaryByPriority; - }); - } - getTestRunSummaryWithPriorityAsync(config) { - return __awaiter(this, void 0, void 0, function* () { - const testSummaryByRun = new TestSummaryGroupModel_1.TestSummaryGroupModel(); - testSummaryByRun.groupedBy = GroupTestResultsBy_1.GroupTestResultsBy.Run; - if (config.$pipelineType == PipelineType_1.PipelineType.Release) { - const testResultsDetailsByTestRun = yield this.testResultsClient.getTestResultsDetailsAsync("TestRun"); - const summaryDataByPriority = yield this.getTestSummaryDataByPriorityAsync(); - const summaryByRun = new TestResultDetailsParserForRun_1.TestResultDetailsParserForRun(testResultsDetailsByTestRun); - const summaryItems = yield this.getSummaryByRun(summaryByRun, summaryDataByPriority); - testSummaryByRun.runs.push(...summaryItems); - } - return testSummaryByRun; - }); - } - getSummaryByRun(testResultByRun, testResultsForPriorityByOutcome) { - const summaryItemByRun = testResultByRun.getSummaryItems(); - summaryItemByRun.forEach(summaryItem => { - testResultsForPriorityByOutcome.forEach((value, supportedTestOutcome) => { - const resultCountByPriority = value.getTestResultsForRun(Number.parseInt(summaryItem.$id)); - resultCountByPriority.forEach((resultCount, priority) => { - if (!summaryItem.$testCountForOutcomeByPriority.has(priority)) { - summaryItem.$testCountForOutcomeByPriority.set(priority, new Map()); - } - const testCountByOutcome = summaryItem.$testCountForOutcomeByPriority.get(priority); - if (!testCountByOutcome.has(supportedTestOutcome)) { - testCountByOutcome.set(supportedTestOutcome, 0); - } - testCountByOutcome.set(supportedTestOutcome, testCountByOutcome.get(supportedTestOutcome) + resultCountByPriority.get(priority)); - }); - }); - }); - return summaryItemByRun; - } - getTestSummaryDataByPriorityAsync() { - return __awaiter(this, void 0, void 0, function* () { - var outcomeFilters = new Map(); - outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Passed, [TestInterfaces_1.TestOutcome.Passed]); - outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Inconclusive, [TestInterfaces_1.TestOutcome.Inconclusive]); - outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.NotExecuted, [TestInterfaces_1.TestOutcome.NotExecuted]); - outcomeFilters.set(TestOutcomeForPriority_1.TestOutcomeForPriority.Other, TcmHelper_1.TcmHelper.exceptOutcomes([TestInterfaces_1.TestOutcome.Failed, TestInterfaces_1.TestOutcome.Passed, TestInterfaces_1.TestOutcome.Inconclusive, TestInterfaces_1.TestOutcome.NotExecuted])); - var testResultDetailsForOutcomes = new Map(); - const outcomeMap = new Map(); - const keys = Array.from(outcomeFilters.keys()); - for (var i = 0; i < keys.length; i++) { - const outcome = keys[i]; - const resultsForOutCome = yield this.testResultsClient.getTestResultsDetailsAsync("Priority", outcomeFilters.get(outcome)); - outcomeMap.set(outcome, resultsForOutCome); - } - outcomeMap.forEach((value, key) => { - testResultDetailsForOutcomes.set(key, new TestResultDetailsParserForPriority_1.TestResultDetailsParserForPriority(value)); - }); - return testResultDetailsForOutcomes; - }); - } -} -exports.TestSummaryDataProvider = TestSummaryDataProvider; -// export class AggregatedResultsByOutcomeImpl implements AggregatedResultsByOutcome { -// count?: number; -// duration?: any; -// groupByField?: string; -// groupByValue?: any; -// outcome?: TestOutcome; -// rerunResultCount?: number; -// } -//# sourceMappingURL=TestSummaryDataProvider.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js.map deleted file mode 100644 index c7f76611..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestSummaryDataProvider.js","sourceRoot":"","sources":["TestSummaryDataProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js deleted file mode 100644 index 44e8c5ad..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js +++ /dev/null @@ -1,103 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TelemetryLogger = void 0; -const PipelineType_1 = require("../config/pipeline/PipelineType"); -const EnumUtils_1 = require("../utils/EnumUtils"); -const now = require("performance-now"); -class TelemetryLogger { - /** - * Formats and sends all telemetry collected to be published - */ - static LogTaskConfig(reportConfiguration) { - this.reportConfig = reportConfiguration; - const pipelineConfig = this.reportConfig.$pipelineConfiguration; - const mailConfig = this.reportConfig.$mailConfiguration; - const reportDataConfig = this.reportConfig.$reportDataConfiguration; - let pipelineTypeString = "Release"; - let environmentId = 0; - if (pipelineConfig.$pipelineType == PipelineType_1.PipelineType.Build) { - pipelineTypeString = "Build"; - } - else { - environmentId = pipelineConfig.$environmentId; - } - const groupTestSummary = reportDataConfig.$groupTestSummaryBy.map(g => EnumUtils_1.EnumUtils.GetGroupTestResultsByString(g)); - let groupTestSummaryString = groupTestSummary[0]; - if (groupTestSummary.length > 0) { - groupTestSummaryString = groupTestSummary.join(","); - } - this.logTelemetry({ - pipelineId: pipelineConfig.$pipelineId, - pipelineType: pipelineTypeString, - projectId: pipelineConfig.$projectId, - projectName: pipelineConfig.$projectName, - environmentId: environmentId, - taskConfiguration: { - sendMailCondition: EnumUtils_1.EnumUtils.GetMailConditionString(this.reportConfig.$sendMailCondition), - smtpHost: mailConfig.$smtpConfig.$smtpHost, - smtpUserName: mailConfig.$smtpConfig.$userName, - enableTLs: mailConfig.$smtpConfig.$enableTLS, - includeCommits: reportDataConfig.$includeCommits, - includeOthersInTotal: reportDataConfig.$includeOthersInTotal, - groupTestSummaryBy: groupTestSummaryString, - testResultsConfiguration: { - includeFailedTests: reportDataConfig.$testResultsConfig.$includeFailedTests, - includeInconclusiveTests: reportDataConfig.$testResultsConfig.$includeInconclusiveTests, - includeNotExecutedTests: reportDataConfig.$testResultsConfig.$includeNotExecutedTests, - includeOtherTests: reportDataConfig.$testResultsConfig.$includeOtherTests, - includePassedTests: reportDataConfig.$testResultsConfig.$includePassedTests, - maxItemsToShow: reportDataConfig.$testResultsConfig.$maxItemsToShow - } - } - }); - } - static LogModulePerf(moduleName, timeTaken, numRetries = 0) { - const timeTakenString = timeTaken.toFixed(2); - if (numRetries < 1) { - this.logTelemetry({ - "ModuleName": `${moduleName}`, - "PERF": `${timeTakenString}` - }); - } - else { - this.logTelemetry({ - "ModuleName": `${moduleName}`, - "PERF": `${timeTakenString}`, - "Retries": `${numRetries}` - }); - } - } - /** - * Publishes an object as a string as telemetry - * @param telemetryToLog Object to be logged as a string - */ - static logTelemetry(telemetryToLog) { - console.log(TelemetryLogger.TELEMETRY_LINE + JSON.stringify(telemetryToLog)); - } - static InvokeWithPerfLogger(executor, executorName) { - return __awaiter(this, void 0, void 0, function* () { - const perfStart = now(); - let returnVal; - try { - returnVal = yield executor(); - } - finally { - // Log time taken by the dataprovider - TelemetryLogger.LogModulePerf(executorName, now() - perfStart); - } - return returnVal; - }); - } -} -exports.TelemetryLogger = TelemetryLogger; -TelemetryLogger.TELEMETRY_LINE = "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; -//# sourceMappingURL=TelemetryLogger.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js.map deleted file mode 100644 index 80c01ab2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TelemetryLogger.js","sourceRoot":"","sources":["TelemetryLogger.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js deleted file mode 100644 index 895b94fd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js +++ /dev/null @@ -1,80 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MockConfigProvider = exports.FileWriter = void 0; -const SendMailCondition_1 = require("../../config/report/SendMailCondition"); -const PipelineConfiguration_1 = require("../../config/pipeline/PipelineConfiguration"); -const MailConfiguration_1 = require("../../config/mail/MailConfiguration"); -const ReportDataConfiguration_1 = require("../../config/report/ReportDataConfiguration"); -const ReportConfiguration_1 = require("../../config/ReportConfiguration"); -const ReportManager_1 = require("../../ReportManager"); -const GroupTestResultsBy_1 = require("../../config/report/GroupTestResultsBy"); -const TestResultsConfiguration_1 = require("../../config/report/TestResultsConfiguration"); -const RecipientsConfiguration_1 = require("../../config/mail/RecipientsConfiguration"); -const SmtpConfiguration_1 = require("../../config/mail/SmtpConfiguration"); -const PipelineType_1 = require("../../config/pipeline/PipelineType"); -const ReportProvider_1 = require("../../providers/ReportProvider"); -const DataProviderFactory_1 = require("../../providers/DataProviderFactory"); -const HTMLReportCreator_1 = require("../../htmlreport/HTMLReportCreator"); -const util_1 = require("util"); -const EmailSender_1 = require("../../EmailSender"); -const TelemetryLogger_1 = require("../../telemetry/TelemetryLogger"); -const fs = require("fs"); -const accessKey = process.env.AccessKey; -const smtpUser = process.env.SMTPUSER; -const smtpPassword = process.env.SMTPPASSWORD; -class FileWriter { - static writeToFile(content, fileName) { - const currDir = __dirname; - console.log(`CurrentDir: ${currDir}`); - var msgPath = `${currDir}\\${fileName}`; - fs.writeFile(msgPath, content, (err) => { - if (err) { - return console.log(err); - } - console.log("File saved successfully!"); - }); - } -} -exports.FileWriter = FileWriter; -class MockConfigProvider { - getPipelineConfiguration() { - return new PipelineConfiguration_1.PipelineConfiguration(PipelineType_1.PipelineType.Release, 13942411, "ProjectId", "ProjectName", 160977787, 9462, false, "https://dev.azure.com/{account}/", accessKey); - } - getMailConfiguration() { - return new MailConfiguration_1.MailConfiguration("[{environmentStatus}] {passPercentage} tests passed", new RecipientsConfiguration_1.RecipientsConfiguration("xyz@email.com", false, false, false, false), new RecipientsConfiguration_1.RecipientsConfiguration("", false, false, false, false), new SmtpConfiguration_1.SmtpConfiguration(smtpUser, smtpPassword, "smtp.live.com", true), "test.com"); - } - getReportDataConfiguration() { - const testResultsConfig = new TestResultsConfiguration_1.TestResultsConfiguration(true, false, false, false, false, GroupTestResultsBy_1.GroupTestResultsBy.Run, 10); - return new ReportDataConfiguration_1.ReportDataConfiguration(true, false, true, [GroupTestResultsBy_1.GroupTestResultsBy.Priority, GroupTestResultsBy_1.GroupTestResultsBy.Run], testResultsConfig); - } - getSendMailCondition() { - return SendMailCondition_1.SendMailCondition.Always; - } -} -exports.MockConfigProvider = MockConfigProvider; -function run() { - return __awaiter(this, void 0, void 0, function* () { - console.log('Node Version: ' + process.version); - const configProvider = new MockConfigProvider(); - const reportConfiguration = new ReportConfiguration_1.ReportConfiguration(configProvider); - TelemetryLogger_1.TelemetryLogger.LogTaskConfig(reportConfiguration); - const reportManager = new ReportManager_1.ReportManager(new ReportProvider_1.ReportProvider(new DataProviderFactory_1.DataProviderFactory(configProvider.getPipelineConfiguration())), new HTMLReportCreator_1.HTMLReportCreator(), new EmailSender_1.EmailSender()); - reportManager.sendReportAsync(reportConfiguration); - }); -} -if (util_1.isNullOrUndefined(accessKey)) { - console.error("Set Environment Vars for AccessKey."); -} -else { - run(); -} -//# sourceMappingURL=InvokeTest.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js.map deleted file mode 100644 index 626265a1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"InvokeTest.js","sourceRoot":"","sources":["InvokeTest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js deleted file mode 100644 index 1627cca4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const sinon_1 = __importDefault(require("sinon")); -const ReportFactory_1 = require("../../model/ReportFactory"); -const ReportProvider_1 = require("../../providers/ReportProvider"); -const ReportManager_1 = require("../../ReportManager"); -const MissingDataError_1 = require("../../exceptions/MissingDataError"); -describe("ReportManager Tests", () => { - let reportProvider = sinon_1.default.createStubInstance(ReportProvider_1.ReportProvider); - beforeEach(() => { - const report = ReportFactory_1.ReportFactory.createNewReport(null); - sinon_1.default.stub(reportProvider, "createReportAsync").returns(Promise.resolve(report)); - sinon_1.default.stub(report, "$dataMissing").returns(true); - }); - test("ReportManager throws error when datamissing from report", () => __awaiter(void 0, void 0, void 0, function* () { - let reportManager = new ReportManager_1.ReportManager(reportProvider, null, null); - expect(reportManager.sendReportAsync(null)).rejects.toThrow(MissingDataError_1.MissingDataError); - })); -}); -//# sourceMappingURL=ReportManagerTests.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js.map deleted file mode 100644 index 0e8a5585..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportManagerTests.js","sourceRoot":"","sources":["ReportManagerTests.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,6DAA0D;AAE1D,mEAAgE;AAChE,uDAAoD;AACpD,wEAAqE;AAErE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IAEnC,IAAI,cAAc,GAAoB,eAAK,CAAC,kBAAkB,CAAC,+BAAc,CAAC,CAAC;IAE/E,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,MAAM,GAAG,6BAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACnD,eAAK,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,eAAK,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAS,EAAE;QACzE,IAAI,aAAa,GAAG,IAAI,6BAAa,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAgB,CAAC,CAAC;IAChF,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js deleted file mode 100644 index 76a207cc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DisplayNameHelper = void 0; -class DisplayNameHelper { - static getPriorityDisplayName(priority) { - const priorityInt = Number.parseInt(priority); - if (!isNaN(priorityInt) && priorityInt == 255) { - return "Priority unspecified"; - } - return `Priority: ${priority}`; - } -} -exports.DisplayNameHelper = DisplayNameHelper; -//# sourceMappingURL=DisplayNameHelper.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js.map deleted file mode 100644 index cd10b401..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DisplayNameHelper.js","sourceRoot":"","sources":["DisplayNameHelper.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAiB;IAErB,MAAM,CAAC,sBAAsB,CAAC,QAAgB;QACnD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE;YAC7C,OAAO,sBAAsB,CAAC;SAC/B;QACD,OAAO,aAAa,QAAQ,EAAE,CAAC;IACjC,CAAC;CACF;AATD,8CASC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js deleted file mode 100644 index 6f71fe91..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EnumUtils = void 0; -const SendMailCondition_1 = require("../config/report/SendMailCondition"); -const GroupTestResultsBy_1 = require("../config/report/GroupTestResultsBy"); -class EnumUtils { - static GetMailConditionString(condition) { - let index = 0; - for (let val in SendMailCondition_1.SendMailCondition) { - if (!isNaN(Number(val)) && condition == Number(val)) { - break; - } - index++; - } - let index2 = 0; - for (let val in SendMailCondition_1.SendMailCondition) { - if (isNaN(Number(val))) { - if (index2 == index) - return val; - index2++; - } - } - return null; - } - static GetGroupTestResultsByString(condition) { - let index = 0; - for (let val in GroupTestResultsBy_1.GroupTestResultsBy) { - if (!isNaN(Number(val)) && condition == Number(val)) { - break; - } - index++; - } - let index2 = 0; - for (let val in GroupTestResultsBy_1.GroupTestResultsBy) { - if (isNaN(Number(val))) { - if (index2 == index) - return val; - index2++; - } - } - return null; - } -} -exports.EnumUtils = EnumUtils; -//# sourceMappingURL=EnumUtils.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js.map deleted file mode 100644 index 4777777b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EnumUtils.js","sourceRoot":"","sources":["EnumUtils.ts"],"names":[],"mappings":";;;AAAA,0EAAuE;AACvE,4EAAyE;AAEzE,MAAa,SAAS;IAEb,MAAM,CAAC,sBAAsB,CAAC,SAA4B;QAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAI,IAAI,GAAG,IAAI,qCAAiB,EAAE;YAChC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM;aACP;YACD,KAAK,EAAE,CAAC;SACT;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAI,IAAI,GAAG,IAAI,qCAAiB,EAAE;YAChC,IAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAG,MAAM,IAAI,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM,CAAC,2BAA2B,CAAC,SAA6B;QACrE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAI,IAAI,GAAG,IAAI,uCAAkB,EAAE;YACjC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM;aACP;YACD,KAAK,EAAE,CAAC;SACT;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAI,IAAI,GAAG,IAAI,uCAAkB,EAAE;YACjC,IAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAG,MAAM,IAAI,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAzCD,8BAyCC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js deleted file mode 100644 index 0daa1050..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EnvironmentExtensions = void 0; -class EnvironmentExtensions { - static getPhases(environment) { - const phases = new Array(); - if (environment.deploySteps != null && environment.deploySteps.length > 0) { - let attempt = 0; - let latestDeploySteps = environment.deploySteps[0]; - for (var i = 0; i < environment.deploySteps.length; i++) { - if (environment.deploySteps[i].attempt > attempt) { - latestDeploySteps = environment.deploySteps[i]; - } - } - phases.push(...latestDeploySteps.releaseDeployPhases); - } - return phases; - } -} -exports.EnvironmentExtensions = EnvironmentExtensions; -//# sourceMappingURL=EnvironmentExtensions.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js.map deleted file mode 100644 index d47af3f4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EnvironmentExtensions.js","sourceRoot":"","sources":["EnvironmentExtensions.ts"],"names":[],"mappings":";;;AAEA,MAAa,qBAAqB;IAChC,MAAM,CAAC,SAAS,CAAC,WAA+B;QAC9C,MAAM,MAAM,GAAG,IAAI,KAAK,EAAsB,CAAC;QAC/C,IAAI,WAAW,CAAC,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACzE,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,iBAAiB,GAAsB,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACtE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/D,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE;oBAChD,iBAAiB,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;iBAChD;aACF;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;SACvD;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAhBD,sDAgBC"} \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js deleted file mode 100644 index 2593a00c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.StringUtils = void 0; -class StringUtils { - static isNullOrWhiteSpace(input) { - if (typeof input === 'undefined' || input == null) - return true; - return input.replace("/\s/g", '').length < 1; - } - static CompressNewLines(content) { - if (content != null) { - const lines = this.getNonEmptyLines(content); - content = lines.join("\n"); - } - return content; - } - static getNonEmptyLines(s) { - s = s.replace("\r", ""); - return s.split('\n') - .filter(str => !this.isNullOrWhiteSpace(str)) - .map(str => str.trim()); - } - static ReplaceNewlineWithBrTag(content) { - if (content == null) { - return null; - } - const lines = this.getNonEmptyLines(content); - return lines.join("
"); - } - static getFirstNLines(content, lineCount) { - if (content != null) { - var lines = this.getNonEmptyLines(content); - return lines.slice(0, lineCount).join("\n"); - } - return null; - } -} -exports.StringUtils = StringUtils; -//# sourceMappingURL=StringUtils.js.map \ No newline at end of file diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js.map b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js.map deleted file mode 100644 index b390e763..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"StringUtils.js","sourceRoot":"","sources":["StringUtils.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACf,MAAM,CAAC,kBAAkB,CAAC,KAAa;QAE5C,IAAI,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/D,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAAC,OAAe;QAC5C,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC7C,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5B;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,CAAS;QACvC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;aACjB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;aAC5C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,uBAAuB,CAAC,OAAe;QACnD,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,OAAe,EAAE,SAAiB;QAC7D,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7C;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAvCD,kCAuCC"} \ No newline at end of file From 837e1f81e7985f07866535d19d53bae2dce6bb05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Tue, 17 Oct 2023 10:44:42 +0300 Subject: [PATCH 10/11] remove .d.ts file that should not be in the repo --- .../emailReportTaskV1/EmailSender.d.ts | 7 -- .../emailReportTaskV1/IReportSender.d.ts | 5 -- .../emailReportTaskV1/ReportManager.d.ts | 11 --- .../config/ConfigurationProvider.d.ts | 26 ------- .../config/IConfigurationProvider.d.ts | 10 --- .../config/ReportConfiguration.d.ts | 19 ----- .../config/TaskConstants.d.ts | 28 ------- .../config/mail/MailConfiguration.d.ts | 40 ---------- .../config/mail/RecipientsConfiguration.d.ts | 33 --------- .../config/mail/SmtpConfiguration.d.ts | 27 ------- .../pipeline/PipelineConfiguration.d.ts | 60 --------------- .../config/pipeline/PipelineType.d.ts | 4 - .../config/report/GroupTestResultsBy.d.ts | 5 -- .../report/ReportDataConfiguration.d.ts | 35 --------- .../config/report/SendMailCondition.d.ts | 6 -- .../report/TestResultsConfiguration.d.ts | 46 ------------ .../exceptions/DataProviderError.d.ts | 4 - .../exceptions/InputError.d.ts | 4 - .../InvalidTestResultDataError.d.ts | 4 - .../exceptions/MailError.d.ts | 4 - .../exceptions/MissingDataError.d.ts | 4 - .../exceptions/PipelineNotFoundError.d.ts | 4 - .../exceptions/PostProcessorError.d.ts | 4 - .../exceptions/ReportError.d.ts | 6 -- .../htmlreport/HTMLReportCreator.d.ts | 6 -- .../htmlreport/IHTMLReportCreator.d.ts | 5 -- .../emailReportTaskV1/index.d.ts | 1 - .../emailReportTaskV1/model/BuildReport.d.ts | 25 ------- .../emailReportTaskV1/model/ChangeModel.d.ts | 34 --------- .../emailReportTaskV1/model/IssueModel.d.ts | 15 ---- .../emailReportTaskV1/model/JobModel.d.ts | 30 -------- .../emailReportTaskV1/model/PhaseModel.d.ts | 28 ------- .../model/ReleaseReport.d.ts | 51 ------------- .../emailReportTaskV1/model/Report.d.ts | 73 ------------------- .../model/ReportFactory.d.ts | 9 --- .../emailReportTaskV1/model/TaskModel.d.ts | 41 ----------- .../model/helpers/LinkHelper.d.ts | 28 ------- .../model/helpers/TestResultsHelper.d.ts | 10 --- .../model/helpers/TimeFormatter.d.ts | 7 -- .../testresults/TestOutcomeForPriority.d.ts | 7 -- .../testresults/TestResultGroupModel.d.ts | 6 -- .../model/testresults/TestResultModel.d.ts | 7 -- .../testresults/TestSummaryGroupModel.d.ts | 6 -- .../testresults/TestSummaryItemModel.d.ts | 55 -------------- .../model/viewmodel/ArtifactViewModel.d.ts | 15 ---- .../viewmodel/BuildReferenceViewModel.d.ts | 11 --- .../model/viewmodel/ChangeViewModel.d.ts | 15 ---- .../viewmodel/DeploymentJobViewModel.d.ts | 10 --- .../model/viewmodel/EmailReportViewModel.d.ts | 38 ---------- .../model/viewmodel/MailAddressViewModel.d.ts | 18 ----- .../model/viewmodel/PhaseIssuesViewModel.d.ts | 7 -- .../model/viewmodel/PhaseViewModel.d.ts | 15 ---- .../ReleaseEnvironmentViewModel.d.ts | 6 -- .../viewmodel/ReleaseReferenceViewModel.d.ts | 8 -- .../model/viewmodel/ReleaseViewModel.d.ts | 13 ---- .../viewmodel/TaskIssueSummaryViewModel.d.ts | 14 ---- .../model/viewmodel/TaskIssueViewModel.d.ts | 9 --- .../model/viewmodel/TaskResultViewModel.d.ts | 24 ------ .../TestInfoByPriorityViewModel.d.ts | 11 --- .../viewmodel/TestResultSummaryViewModel.d.ts | 14 ---- .../model/viewmodel/TestResultViewModel.d.ts | 26 ------- .../viewmodel/TestResultsGroupViewModel.d.ts | 18 ----- .../viewmodel/TestSummaryGroupViewModel.d.ts | 15 ---- .../viewmodel/TestSummaryItemViewModel.d.ts | 15 ---- .../model/viewmodel/WorkItemViewModel.d.ts | 14 ---- .../providers/DataProviderFactory.d.ts | 14 ---- .../providers/IDataProvider.d.ts | 6 -- .../providers/IDataProviderFactory.d.ts | 6 -- .../providers/IPostProcessor.d.ts | 5 -- .../providers/IReportProvider.d.ts | 5 -- .../providers/ReportProvider.d.ts | 12 --- .../providers/SendMailConditionProcessor.d.ts | 14 ---- .../AbstractTestResultsDetailsParser.d.ts | 9 --- .../TestResultDetailsParserFactory.d.ts | 5 -- .../TestResultDetailsParserForPriority.d.ts | 11 --- .../TestResultDetailsParserForRun.d.ts | 14 ---- .../providers/pipeline/BuildDataProvider.d.ts | 14 ---- .../pipeline/ReleaseDataProvider.d.ts | 15 ---- .../providers/restclients/AbstractClient.d.ts | 13 ---- .../AbstractTestResultsClient.d.ts | 28 ------- .../providers/restclients/BuildClient.d.ts | 13 ---- .../restclients/BuildTestResultsClient.d.ts | 9 --- .../restclients/IPipelineRestClient.d.ts | 8 -- .../restclients/ITestResultsClient.d.ts | 12 --- .../restclients/IWorkItemClient.d.ts | 4 - .../providers/restclients/ReleaseClient.d.ts | 12 --- .../restclients/ReleaseTestResultsClient.d.ts | 9 --- .../restclients/RetryablePromise.d.ts | 4 - .../providers/restclients/WorkItemClient.d.ts | 9 --- .../providers/tcmproviders/TcmHelper.d.ts | 9 --- .../tcmproviders/TestOwnersDataProvider.d.ts | 10 --- .../tcmproviders/TestResultsDataProvider.d.ts | 19 ----- .../tcmproviders/TestSummaryDataProvider.d.ts | 14 ---- .../telemetry/TelemetryLogger.d.ts | 17 ----- .../tests/__e_to_e_tests__/InvokeTest.d.ts | 14 ---- .../tests/__tests__/ReportManagerTests.d.ts | 1 - .../utils/DisplayNameHelper.d.ts | 3 - .../emailReportTaskV1/utils/EnumUtils.d.ts | 6 -- .../utils/EnvironmentExtensions.d.ts | 4 - .../emailReportTaskV1/utils/StringUtils.d.ts | 7 -- .../emailReportTaskV2/EmailSender.d.ts | 7 -- .../emailReportTaskV2/IReportSender.d.ts | 5 -- .../emailReportTaskV2/ReportManager.d.ts | 11 --- .../config/ConfigurationProvider.d.ts | 26 ------- .../config/IConfigurationProvider.d.ts | 10 --- .../config/ReportConfiguration.d.ts | 19 ----- .../config/TaskConstants.d.ts | 28 ------- .../config/mail/MailConfiguration.d.ts | 40 ---------- .../config/mail/RecipientsConfiguration.d.ts | 33 --------- .../config/mail/SmtpConfiguration.d.ts | 27 ------- .../pipeline/PipelineConfiguration.d.ts | 60 --------------- .../config/pipeline/PipelineType.d.ts | 4 - .../config/report/GroupTestResultsBy.d.ts | 5 -- .../report/ReportDataConfiguration.d.ts | 35 --------- .../config/report/SendMailCondition.d.ts | 6 -- .../report/TestResultsConfiguration.d.ts | 46 ------------ .../exceptions/DataProviderError.d.ts | 4 - .../exceptions/InputError.d.ts | 4 - .../InvalidTestResultDataError.d.ts | 4 - .../exceptions/MailError.d.ts | 4 - .../exceptions/MissingDataError.d.ts | 4 - .../exceptions/PipelineNotFoundError.d.ts | 4 - .../exceptions/PostProcessorError.d.ts | 4 - .../exceptions/ReportError.d.ts | 6 -- .../htmlreport/HTMLReportCreator.d.ts | 6 -- .../htmlreport/IHTMLReportCreator.d.ts | 5 -- .../emailReportTaskV2/index.d.ts | 1 - .../emailReportTaskV2/model/BuildReport.d.ts | 25 ------- .../emailReportTaskV2/model/ChangeModel.d.ts | 34 --------- .../emailReportTaskV2/model/IssueModel.d.ts | 15 ---- .../emailReportTaskV2/model/JobModel.d.ts | 30 -------- .../emailReportTaskV2/model/PhaseModel.d.ts | 28 ------- .../model/ReleaseReport.d.ts | 51 ------------- .../emailReportTaskV2/model/Report.d.ts | 73 ------------------- .../model/ReportFactory.d.ts | 9 --- .../emailReportTaskV2/model/TaskModel.d.ts | 41 ----------- .../model/helpers/LinkHelper.d.ts | 28 ------- .../model/helpers/TestResultsHelper.d.ts | 10 --- .../model/helpers/TimeFormatter.d.ts | 7 -- .../testresults/TestOutcomeForPriority.d.ts | 7 -- .../testresults/TestResultGroupModel.d.ts | 6 -- .../model/testresults/TestResultModel.d.ts | 7 -- .../testresults/TestSummaryGroupModel.d.ts | 6 -- .../testresults/TestSummaryItemModel.d.ts | 55 -------------- .../model/viewmodel/ArtifactViewModel.d.ts | 15 ---- .../viewmodel/BuildReferenceViewModel.d.ts | 11 --- .../model/viewmodel/ChangeViewModel.d.ts | 15 ---- .../viewmodel/DeploymentJobViewModel.d.ts | 10 --- .../model/viewmodel/EmailReportViewModel.d.ts | 38 ---------- .../model/viewmodel/MailAddressViewModel.d.ts | 18 ----- .../model/viewmodel/PhaseIssuesViewModel.d.ts | 7 -- .../model/viewmodel/PhaseViewModel.d.ts | 15 ---- .../ReleaseEnvironmentViewModel.d.ts | 6 -- .../viewmodel/ReleaseReferenceViewModel.d.ts | 8 -- .../model/viewmodel/ReleaseViewModel.d.ts | 13 ---- .../viewmodel/TaskIssueSummaryViewModel.d.ts | 14 ---- .../model/viewmodel/TaskIssueViewModel.d.ts | 9 --- .../model/viewmodel/TaskResultViewModel.d.ts | 24 ------ .../TestInfoByPriorityViewModel.d.ts | 11 --- .../viewmodel/TestResultSummaryViewModel.d.ts | 14 ---- .../model/viewmodel/TestResultViewModel.d.ts | 26 ------- .../viewmodel/TestResultsGroupViewModel.d.ts | 18 ----- .../viewmodel/TestSummaryGroupViewModel.d.ts | 15 ---- .../viewmodel/TestSummaryItemViewModel.d.ts | 15 ---- .../model/viewmodel/WorkItemViewModel.d.ts | 14 ---- .../providers/DataProviderFactory.d.ts | 14 ---- .../providers/IDataProvider.d.ts | 6 -- .../providers/IDataProviderFactory.d.ts | 6 -- .../providers/IPostProcessor.d.ts | 5 -- .../providers/IReportProvider.d.ts | 5 -- .../providers/ReportProvider.d.ts | 12 --- .../providers/SendMailConditionProcessor.d.ts | 14 ---- .../AbstractTestResultsDetailsParser.d.ts | 9 --- .../TestResultDetailsParserFactory.d.ts | 5 -- .../TestResultDetailsParserForPriority.d.ts | 11 --- .../TestResultDetailsParserForRun.d.ts | 14 ---- .../providers/pipeline/BuildDataProvider.d.ts | 14 ---- .../pipeline/ReleaseDataProvider.d.ts | 15 ---- .../providers/restclients/AbstractClient.d.ts | 13 ---- .../AbstractTestResultsClient.d.ts | 28 ------- .../providers/restclients/BuildClient.d.ts | 13 ---- .../restclients/BuildTestResultsClient.d.ts | 9 --- .../restclients/IPipelineRestClient.d.ts | 8 -- .../restclients/ITestResultsClient.d.ts | 12 --- .../restclients/IWorkItemClient.d.ts | 4 - .../providers/restclients/ReleaseClient.d.ts | 12 --- .../restclients/ReleaseTestResultsClient.d.ts | 9 --- .../restclients/RetryablePromise.d.ts | 4 - .../providers/restclients/WorkItemClient.d.ts | 9 --- .../providers/tcmproviders/TcmHelper.d.ts | 9 --- .../tcmproviders/TestOwnersDataProvider.d.ts | 10 --- .../tcmproviders/TestResultsDataProvider.d.ts | 19 ----- .../tcmproviders/TestSummaryDataProvider.d.ts | 14 ---- .../telemetry/TelemetryLogger.d.ts | 17 ----- .../tests/__e_to_e_tests__/InvokeTest.d.ts | 14 ---- .../tests/__tests__/ReportManagerTests.d.ts | 1 - .../utils/DisplayNameHelper.d.ts | 3 - .../emailReportTaskV2/utils/EnumUtils.d.ts | 6 -- .../utils/EnvironmentExtensions.d.ts | 4 - .../emailReportTaskV2/utils/StringUtils.d.ts | 7 -- 200 files changed, 3022 deletions(-) delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.d.ts delete mode 100644 Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.d.ts diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.d.ts deleted file mode 100644 index 15ea15d1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/EmailSender.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IReportSender } from "./IReportSender"; -import { MailConfiguration } from "./config/mail/MailConfiguration"; -import { Report } from "./model/Report"; -export declare class EmailSender implements IReportSender { - sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; - private sendMailAsync; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.d.ts deleted file mode 100644 index f5cd6ac2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/IReportSender.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Report } from "./model/Report"; -import { MailConfiguration } from "./config/mail/MailConfiguration"; -export interface IReportSender { - sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.d.ts deleted file mode 100644 index 7eca7eed..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/ReportManager.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IReportProvider } from "./providers/IReportProvider"; -import { ReportConfiguration } from "./config/ReportConfiguration"; -import { IReportSender } from "./IReportSender"; -import { IHTMLReportCreator } from "./htmlreport/IHTMLReportCreator"; -export declare class ReportManager { - private reportProvider; - private reportSender; - private htmlReportCreator; - constructor(reportProvider: IReportProvider, htmlReportCreator: IHTMLReportCreator, reportSender: IReportSender); - sendReportAsync(reportConfig: ReportConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.d.ts deleted file mode 100644 index 8ca4269d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ConfigurationProvider.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { IConfigurationProvider } from "./IConfigurationProvider"; -import { SendMailCondition } from "./report/SendMailCondition"; -import { MailConfiguration } from "./mail/MailConfiguration"; -import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; -import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; -export declare class ConfigurationProvider implements IConfigurationProvider { - private pipelineConfiguration; - private mailConfiguration; - private reportDataConfiguration; - private sendMailCondition; - constructor(); - getPipelineConfiguration(): PipelineConfiguration; - getMailConfiguration(): MailConfiguration; - getReportDataConfiguration(): ReportDataConfiguration; - getSendMailCondition(): SendMailCondition; - /** - * Gets access token from system - */ - private getAccessKey; - private initPipelineConfiguration; - private initMailConfiguration; - private initReportDataConfiguration; - initSendMailCondition(): void; - private getRecipientConfiguration; - private getGroupTestResultsByEnumFromString; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.d.ts deleted file mode 100644 index df19ee31..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/IConfigurationProvider.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SendMailCondition } from "./report/SendMailCondition"; -import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; -import { MailConfiguration } from "./mail/MailConfiguration"; -import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; -export interface IConfigurationProvider { - getPipelineConfiguration(): PipelineConfiguration; - getMailConfiguration(): MailConfiguration; - getReportDataConfiguration(): ReportDataConfiguration; - getSendMailCondition(): SendMailCondition; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.d.ts deleted file mode 100644 index 26b2dde4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/ReportConfiguration.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { MailConfiguration } from "./mail/MailConfiguration"; -import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; -import { IConfigurationProvider } from "./IConfigurationProvider"; -import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; -import { SendMailCondition } from "./report/SendMailCondition"; -export declare class ReportConfiguration { - private sendMailCondition; - private mailConfiguration; - private reportDataConfiguration; - private pipelineConfiguration; - constructor(configProvider: IConfigurationProvider); - validateConfiguration(): void; - private validateMailConfig; - get $sendMailCondition(): SendMailCondition; - get $mailConfiguration(): MailConfiguration; - get $reportDataConfiguration(): ReportDataConfiguration; - get $pipelineConfiguration(): PipelineConfiguration; - private throwError; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.d.ts deleted file mode 100644 index d88a6fb3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/TaskConstants.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -export declare class TaskConstants { - static readonly SUBJECT_INPUTKEY = "subject"; - static readonly SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; - static readonly INCLUDECOMMITS_INPUTKEY = "includeCommits"; - static readonly GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; - static readonly INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; - static readonly MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; - static readonly GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; - static readonly INCLUDERESULTS_INPUTKEY = "includeResultsStr"; - static readonly TOADDRESS_INPUTKEY = "toAddress"; - static readonly CCADDRESS_INPUTKEY = "ccAddress"; - static readonly INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; - static readonly INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; - static readonly SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; - static readonly ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; - static readonly USEPREVENV_INPUTKEY = "usePreviousEnvironment"; - static readonly DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; - static readonly TEAM_FOUNDATION_KEY: string; - static readonly VSS_CONNECTION_KEY: string; - static readonly ACCESS_PARAMETER: string; - static readonly PROJECTNAME_KEY: string; - static readonly PROJECTID_KEY: string; - static readonly BUILD_ID_KEY: string; - static readonly RELEASE_ID_KEY: string; - static readonly HOST_KEY: string; - static readonly ENVIRONMENTID_KEY: string; - static readonly ENVIRONMENTDEFID_KEY: string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.d.ts deleted file mode 100644 index dee79830..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/MailConfiguration.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { RecipientsConfiguration } from "./RecipientsConfiguration"; -import { SmtpConfiguration } from "./SmtpConfiguration"; -export declare class MailConfiguration { - private mailSubject; - private toRecipientsConfig; - private ccRecipientsConfig; - private smtpConfig; - private defaultDomain; - constructor($mailSubject: string, $toRecipientsConfig: RecipientsConfiguration, $ccRecipientsConfig: RecipientsConfiguration, $smtpConfig: SmtpConfiguration, $defaultDomain: string); - /** - * Getter $defaultDomain - * @return {string} - */ - get $defaultDomain(): string; - /** - * Getter $mailSubject - * @return {string} - */ - get $mailSubject(): string; - /** - * Getter $ccRecipientsConfig - * @return {RecipientsConfiguration} - */ - get $ccRecipientsConfig(): RecipientsConfiguration; - /** - * Getter $smtpConfig - * @return {SmtpConfiguration} - */ - get $smtpConfig(): SmtpConfiguration; - /** - * Getter $toRecipientsConfig - * @return {RecipientsConfiguration} - */ - get $toRecipientsConfig(): RecipientsConfiguration; - /** - * Setter $mailSubject - * @param {string} value - */ - set $mailSubject(value: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.d.ts deleted file mode 100644 index 5b3d30ce..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/RecipientsConfiguration.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -export declare class RecipientsConfiguration { - private defaultRecipients; - private includeChangesetOwners; - private includeTestOwners; - private includeActiveBugOwners; - private includeCreatedBy; - constructor($defaultRecipients: string, $includeChangesetOwners?: boolean, $includeTestOwners?: boolean, $includeActiveBugOwners?: boolean, $includeCreatedBy?: boolean); - /** - * Getter $defaultRecipients - * @return {string} - */ - get $defaultRecipients(): string; - /** - * Getter $includeChangesetOwners - * @return {boolean} - */ - get $includeChangesetOwners(): boolean; - /** - * Getter $includeTestOwners - * @return {boolean} - */ - get $includeTestOwners(): boolean; - /** - * Getter $includeActiveBugOwners - * @return {boolean} - */ - get $includeActiveBugOwners(): boolean; - /** - * Getter $includeCreatedBy - * @return {boolean} - */ - get $includeCreatedBy(): boolean; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.d.ts deleted file mode 100644 index 3d9e3705..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/mail/SmtpConfiguration.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -export declare class SmtpConfiguration { - private userName; - private password; - private smtpHost; - private enableTLS; - constructor($userName: string, $password: string, $smtpHost: string, $enableTLS: boolean); - /** - * Getter $userName - * @return {string} - */ - get $userName(): string; - /** - * Getter $password - * @return {string} - */ - get $password(): string; - /** - * Getter $smtpHost - * @return {string} - */ - get $smtpHost(): string; - /** - * Getter $enableSSL - * @return {boolean} - */ - get $enableTLS(): boolean; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.d.ts deleted file mode 100644 index f5d5457a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineConfiguration.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { PipelineType } from "./PipelineType"; -export declare class PipelineConfiguration { - private pipelineType; - private pipelineId; - private projectId; - private projectName; - private environmentId; - private environmentDefinitionId; - private usePreviousEnvironment; - private teamUri; - private accessKey; - private testTabLink; - constructor($pipelineType: PipelineType, $pipelineId: number, $projectId: string, $projectName: string, $environmentId: number, $environmentDefinitionId: number, $usePreviousEnvironment: boolean, $teamUri: string, $accessKey: string); - /** - * Getter $pipelineId - * @return {number} - */ - get $pipelineType(): number; - /** - * Getter $pipelineId - * @return {number} - */ - get $pipelineId(): number; - /** - * Getter $projectId - * @return {string} - */ - get $projectId(): string; - /** - * Getter $projectName - * @return {string} - */ - get $projectName(): string; - /** - * Getter $environmentId - * @return {number} - */ - get $environmentId(): number; - /** - * Getter $environmentDefinitionId - * @return {number} - */ - get $environmentDefinitionId(): number; - /** - * Getter $usePreviousEnvironment - * @return {boolean} - */ - get $usePreviousEnvironment(): boolean; - /** - * Getter $teamUri - * @return {string} - */ - get $teamUri(): string; - /** - * Getter $accessKey - * @return {string} - */ - get $accessKey(): string; - getTestTabLink(): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.d.ts deleted file mode 100644 index 09b23178..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/pipeline/PipelineType.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare enum PipelineType { - Build = 0, - Release = 1 -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.d.ts deleted file mode 100644 index f5970674..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/GroupTestResultsBy.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export declare enum GroupTestResultsBy { - Priority = 0, - Run = 1, - Team = 2 -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.d.ts deleted file mode 100644 index afcfadd4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/ReportDataConfiguration.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { GroupTestResultsBy } from "./GroupTestResultsBy"; -import { TestResultsConfiguration } from "./TestResultsConfiguration"; -export declare class ReportDataConfiguration { - private includeCommits; - private includeOthersInTotal; - private includeEnvironmentInfo; - private groupTestSummaryBy; - private testResultsConfig; - constructor($includeCommits: boolean, $includeOthersInTotal: boolean, $includeEnvironmentInfo: boolean, $groupTestSummaryBy: GroupTestResultsBy[], $testResultsConfig: TestResultsConfiguration); - /** - * Getter $includeCommits - * @return {boolean} - */ - get $includeCommits(): boolean; - /** - * Getter $includeOthersInTotal - * @return {boolean} - */ - get $includeOthersInTotal(): boolean; - /** - * Getter $includeEnvironmentInfo - * @return {boolean} - */ - get $includeEnvironmentInfo(): boolean; - /** - * Getter $groupTestSummaryBy - * @return {GroupTestResultsBy[]} - */ - get $groupTestSummaryBy(): GroupTestResultsBy[]; - /** - * Getter $testResultsConfig - * @return {TestResultsConfiguration} - */ - get $testResultsConfig(): TestResultsConfiguration; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.d.ts deleted file mode 100644 index 81073e1f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/SendMailCondition.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare enum SendMailCondition { - Always = 0, - OnFailure = 1, - OnSuccess = 2, - OnNewFailuresOnly = 3 -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.d.ts deleted file mode 100644 index 0a73878c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/config/report/TestResultsConfiguration.d.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { GroupTestResultsBy } from "./GroupTestResultsBy"; -export declare class TestResultsConfiguration { - private includeFailedTests; - private includePassedTests; - private includeInconclusiveTests; - private includeNotExecutedTests; - private includeOtherTests; - private groupTestResultsBy; - private maxItemsToShow; - constructor($includeFailedTests: boolean, $includePassedTests: boolean, $includeInconclusiveTests: boolean, $includeNotExecutedTests: boolean, $includeOtherTests: boolean, $groupTestResultsBy: GroupTestResultsBy, $maxItemsToShow: number); - /** - * Getter $includeFailedTests - * @return {boolean} - */ - get $includeFailedTests(): boolean; - /** - * Getter $includePassedTests - * @return {boolean} - */ - get $includePassedTests(): boolean; - /** - * Getter $includeInconclusiveTests - * @return {boolean} - */ - get $includeInconclusiveTests(): boolean; - /** - * Getter $includeNotExecutedTests - * @return {boolean} - */ - get $includeNotExecutedTests(): boolean; - /** - * Getter $includeOtherTests - * @return {boolean} - */ - get $includeOtherTests(): boolean; - /** - * Getter $groupTestResultsBy - * @return {GroupTestResultsBy} - */ - get $groupTestResultsBy(): GroupTestResultsBy; - /** - * Getter $maxItemsToShow - * @return {number} - */ - get $maxItemsToShow(): number; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.d.ts deleted file mode 100644 index 9b6a8d92..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/DataProviderError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class DataProviderError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.d.ts deleted file mode 100644 index 808fd744..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InputError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class InputError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.d.ts deleted file mode 100644 index 9dfa8656..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/InvalidTestResultDataError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class InvalidTestResultDataError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.d.ts deleted file mode 100644 index 08659da2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MailError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class MailError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.d.ts deleted file mode 100644 index b4d47a5c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/MissingDataError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class MissingDataError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.d.ts deleted file mode 100644 index 9ab6105d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PipelineNotFoundError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class PipelineNotFoundError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.d.ts deleted file mode 100644 index 40ff69a1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/PostProcessorError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class PostProcessorError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.d.ts deleted file mode 100644 index aa924ae6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/exceptions/ReportError.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare abstract class ReportError extends Error { - innerError: any; - constructor(message: string); - getMessage(): string; - static HandleError(err: Error, rethrow?: boolean): void; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.d.ts deleted file mode 100644 index 9c4145c4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/HTMLReportCreator.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IHTMLReportCreator } from './IHTMLReportCreator'; -import { Report } from '../model/Report'; -import { ReportConfiguration } from '../config/ReportConfiguration'; -export declare class HTMLReportCreator implements IHTMLReportCreator { - createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.d.ts deleted file mode 100644 index 9ceab733..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/htmlreport/IHTMLReportCreator.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Report } from "../model/Report"; -import { ReportConfiguration } from "../config/ReportConfiguration"; -export interface IHTMLReportCreator { - createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.d.ts deleted file mode 100644 index a84f16d5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/BuildReport.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Build, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; -import { Report } from "./Report"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; -import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; -import { PhaseModel } from "./PhaseModel"; -import { ChangeModel } from "./ChangeModel"; -export declare class BuildReport extends Report { - private build; - private timeline; - private lastCompletedBuild; - private lastCompletedTimeline; - setBuildData($build: Build, $timeline: Timeline, $lastCompletedBuild: Build, $lastCompletedTimeline: Timeline, $phases: PhaseModel[], $changes: ChangeModel[]): void; - hasPrevGotSameFailures(): boolean; - hasFailedTasks(): boolean; - hasPrevFailedTasks(): boolean; - arePrevFailedTasksSame(): boolean; - getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; - getEnvironmentStatus(): string; - getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel; - getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; - hasCanceledPhases(): boolean; - private timelineHasFailedTasks; - private getTasksByResultinTimeline; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.d.ts deleted file mode 100644 index 72f457c1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ChangeModel.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; -export declare class ChangeModel { - private id; - private author; - private location; - private timeStamp; - private message; - constructor($id: string, $author: IdentityRef, $location: string, $timeStamp: Date, $message: string); - /** - * Getter $id - * @return {string} - */ - get $id(): string; - /** - * Getter $author - * @return {IdentityRef} - */ - get $author(): IdentityRef; - /** - * Getter $location - * @return {string} - */ - get $location(): string; - /** - * Getter $timeStamp - * @return {Date} - */ - get $timeStamp(): Date; - /** - * Getter $message - * @return {string} - */ - get $message(): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.d.ts deleted file mode 100644 index 11185df1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/IssueModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -export declare class IssueModel { - private message; - private issueType; - constructor($issueType: string, $message: string); - /** - * Getter $message - * @return {string} - */ - get $message(): string; - /** - * Getter $issueType - * @return {string} - */ - get $issueType(): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.d.ts deleted file mode 100644 index c9fd7b75..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/JobModel.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { TaskModel } from "./TaskModel"; -import { IssueModel } from "./IssueModel"; -export declare class JobModel { - private tasks; - private jobStatus; - private issues; - private jobName; - constructor($jobName: string, $jobStatus: TaskStatus, $issues: IssueModel[], $tasks: TaskModel[]); - /** - * Getter $jobName - * @return {string} - */ - get $jobName(): string; - /** - * Getter $issues - * @return {IssueModel[]} - */ - get $issues(): IssueModel[]; - /** - * Getter $tasks - * @return {TaskModel[]} - */ - get $tasks(): TaskModel[]; - /** - * Getter $jobStatus - * @return {TaskStatus} - */ - get $jobStatus(): TaskStatus; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.d.ts deleted file mode 100644 index d99f19bd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/PhaseModel.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { JobModel } from "./JobModel"; -export declare class PhaseModel { - private name; - private jobs; - private status; - private rank; - constructor($name: string, $jobs: JobModel[], $status: string, $rank: number); - /** - * Getter $name - * @return {string} - */ - get $name(): string; - /** - * Getter $jobs - * @return {JobModel[]} - */ - get $jobs(): JobModel[]; - /** - * Getter $status - * @return {string} - */ - get $status(): string; - /** - * Getter $rank - * @return {number} - */ - get $rank(): number; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.d.ts deleted file mode 100644 index 69da9784..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReleaseReport.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Report } from "./Report"; -import { Artifact, Release, ReleaseEnvironment, ReleaseTask } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { ChangeModel } from "./ChangeModel"; -import { PhaseModel } from "./PhaseModel"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; -import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; -export declare class ReleaseReport extends Report { - private artifacts; - private release; - private environment; - private lastCompletedRelease; - private lastCompletedEnvironment; - setReleaseData($release: Release, $environment: ReleaseEnvironment, $lastCompletedRelease: Release, $phases: PhaseModel[], $changes: ChangeModel[], $lastCompletedEnvironment?: ReleaseEnvironment): void; - /** - * Getter $artifacts - * @return {Artifact[]} - */ - get $artifacts(): Artifact[]; - /** - * Getter $release - * @return {Release} - */ - get $release(): Release; - /** - * Getter $environment - * @return {ReleaseEnvironment} - */ - get $environment(): ReleaseEnvironment; - /** - * Getter $lastCompletedRelease - * @return {Release} - */ - get $lastCompletedRelease(): Release; - /** - * Getter $lastCompletedEnvironment - * @return {ReleaseEnvironment} - */ - get $lastCompletedEnvironment(): ReleaseEnvironment; - hasPrevGotSameFailures(): boolean; - hasFailedTasks(): boolean; - hasPrevFailedTasks(): boolean; - arePrevFailedTasksSame(): boolean; - getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; - getEnvironmentStatus(): string; - private hasPartiallySucceededTasks; - hasCanceledPhases(): boolean; - getPipelineViewModel(config: PipelineConfiguration): ReleaseViewModel; - getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; - getReleaseTasks(source: ReleaseEnvironment): ReleaseTask[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.d.ts deleted file mode 100644 index 85204208..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/Report.d.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; -import { ChangeModel } from "./ChangeModel"; -import { PhaseModel } from "./PhaseModel"; -import { TestSummaryGroupModel } from "./testresults/TestSummaryGroupModel"; -import { TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { TestResultsGroupModel } from "./testresults/TestResultGroupModel"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; -import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; -import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; -export declare abstract class Report { - private dataMissing; - private sendMailConditionSatisfied; - createdBy: IdentityRef; - protected associatedChanges: ChangeModel[]; - protected phases: PhaseModel[]; - private failedTestOwners; - filteredResults: TestResultsGroupModel[]; - hasFilteredTests: boolean; - private testSummaryGroups; - testResultSummary: TestResultSummary; - /** - * Getter $dataMissing - * @return {boolean} - */ - get $dataMissing(): boolean; - /** - * Getter $associatedChanges - * @return {ChangeModel[]} - */ - get $associatedChanges(): ChangeModel[]; - /** - * Getter $associatedChanges - * @return {ChangeModel[]} - */ - get $phases(): PhaseModel[]; - /** - * Getter $sendMailConditionSatisfied - * @return {boolean} - */ - get $sendMailConditionSatisfied(): boolean; - /** - * Setter $dataMissing - * @param {boolean} value - */ - set $dataMissing(value: boolean); - /** - * Setter $sendMailConditionSatisfied - * @param {boolean} value - */ - set $sendMailConditionSatisfied(value: boolean); - /** - * Getter $testSummaryGroups - * @return {TestSummaryGroupModel[]} - */ - get $testSummaryGroups(): TestSummaryGroupModel[]; - /** - * Getter $failedTestOwners - * @return {IdentityRef[] } - */ - get $failedTestOwners(): IdentityRef[]; - abstract hasPrevGotSameFailures(): boolean; - abstract hasFailedTasks(): boolean; - abstract hasPrevFailedTasks(): boolean; - abstract arePrevFailedTasksSame(): boolean; - abstract getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; - abstract getEnvironmentStatus(): string; - abstract getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel | ReleaseViewModel; - abstract getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; - hasFailedTests(includeOthersInTotal: boolean): boolean; - private getTestCountForOutcome; - abstract hasCanceledPhases(): boolean; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.d.ts deleted file mode 100644 index f8335f5d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/ReportFactory.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ReleaseReport } from "./ReleaseReport"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { Report } from "./Report"; -import { BuildReport } from "./BuildReport"; -export declare class ReportFactory { - static createNewReport(pipelineConfig: PipelineConfiguration): ReleaseReport | BuildReport; - static mergeReports(reports: Report[]): Report; - private static mergeTwoReports; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.d.ts deleted file mode 100644 index 38981545..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/TaskModel.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { IssueModel } from "./IssueModel"; -export declare class TaskModel { - private name; - private status; - private issues; - private agentName; - private finishTime; - private startTime; - constructor($name: string, $status: TaskStatus, $issues: IssueModel[], $agentName: string, $finishTime: Date, $startTime: Date); - /** - * Getter $name - * @return {string} - */ - get $name(): string; - /** - * Getter $status - * @return {TaskStatus} - */ - get $status(): TaskStatus; - /** - * Getter $issues - * @return {IssueModel[]} - */ - get $issues(): IssueModel[]; - /** - * Getter $agentName - * @return {string} - */ - get $agentName(): string; - /** - * Getter $finishTime - * @return {Date} - */ - get $finishTime(): Date; - /** - * Getter $startTime - * @return {Date} - */ - get $startTime(): Date; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.d.ts deleted file mode 100644 index 72d5f999..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/LinkHelper.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestCaseResult } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class LinkHelper { - private static readonly TcmPipelineExtension; - private static readonly ReleaseProgressView; - private static readonly ReleaseDefView; - private static readonly ReleaseEnvironmentExtension; - private static readonly ReleaseEnvironmentLogsExtension; - private static readonly ReleaseLinkTestExtensionId; - private static readonly WorkItemPipelineExtension; - private static readonly BuildPipelineExtension; - static getBuildDefinitionLinkById(definitionId: any, config: PipelineConfiguration): string; - private static getBuildLink; - static getCommitLink(changeId: string, changeUri: string, config: PipelineConfiguration): string; - static getCreateBugLinkForTest(config: PipelineConfiguration, testResult: TestCaseResult): string; - static getQueryParameter(parameterValues: Map): string; - static getReleaseDefinitionLink(config: PipelineConfiguration, releaseDefinitionId: number): string; - static getReleaseLogsTabLink(config: PipelineConfiguration): string; - static getReleaseSummaryLink(config: PipelineConfiguration): string; - static getTestResultLink(config: PipelineConfiguration, runId: string, resultId: number, queryParams?: Map): string; - static getTestTabLinkInRelease(config: PipelineConfiguration): string; - static getWorkItemLink(config: PipelineConfiguration, workItemId: number): string; - private static getBuildRelativeUrl; - static getTestTabLinkInBuild(config: PipelineConfiguration): string; - private static getTcmRelativeUrl; - private static getWorkItemRelativeUrl; - static getTestTabLink(pipelineConfiguration: PipelineConfiguration): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.d.ts deleted file mode 100644 index 0173bac6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TestResultsHelper.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; -export declare class TestResultsHelper { - static readonly PercentagePrecision = 2; - static getTestOutcomePercentage(testCountForOutcome: number, totalTests: number): number; - private static getCustomizedDecimalValue; - static getTestOutcomePercentageString(testCountForOutcome: number, totalTests: number): string; - static getTotalTestCountBasedOnUserConfiguration(testCountsByOutcome: Map, includeOthersInTotal: boolean): number; - static getTotalTestCountBasedOnUserConfigurationPriority(testCountsByOutcome: Map, includeOthersInTotal: boolean): number; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.d.ts deleted file mode 100644 index c4e88503..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/helpers/TimeFormatter.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare class TimeFormatter { - static ConvertTimeStringToMilliSeconds(duration: string): number; - static FormatDuration(timeInMilliseconds: number): string; - static FormatDurationStr(timeStr: string): string; - private static getCombinedTimeString; - private static getTimeUnitString; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.d.ts deleted file mode 100644 index c2dbc46e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestOutcomeForPriority.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare enum TestOutcomeForPriority { - Failed = 0, - Inconclusive = 1, - NotExecuted = 2, - Passed = 3, - Other = 4 -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.d.ts deleted file mode 100644 index 097ec84b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultGroupModel.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { TestResultModel } from "./TestResultModel"; -import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultsGroupModel { - groupName: string; - testResults: Map; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.d.ts deleted file mode 100644 index ed658c8d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestResultModel.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TestCaseResult, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; -export declare class TestResultModel { - testResult: TestCaseResult; - associatedBugRefs: WorkItemReference[]; - associatedBugs: WorkItem[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.d.ts deleted file mode 100644 index d75cd7ec..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryGroupModel.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; -import { TestSummaryItemModel } from "./TestSummaryItemModel"; -export declare class TestSummaryGroupModel { - groupedBy: GroupTestResultsBy; - runs: TestSummaryItemModel[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.d.ts deleted file mode 100644 index d9a886e1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/testresults/TestSummaryItemModel.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { TestOutcomeForPriority } from "./TestOutcomeForPriority"; -import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestSummaryItemModel { - private name; - private id; - private totalTestCount; - private testCountByOutcome; - private testCountForOutcomeByPriority; - private duration; - constructor($name: string, $id: string); - /** - * Getter $name - * @return {string} - */ - get $name(): string; - /** - * Getter $id - * @return {string} - */ - get $id(): string; - /** - * Getter $totalTestCount - * @return {number} - */ - get $totalTestCount(): number; - /** - * Getter $testCountByOutcome - * @return {Map} - */ - get $testCountByOutcome(): Map; - /** - * Getter $testCountForOutcomeByPriority - * @return {Map} - */ - get $testCountForOutcomeByPriority(): Map>; - /** - * Getter $duration - * @return {any} - */ - get $duration(): number; - /** - * Setter $totalTestCount - * @param {number} value - */ - set $totalTestCount(value: number); - /** - * Setter $duration - * @param {any} value - */ - set $duration(value: number); - getFailedTestsCount(): number; - getOtherTestsCount(): number; - getPassedTestsCount(): number; - private getTestOutcomeCount; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.d.ts deleted file mode 100644 index 54340d1d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ArtifactViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Artifact } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export declare class ArtifactViewModelWrapper { - ArtifactViewModel: ArtifactViewModel[]; -} -export declare class ArtifactViewModel { - ArtifactDefinitionUrl: string; - BranchName: string; - BuildSummaryUrl: string; - Name: string; - Version: string; - IsPrimary: boolean; - constructor(artifact: Artifact, config: PipelineConfiguration); - private getArtifactInfo; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.d.ts deleted file mode 100644 index ec082909..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/BuildReferenceViewModel.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { BuildReference, Build } from "azure-devops-node-api/interfaces/BuildInterfaces"; -export declare class BuildReferenceViewModel { - Id: string; - Number: string; - Branch: string; - Url: string; - DefinitionUrl: string; - DefinitionName: string; - constructor(config: PipelineConfiguration, buildReference: BuildReference, build: Build); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.d.ts deleted file mode 100644 index af5beb94..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ChangeViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ChangeModel } from "../ChangeModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export declare class ChangeViewModelWrapper { - ChangeViewModel: ChangeViewModel[]; -} -export declare class ChangeViewModel { - readonly ConstHashLength = 8; - AuthorName: string; - Id: string; - Message: string; - TimeStamp: string; - Url: string; - ShortId: string; - constructor(change: ChangeModel, config: PipelineConfiguration); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.d.ts deleted file mode 100644 index 9ef5f238..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/DeploymentJobViewModel.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { JobModel } from "../JobModel"; -import { TaskResultViewModelWrapper } from "./TaskResultViewModel"; -export declare class DeploymentJobViewModel { - Tasks: TaskResultViewModelWrapper; - MinTaskStartTime: Date; - MaxTaskFinishTime: Date; - constructor(jobs: JobModel[]); - private getMinTime; - private getMaxTime; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.d.ts deleted file mode 100644 index bf616383..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/EmailReportViewModel.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Report } from "../Report"; -import { ReportConfiguration } from "../../config/ReportConfiguration"; -import { ReleaseViewModel } from "./ReleaseViewModel"; -import { PhaseViewModelWrapper } from "./PhaseViewModel"; -import { PhaseIssuesViewModel } from "./PhaseIssuesViewModel"; -import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; -import { ArtifactViewModelWrapper } from "./ArtifactViewModel"; -import { ChangeViewModelWrapper } from "./ChangeViewModel"; -import { TestSummaryGroupViewModelWrapper } from "./TestSummaryGroupViewModel"; -import { TestResultsGroupViewModelWrapper } from "./TestResultsGroupViewModel"; -export declare class EmailReportViewModel { - DataMissing: boolean; - HasTestResultsToShow: boolean; - HasFailedTests: boolean; - HasFilteredTests: boolean; - HasTaskFailures: boolean; - HasCanceledPhases: boolean; - MaxTestResultsToShow: number; - ProjectName: string; - Release: ReleaseViewModel; - Build: any; - Phases: PhaseViewModelWrapper; - PhaseIssuesSummary: PhaseIssuesViewModel; - AllTests: TestResultSummaryViewModel; - Artifacts: ArtifactViewModelWrapper; - AssociatedChanges: ChangeViewModelWrapper; - SummaryGroups: TestSummaryGroupViewModelWrapper; - TestResultsGroups: TestResultsGroupViewModelWrapper; - TestTabLink: string; - ShowAssociatedChanges: boolean; - constructor(report: Report, reportConfiguration: ReportConfiguration); - private InitializePhases; - private SetMailSubject; - private InitializeAssociatedChanges; - private InitializeSummaryGroupViewModel; - private InitializeTestResultGroups; - private GetPassPercentage; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.d.ts deleted file mode 100644 index def8692e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/MailAddressViewModel.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { MailConfiguration } from "../../config/mail/MailConfiguration"; -import { Report } from "../Report"; -export declare class MailAddressViewModel { - cc: string[]; - from: string; - to: string[]; - private defaultDomain; - constructor(report: Report, mailConfig: MailConfiguration); - private getMailAddresses; - private getFailedTestOwners; - private getActiveBugOwnersForFailedTests; - private getChangesetOwners; - private filterValidMailAddresses; - private getValidEmailAddress; - private isValidEmail; - private getMailAddressFromIdentityRef; - private getUniqueName; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.d.ts deleted file mode 100644 index 351ef469..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseIssuesViewModel.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TaskResultViewModelWrapper } from "./TaskResultViewModel"; -import { PhaseModel } from "../PhaseModel"; -export declare class PhaseIssuesViewModel { - Tasks: TaskResultViewModelWrapper; - Name: string; - constructor(phases: PhaseModel[]); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.d.ts deleted file mode 100644 index af1b7f7f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/PhaseViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { DeploymentJobViewModel } from "./DeploymentJobViewModel"; -import { PhaseModel } from "../PhaseModel"; -export declare class PhaseViewModelWrapper { - PhaseViewModel: PhaseViewModel[]; -} -export declare class PhaseViewModel { - DeploymentJob: DeploymentJobViewModel; - TasksDuration: string; - Status: string; - Rank: number; - Name: string; - constructor(phase: PhaseModel); - private InitializeDeploymentJobs; - private InitializeTasksDuration; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.d.ts deleted file mode 100644 index 2124209c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseEnvironmentViewModel.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -export declare class ReleaseEnvironmentViewModel { - EnvironmentName: string; - EnvironmentOwnerEmail: string; - constructor(environment: ReleaseEnvironment); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.d.ts deleted file mode 100644 index b777d56d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseReferenceViewModel.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReleaseReference } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -export declare class ReleaseReferenceViewModel { - Id: number; - Name: string; - Url: string; - constructor(config: PipelineConfiguration, releaseReference: ReleaseReference); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.d.ts deleted file mode 100644 index a17f897f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/ReleaseViewModel.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReleaseEnvironmentViewModel } from "./ReleaseEnvironmentViewModel"; -export declare class ReleaseViewModel { - CurrentEnvironment: ReleaseEnvironmentViewModel; - ReleaseDefinitionName: string; - ReleaseDefinitionUrl: string; - ReleaseId: number; - ReleaseName: string; - ReleaseSummaryUrl: string; - ReleaseLogsLink: string; - constructor(currentEnvironment: ReleaseEnvironment, releaseConfig: PipelineConfiguration); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.d.ts deleted file mode 100644 index 76748801..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueSummaryViewModel.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { TaskIssueViewModel, TaskIssueViewModelWrapper } from "./TaskIssueViewModel"; -import { TaskModel } from "../TaskModel"; -export declare class TaskIssueSummaryViewModel { - Issues: TaskIssueViewModelWrapper; - ErrorMessage: string; - ErrorCount: number; - WarningCount: number; - constructor(tasks: TaskModel[]); - TruncateIssues(issues: TaskIssueViewModel[], characterLimit?: number): TaskIssueViewModel[]; -} -export declare class IssueTypeConstants { - static readonly Error = "error"; - static readonly Warning = "warning"; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.d.ts deleted file mode 100644 index 4818465a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskIssueViewModel.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export declare class TaskIssueViewModelWrapper { - TaskIssueViewModel: TaskIssueViewModel[]; -} -export declare class TaskIssueViewModel { - Message: string; - IssueType: string; - AgentName: string; - constructor(issueMessage: string, issueType: string, agentName: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.d.ts deleted file mode 100644 index 7342ec72..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TaskResultViewModel.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { TaskIssueSummaryViewModel } from "./TaskIssueSummaryViewModel"; -import { TaskModel } from "../TaskModel"; -export declare class TaskResultViewModelWrapper { - TaskResultViewModel: TaskResultViewModel[]; -} -export declare class TaskResultViewModel { - Duration: string; - HasFailed: boolean; - HasSkipped: boolean; - NotYetRun: boolean; - HasPartiallySucceeded: boolean; - HasNotRunOnSomeAgents: boolean; - GotCancelled: boolean; - NotRunMessage: string; - IssuesSummary: TaskIssueSummaryViewModel; - Name: string; - StartTime: string; - Status: string; - constructor(tasks: TaskModel[]); - private InitializeDuration; - private getMinTime; - private getMaxTime; - private getTimeDiff; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.d.ts deleted file mode 100644 index 3e1c85ea..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestInfoByPriorityViewModel.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; -export declare class TestInfoByPriorityViewModelWrapper { - TestInfoByPriorityViewModel: TestInfoByPriorityViewModel[]; -} -export declare class TestInfoByPriorityViewModel { - Priority: number; - PassingRate: string; - TestCount: number; - constructor(priority: number, testCountByOutcome: Map, includeOthersInTotal: boolean); - private getPassingTestCountByOutcome; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.d.ts deleted file mode 100644 index 0743b369..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultSummaryViewModel.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultSummaryViewModel { - static readonly MaxSupportedPriority = 2; - Duration: string; - FailedTests: number; - OtherTests: number; - PassedTests: number; - PassingRate: string; - TotalTests: number; - Url: string; - constructor(summaryItemModel: TestSummaryItemModel, summary: TestResultSummary, pipelineConfiguration: PipelineConfiguration, includeOthersInTotal: boolean); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.d.ts deleted file mode 100644 index a6fc2fbd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultViewModel.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { WorkItemViewModelWrapper } from "./WorkItemViewModel"; -import { TestResultModel } from "../testresults/TestResultModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReleaseReferenceViewModel } from "./ReleaseReferenceViewModel"; -export declare class TestResultViewModelWrapper { - TestResultViewModel: TestResultViewModel[]; -} -export declare class TestResultViewModel { - private readonly StackTraceLineCount; - AssociatedBugs: WorkItemViewModelWrapper; - CreateBugLink: string; - Duration: string; - ErrorMessage: string; - FailingSinceBuild: any; - FailingSinceRelease: ReleaseReferenceViewModel; - FailingSinceTime: string; - Id: number; - Owner: string; - Priority: string; - StackTrace: string; - TestCaseTitle: string; - TestOutcome: string; - Url: string; - constructor(testResultModel: TestResultModel, config: PipelineConfiguration); - private InitializeAssociatedBugs; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.d.ts deleted file mode 100644 index cee07a69..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestResultsGroupViewModel.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TestResultViewModelWrapper } from "./TestResultViewModel"; -import { ReportConfiguration } from "../../config/ReportConfiguration"; -import { TestResultsGroupModel } from "../testresults/TestResultGroupModel"; -import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { TestResultModel } from "../testresults/TestResultModel"; -export declare class TestResultsGroupViewModelWrapper { - TestResultsGroupViewModel: TestResultsGroupViewModel[]; -} -export declare class TestResultsGroupViewModel { - FailedTests: TestResultViewModelWrapper; - GroupName: string; - OtherTests: TestResultViewModelWrapper; - PassedTests: TestResultViewModelWrapper; - constructor(resultsGroupModel: TestResultsGroupModel, reportConfig: ReportConfiguration); - private setGroupName; - private getTestResultViewModels; - getTestResultsByOutcomes(source: TestResultsGroupModel, outcomes: TestOutcome[]): TestResultModel[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.d.ts deleted file mode 100644 index 1883ea5b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryGroupViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TestSummaryGroupModel } from "../testresults/TestSummaryGroupModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestSummaryItemViewModelWrapper } from "./TestSummaryItemViewModel"; -export declare class TestSummaryGroupViewModelWrapper { - TestSummaryGroupViewModel: TestSummaryGroupViewModel[]; -} -export declare class TestSummaryGroupViewModel { - GroupName: string; - SummaryItems: TestSummaryItemViewModelWrapper; - private SupportedPriorityColumns; - constructor(testSummaryGroup: TestSummaryGroupModel, config: PipelineConfiguration, includeOthersInTotal: boolean); - private InitializeSummaryItems; - private InitializeSupportedPriorityColumns; - private getDescription; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.d.ts deleted file mode 100644 index b1d8c132..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/TestSummaryItemViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; -import { TestInfoByPriorityViewModelWrapper } from "./TestInfoByPriorityViewModel"; -import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; -export declare class TestSummaryItemViewModelWrapper { - TestSummaryItemViewModel: TestSummaryItemViewModel[]; -} -export declare class TestSummaryItemViewModel extends TestResultSummaryViewModel { - Name: string; - TestsByPriority: TestInfoByPriorityViewModelWrapper; - constructor(groupedBy: GroupTestResultsBy, summaryItem: TestSummaryItemModel, config: PipelineConfiguration, includeOthersInTotal: boolean); - private setupPriorityData; - getDisplayName(priority: string): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.d.ts deleted file mode 100644 index d4d1babd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/model/viewmodel/WorkItemViewModel.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export declare class WorkItemViewModelWrapper { - WorkItemViewModel: WorkItemViewModel[]; -} -export declare class WorkItemViewModel { - AssignedTo: string; - ChangedDate: string; - Id: number; - State: string; - Title: string; - Url: string; - constructor(config: PipelineConfiguration, workItem: WorkItem); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.d.ts deleted file mode 100644 index cefac9c4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/DataProviderFactory.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IDataProviderFactory } from "./IDataProviderFactory"; -import { IDataProvider } from "./IDataProvider"; -import { IPostProcessor } from "./IPostProcessor"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -export declare class DataProviderFactory implements IDataProviderFactory { - private pipelineConfig; - private dataProviders; - private postProcessors; - private testResultsClient; - constructor($pipelineConfig: PipelineConfiguration); - getDataProviders(): IDataProvider[]; - getPostProcessors(): IPostProcessor[]; - private getTestResultsClient; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.d.ts deleted file mode 100644 index bb18722d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProvider.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Report } from "../model/Report"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ReportDataConfiguration } from "../config/report/ReportDataConfiguration"; -export interface IDataProvider { - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.d.ts deleted file mode 100644 index a22567be..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IDataProviderFactory.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IDataProvider } from "./IDataProvider"; -import { IPostProcessor } from "./IPostProcessor"; -export interface IDataProviderFactory { - getDataProviders(): IDataProvider[]; - getPostProcessors(): IPostProcessor[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.d.ts deleted file mode 100644 index 0c1f4301..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IPostProcessor.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ReportConfiguration } from "../config/ReportConfiguration"; -import { Report } from "../model/Report"; -export interface IPostProcessor { - processReportAsync(reportConfig: ReportConfiguration, finalReport: Report): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.d.ts deleted file mode 100644 index 3a18e882..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/IReportProvider.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Report } from "../model/Report"; -import { ReportConfiguration } from "../config/ReportConfiguration"; -export interface IReportProvider { - createReportAsync(reportConfig: ReportConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.d.ts deleted file mode 100644 index 4707ea61..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/ReportProvider.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IReportProvider } from "./IReportProvider"; -import { ReportConfiguration } from "../config/ReportConfiguration"; -import { Report } from "../model/Report"; -import { IDataProviderFactory } from "./IDataProviderFactory"; -export declare class ReportProvider implements IReportProvider { - private dataProviders; - private postProcessors; - constructor(dataProviderFactory: IDataProviderFactory); - createReportAsync(reportConfig: ReportConfiguration): Promise; - private callDataProvider; - private callPostProcessor; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.d.ts deleted file mode 100644 index a1317cb3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/SendMailConditionProcessor.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IPostProcessor } from "./IPostProcessor"; -import { Report } from "../model/Report"; -import { ReportConfiguration } from "../config/ReportConfiguration"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ITestResultsClient } from "./restclients/ITestResultsClient"; -export declare class SendMailConditionProcessor implements IPostProcessor { - private testResultsClient; - private readonly TestResultFieldsToQuery; - constructor(testResultsClient: ITestResultsClient); - processReportAsync(reportConfig: ReportConfiguration, report: Report): Promise; - hasPreviousReleaseGotSameFailuresAsync(report: Report, config: PipelineConfiguration, hasTestFailures: boolean, hasFailedTasks: boolean): Promise; - private getFailureCountFromSummary; - private fetchFailedTestCaseIdsAsync; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.d.ts deleted file mode 100644 index 7e4dc619..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/AbstractTestResultsDetailsParser.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { TestResultsDetails, TestResultsDetailsForGroup } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; -export declare abstract class AbstractTestResultsDetailsParser { - protected testResultDetails: TestResultsDetails; - constructor(testResultDetails: TestResultsDetails); - abstract getSummaryItems(): Array; - abstract getGroupByValue(group: TestResultsDetailsForGroup): string; - protected parseBaseData(resultsForGroup: TestResultsDetailsForGroup, summaryItem: TestSummaryItemModel): void; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.d.ts deleted file mode 100644 index 78c07e95..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserFactory.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; -import { TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultDetailsParserFactory { - static getParser(resultDetails: TestResultsDetails): AbstractTestResultsDetailsParser; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.d.ts deleted file mode 100644 index 9844cd01..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForPriority.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; -import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; -import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser { - constructor(testResultDetails: TestResultsDetails); - getSummaryItems(): TestSummaryItemModel[]; - getGroupByValue(group: TestResultsDetailsForGroup): string; - getTestResultsForRun(runId: number): Map; - private getPriority; - private getTestCountByPriorityInTestRun; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.d.ts deleted file mode 100644 index db1b8ead..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/helpers/TestResultDetailsParserForRun.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; -import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; -import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser { - constructor(testResultDetails: TestResultsDetails); - getSummaryItems(): TestSummaryItemModel[]; - getGroupByValue(group: TestResultsDetailsForGroup): string; - private getTestRunSummaryInfo; - private readGroupByValue; -} -export declare class TestRunInfo { - id: number; - name: string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.d.ts deleted file mode 100644 index eaf08ab5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/BuildDataProvider.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { Report } from "../../model/Report"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; -export declare class BuildDataProvider implements IDataProvider { - private pipelineRestClient; - constructor(pipelineRestClient: IPipelineRestClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; - private getBuildAsync; - private getPhases; - private getTaskState; - private getOrder; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.d.ts deleted file mode 100644 index 6a0c5de3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/pipeline/ReleaseDataProvider.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { Report } from "../../model/Report"; -import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -export declare class ReleaseDataProvider implements IDataProvider { - private pipelineRestClient; - constructor(pipelineRestClient: IPipelineRestClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; - private getReleaseAsync; - private getEnvironment; - private getPhases; - private getJobModelsFromPhase; - private getReleaseByLastCompletedEnvironmentAsync; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.d.ts deleted file mode 100644 index d47f0af1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractClient.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { WebApi } from "azure-devops-node-api"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export declare abstract class AbstractClient { - protected connection: WebApi; - protected pipelineConfig: PipelineConfiguration; - constructor(pipelineConfig: PipelineConfiguration); - /** - * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api - * @param uri Default URL - * @param accessToken token to get credentials with access to Api calls - */ - private createConnection; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.d.ts deleted file mode 100644 index 60e99da5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/AbstractTestResultsClient.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { AbstractClient } from "./AbstractClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ITestApi } from "azure-devops-node-api/TestApi"; -import { TestResultsDetails, TestResultSummary, TestOutcome, TestResultsQuery, TestCaseResult, ResultsFilter, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { ITestResultsClient } from "./ITestResultsClient"; -import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; -export declare abstract class AbstractTestResultsClient extends AbstractClient implements ITestResultsClient { - private readonly MaxItemsSupported; - protected testApiPromise: Promise; - constructor(pipelineConfig: PipelineConfiguration); - queryTestResultBugs(automatedTestName: string, resultId: number): Promise; - getTestResultById(testRunId: number, resultId: number): Promise; - queryTestResultsReportAsync(parameterConfig?: PipelineConfiguration): Promise; - getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; - getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], parameterConfig?: PipelineConfiguration): Promise; - getTestResultSummaryAsync(includeFailures: boolean, parameterConfig?: PipelineConfiguration): Promise; - getTestResultsByQueryAsync(query: TestResultsQuery): Promise; - protected abstract getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; - protected abstract queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; - protected getOutcomeFilter(outcomes: TestOutcome[]): string; - private getUniqueName; - private isValid; -} -export declare class TestResultsQueryImpl implements TestResultsQuery { - fields: string[]; - results: TestCaseResult[]; - resultsFilter: ResultsFilter; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.d.ts deleted file mode 100644 index 453a236e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildClient.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IPipelineRestClient } from "./IPipelineRestClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { Build, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; -import { ChangeModel } from "../../model/ChangeModel"; -import { AbstractClient } from "./AbstractClient"; -export declare class BuildRestClient extends AbstractClient implements IPipelineRestClient { - private buildApi; - constructor(pipelineConfig: PipelineConfiguration); - getPipelineAsync(): Promise; - getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; - getPipelineChangesAsync(prevPipelineId: number): Promise; - getPipelineTimelineAsync(pipelineId: number): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.d.ts deleted file mode 100644 index f7811c61..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/BuildTestResultsClient.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { ITestResultsClient } from "./ITestResultsClient"; -import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; -export declare class BuildTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { - constructor(pipelineConfig: PipelineConfiguration); - queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; - getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.d.ts deleted file mode 100644 index ed7a5b4d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IPipelineRestClient.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; -import { ChangeModel } from "../../model/ChangeModel"; -export interface IPipelineRestClient { - getPipelineAsync(): Promise; - getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; - getPipelineChangesAsync(prevPipelineId: number): Promise; - getPipelineTimelineAsync(pipelineId: number): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.d.ts deleted file mode 100644 index 74404ca3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ITestResultsClient.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestResultsDetails, TestResultSummary, TestOutcome, TestCaseResult, WorkItemReference, TestResultsQuery } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export interface ITestResultsClient { - queryTestResultBugs(automatedTestName: string, resultId: number): Promise; - getTestResultById(testRunId: number, resultId: number): Promise; - queryTestResultsReportAsync(config?: PipelineConfiguration): Promise; - getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; - getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], config?: PipelineConfiguration): Promise; - getTestResultSummaryAsync(includeFailures: boolean, config?: PipelineConfiguration): Promise; - getTestResultsByQueryAsync(query: TestResultsQuery): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.d.ts deleted file mode 100644 index 28259330..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/IWorkItemClient.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; -export interface IWorkItemClient { - getWorkItemsAsync(workItemIds: number[]): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.d.ts deleted file mode 100644 index a40b9e67..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseClient.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Release } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { AbstractClient } from "./AbstractClient"; -import { IPipelineRestClient } from "./IPipelineRestClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ChangeModel } from "../../model/ChangeModel"; -export declare class ReleaseRestClient extends AbstractClient implements IPipelineRestClient { - constructor(pipelineConfig: PipelineConfiguration); - getPipelineAsync(): Promise; - getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; - getPipelineChangesAsync(prevPipelineId: number): Promise; - getPipelineTimelineAsync(pipelineId: number): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.d.ts deleted file mode 100644 index 4aa8b06e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/ReleaseTestResultsClient.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { ITestResultsClient } from "./ITestResultsClient"; -import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; -export declare class ReleaseTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { - constructor(pipelineConfig: PipelineConfiguration); - queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; - getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.d.ts deleted file mode 100644 index 2237a73c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/RetryablePromise.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare class RetryablePromise { - private static defaultRetryCount; - static RetryAsync(executor: () => Promise, executorName: string, times?: number): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.d.ts deleted file mode 100644 index 1283d408..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/restclients/WorkItemClient.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AbstractClient } from "./AbstractClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { IWorkItemClient } from "./IWorkItemClient"; -import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; -export declare class WorkItemClient extends AbstractClient implements IWorkItemClient { - private workApiPromise; - constructor(pipelineConfig: PipelineConfiguration); - getWorkItemsAsync(workItemIds: number[]): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.d.ts deleted file mode 100644 index a7c5ae6c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TcmHelper.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { TestOutcome, TestCaseResult, CustomTestField } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TcmHelper { - static readonly OutcomeConfidenceValue: Number; - static exceptOutcomes(outcomesToExclude: TestOutcome[]): TestOutcome[]; - static parseOutcome(outcomeString: string): TestOutcome; - static isTestFlaky(result: TestCaseResult): boolean; - static getCustomField(result: TestCaseResult, fieldName: string): CustomTestField; - static Merge(source: Array>): T[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.d.ts deleted file mode 100644 index 46e1f987..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestOwnersDataProvider.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { Report } from "../../model/Report"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -import { ITestResultsClient } from "../restclients/ITestResultsClient"; -export declare class TestOwnersDataProvider implements IDataProvider { - private testResultsClient; - constructor(testResultsClient: ITestResultsClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.d.ts deleted file mode 100644 index daee1718..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestResultsDataProvider.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { Report } from "../../model/Report"; -import { ITestResultsClient } from "../restclients/ITestResultsClient"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -import { IWorkItemClient } from "../restclients/IWorkItemClient"; -export declare class TestResultsDataProvider implements IDataProvider { - private testResultsClient; - private workItemClient; - constructor(testResultsClient: ITestResultsClient, workItemClient: IWorkItemClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise; - private setFilteredTestResults; - private getTestResultsWithWorkItems; - private getTestResultsForResultsGroupWithWorkItemsAsync; - private getWorkItemsAsync; - private getTestResultsWithBugRefs; - private filterTestResults; - private getIncludedOutcomes; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.d.ts deleted file mode 100644 index 9e3f97cc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/providers/tcmproviders/TestSummaryDataProvider.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { Report } from "../../model/Report"; -import { ITestResultsClient } from "../restclients/ITestResultsClient"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -export declare class TestSummaryDataProvider implements IDataProvider { - private testResultsClient; - constructor(testResultsClient: ITestResultsClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; - private getTestSummaryByPriorityAsync; - private getTestRunSummaryWithPriorityAsync; - private getSummaryByRun; - private getTestSummaryDataByPriorityAsync; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.d.ts deleted file mode 100644 index 103d2e9d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/telemetry/TelemetryLogger.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ReportConfiguration } from "../config/ReportConfiguration"; -export declare class TelemetryLogger { - static readonly TELEMETRY_LINE = "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; - private static instance; - private static reportConfig; - /** - * Formats and sends all telemetry collected to be published - */ - static LogTaskConfig(reportConfiguration: ReportConfiguration): void; - static LogModulePerf(moduleName: string, timeTaken: number, numRetries?: Number): void; - /** - * Publishes an object as a string as telemetry - * @param telemetryToLog Object to be logged as a string - */ - private static logTelemetry; - static InvokeWithPerfLogger(executor: () => Promise, executorName: string): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.d.ts deleted file mode 100644 index a95ad04b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__e_to_e_tests__/InvokeTest.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IConfigurationProvider } from "../../config/IConfigurationProvider"; -import { SendMailCondition } from "../../config/report/SendMailCondition"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { MailConfiguration } from "../../config/mail/MailConfiguration"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -export declare class FileWriter { - static writeToFile(content: string, fileName: string): void; -} -export declare class MockConfigProvider implements IConfigurationProvider { - getPipelineConfiguration(): PipelineConfiguration; - getMailConfiguration(): MailConfiguration; - getReportDataConfiguration(): ReportDataConfiguration; - getSendMailCondition(): SendMailCondition; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/tests/__tests__/ReportManagerTests.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.d.ts deleted file mode 100644 index 0199d3d5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/DisplayNameHelper.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class DisplayNameHelper { - static getPriorityDisplayName(priority: string): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.d.ts deleted file mode 100644 index c233622f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnumUtils.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SendMailCondition } from "../config/report/SendMailCondition"; -import { GroupTestResultsBy } from "../config/report/GroupTestResultsBy"; -export declare class EnumUtils { - static GetMailConditionString(condition: SendMailCondition): string; - static GetGroupTestResultsByString(condition: GroupTestResultsBy): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.d.ts deleted file mode 100644 index 6e9dd614..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/EnvironmentExtensions.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReleaseDeployPhase, ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -export declare class EnvironmentExtensions { - static getPhases(environment: ReleaseEnvironment): Array; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.d.ts deleted file mode 100644 index ca46ba16..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV1/utils/StringUtils.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare class StringUtils { - static isNullOrWhiteSpace(input: string): boolean; - static CompressNewLines(content: string): string; - private static getNonEmptyLines; - static ReplaceNewlineWithBrTag(content: string): string; - static getFirstNLines(content: string, lineCount: number): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.d.ts deleted file mode 100644 index 15ea15d1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/EmailSender.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IReportSender } from "./IReportSender"; -import { MailConfiguration } from "./config/mail/MailConfiguration"; -import { Report } from "./model/Report"; -export declare class EmailSender implements IReportSender { - sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; - private sendMailAsync; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.d.ts deleted file mode 100644 index f5cd6ac2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/IReportSender.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Report } from "./model/Report"; -import { MailConfiguration } from "./config/mail/MailConfiguration"; -export interface IReportSender { - sendReportAsync(report: Report, htmlReportMessage: string, mailConfiguration: MailConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.d.ts deleted file mode 100644 index 7eca7eed..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/ReportManager.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IReportProvider } from "./providers/IReportProvider"; -import { ReportConfiguration } from "./config/ReportConfiguration"; -import { IReportSender } from "./IReportSender"; -import { IHTMLReportCreator } from "./htmlreport/IHTMLReportCreator"; -export declare class ReportManager { - private reportProvider; - private reportSender; - private htmlReportCreator; - constructor(reportProvider: IReportProvider, htmlReportCreator: IHTMLReportCreator, reportSender: IReportSender); - sendReportAsync(reportConfig: ReportConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.d.ts deleted file mode 100644 index 8ca4269d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ConfigurationProvider.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { IConfigurationProvider } from "./IConfigurationProvider"; -import { SendMailCondition } from "./report/SendMailCondition"; -import { MailConfiguration } from "./mail/MailConfiguration"; -import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; -import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; -export declare class ConfigurationProvider implements IConfigurationProvider { - private pipelineConfiguration; - private mailConfiguration; - private reportDataConfiguration; - private sendMailCondition; - constructor(); - getPipelineConfiguration(): PipelineConfiguration; - getMailConfiguration(): MailConfiguration; - getReportDataConfiguration(): ReportDataConfiguration; - getSendMailCondition(): SendMailCondition; - /** - * Gets access token from system - */ - private getAccessKey; - private initPipelineConfiguration; - private initMailConfiguration; - private initReportDataConfiguration; - initSendMailCondition(): void; - private getRecipientConfiguration; - private getGroupTestResultsByEnumFromString; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.d.ts deleted file mode 100644 index df19ee31..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/IConfigurationProvider.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SendMailCondition } from "./report/SendMailCondition"; -import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; -import { MailConfiguration } from "./mail/MailConfiguration"; -import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; -export interface IConfigurationProvider { - getPipelineConfiguration(): PipelineConfiguration; - getMailConfiguration(): MailConfiguration; - getReportDataConfiguration(): ReportDataConfiguration; - getSendMailCondition(): SendMailCondition; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.d.ts deleted file mode 100644 index 26b2dde4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/ReportConfiguration.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { MailConfiguration } from "./mail/MailConfiguration"; -import { ReportDataConfiguration } from "./report/ReportDataConfiguration"; -import { IConfigurationProvider } from "./IConfigurationProvider"; -import { PipelineConfiguration } from "./pipeline/PipelineConfiguration"; -import { SendMailCondition } from "./report/SendMailCondition"; -export declare class ReportConfiguration { - private sendMailCondition; - private mailConfiguration; - private reportDataConfiguration; - private pipelineConfiguration; - constructor(configProvider: IConfigurationProvider); - validateConfiguration(): void; - private validateMailConfig; - get $sendMailCondition(): SendMailCondition; - get $mailConfiguration(): MailConfiguration; - get $reportDataConfiguration(): ReportDataConfiguration; - get $pipelineConfiguration(): PipelineConfiguration; - private throwError; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.d.ts deleted file mode 100644 index d88a6fb3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/TaskConstants.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -export declare class TaskConstants { - static readonly SUBJECT_INPUTKEY = "subject"; - static readonly SENDMAILCONDITION_INPUTKEY = "sendMailConditionConfig"; - static readonly INCLUDECOMMITS_INPUTKEY = "includeCommits"; - static readonly GROUPTESTRESULTSBY_INPUTKEY = "groupTestResultsBy"; - static readonly INCLUDEOTHERSINTOTAL_INPUTKEY = "includeOthersInTotal"; - static readonly MAXTESTFAILURESTOSHOW_INPUTKEY = "maxTestFailuresToShow"; - static readonly GROUPTESTSUMMARYBY_INPUTKEY = "groupTestSummaryByStr"; - static readonly INCLUDERESULTS_INPUTKEY = "includeResultsStr"; - static readonly TOADDRESS_INPUTKEY = "toAddress"; - static readonly CCADDRESS_INPUTKEY = "ccAddress"; - static readonly INCLUDEINTO_INPUTKEY = "includeInToSectionStr"; - static readonly INCLUDEINCC_INPUTKEY = "includeInCcSectionStr"; - static readonly SMTPCONNECTION_INPUTKEY = "smtpConnectionEndpoint"; - static readonly ENABLETLS_INPUTKEY = "enableSSLOnSmtpConnection"; - static readonly USEPREVENV_INPUTKEY = "usePreviousEnvironment"; - static readonly DEFAULTDOMAIN_INPUTKEY = "defaultDomain"; - static readonly TEAM_FOUNDATION_KEY: string; - static readonly VSS_CONNECTION_KEY: string; - static readonly ACCESS_PARAMETER: string; - static readonly PROJECTNAME_KEY: string; - static readonly PROJECTID_KEY: string; - static readonly BUILD_ID_KEY: string; - static readonly RELEASE_ID_KEY: string; - static readonly HOST_KEY: string; - static readonly ENVIRONMENTID_KEY: string; - static readonly ENVIRONMENTDEFID_KEY: string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.d.ts deleted file mode 100644 index dee79830..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/MailConfiguration.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { RecipientsConfiguration } from "./RecipientsConfiguration"; -import { SmtpConfiguration } from "./SmtpConfiguration"; -export declare class MailConfiguration { - private mailSubject; - private toRecipientsConfig; - private ccRecipientsConfig; - private smtpConfig; - private defaultDomain; - constructor($mailSubject: string, $toRecipientsConfig: RecipientsConfiguration, $ccRecipientsConfig: RecipientsConfiguration, $smtpConfig: SmtpConfiguration, $defaultDomain: string); - /** - * Getter $defaultDomain - * @return {string} - */ - get $defaultDomain(): string; - /** - * Getter $mailSubject - * @return {string} - */ - get $mailSubject(): string; - /** - * Getter $ccRecipientsConfig - * @return {RecipientsConfiguration} - */ - get $ccRecipientsConfig(): RecipientsConfiguration; - /** - * Getter $smtpConfig - * @return {SmtpConfiguration} - */ - get $smtpConfig(): SmtpConfiguration; - /** - * Getter $toRecipientsConfig - * @return {RecipientsConfiguration} - */ - get $toRecipientsConfig(): RecipientsConfiguration; - /** - * Setter $mailSubject - * @param {string} value - */ - set $mailSubject(value: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.d.ts deleted file mode 100644 index 5b3d30ce..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/RecipientsConfiguration.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -export declare class RecipientsConfiguration { - private defaultRecipients; - private includeChangesetOwners; - private includeTestOwners; - private includeActiveBugOwners; - private includeCreatedBy; - constructor($defaultRecipients: string, $includeChangesetOwners?: boolean, $includeTestOwners?: boolean, $includeActiveBugOwners?: boolean, $includeCreatedBy?: boolean); - /** - * Getter $defaultRecipients - * @return {string} - */ - get $defaultRecipients(): string; - /** - * Getter $includeChangesetOwners - * @return {boolean} - */ - get $includeChangesetOwners(): boolean; - /** - * Getter $includeTestOwners - * @return {boolean} - */ - get $includeTestOwners(): boolean; - /** - * Getter $includeActiveBugOwners - * @return {boolean} - */ - get $includeActiveBugOwners(): boolean; - /** - * Getter $includeCreatedBy - * @return {boolean} - */ - get $includeCreatedBy(): boolean; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.d.ts deleted file mode 100644 index 3d9e3705..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/mail/SmtpConfiguration.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -export declare class SmtpConfiguration { - private userName; - private password; - private smtpHost; - private enableTLS; - constructor($userName: string, $password: string, $smtpHost: string, $enableTLS: boolean); - /** - * Getter $userName - * @return {string} - */ - get $userName(): string; - /** - * Getter $password - * @return {string} - */ - get $password(): string; - /** - * Getter $smtpHost - * @return {string} - */ - get $smtpHost(): string; - /** - * Getter $enableSSL - * @return {boolean} - */ - get $enableTLS(): boolean; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.d.ts deleted file mode 100644 index f5d5457a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineConfiguration.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { PipelineType } from "./PipelineType"; -export declare class PipelineConfiguration { - private pipelineType; - private pipelineId; - private projectId; - private projectName; - private environmentId; - private environmentDefinitionId; - private usePreviousEnvironment; - private teamUri; - private accessKey; - private testTabLink; - constructor($pipelineType: PipelineType, $pipelineId: number, $projectId: string, $projectName: string, $environmentId: number, $environmentDefinitionId: number, $usePreviousEnvironment: boolean, $teamUri: string, $accessKey: string); - /** - * Getter $pipelineId - * @return {number} - */ - get $pipelineType(): number; - /** - * Getter $pipelineId - * @return {number} - */ - get $pipelineId(): number; - /** - * Getter $projectId - * @return {string} - */ - get $projectId(): string; - /** - * Getter $projectName - * @return {string} - */ - get $projectName(): string; - /** - * Getter $environmentId - * @return {number} - */ - get $environmentId(): number; - /** - * Getter $environmentDefinitionId - * @return {number} - */ - get $environmentDefinitionId(): number; - /** - * Getter $usePreviousEnvironment - * @return {boolean} - */ - get $usePreviousEnvironment(): boolean; - /** - * Getter $teamUri - * @return {string} - */ - get $teamUri(): string; - /** - * Getter $accessKey - * @return {string} - */ - get $accessKey(): string; - getTestTabLink(): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.d.ts deleted file mode 100644 index 09b23178..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/pipeline/PipelineType.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare enum PipelineType { - Build = 0, - Release = 1 -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.d.ts deleted file mode 100644 index f5970674..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/GroupTestResultsBy.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export declare enum GroupTestResultsBy { - Priority = 0, - Run = 1, - Team = 2 -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.d.ts deleted file mode 100644 index afcfadd4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/ReportDataConfiguration.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { GroupTestResultsBy } from "./GroupTestResultsBy"; -import { TestResultsConfiguration } from "./TestResultsConfiguration"; -export declare class ReportDataConfiguration { - private includeCommits; - private includeOthersInTotal; - private includeEnvironmentInfo; - private groupTestSummaryBy; - private testResultsConfig; - constructor($includeCommits: boolean, $includeOthersInTotal: boolean, $includeEnvironmentInfo: boolean, $groupTestSummaryBy: GroupTestResultsBy[], $testResultsConfig: TestResultsConfiguration); - /** - * Getter $includeCommits - * @return {boolean} - */ - get $includeCommits(): boolean; - /** - * Getter $includeOthersInTotal - * @return {boolean} - */ - get $includeOthersInTotal(): boolean; - /** - * Getter $includeEnvironmentInfo - * @return {boolean} - */ - get $includeEnvironmentInfo(): boolean; - /** - * Getter $groupTestSummaryBy - * @return {GroupTestResultsBy[]} - */ - get $groupTestSummaryBy(): GroupTestResultsBy[]; - /** - * Getter $testResultsConfig - * @return {TestResultsConfiguration} - */ - get $testResultsConfig(): TestResultsConfiguration; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.d.ts deleted file mode 100644 index 81073e1f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/SendMailCondition.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare enum SendMailCondition { - Always = 0, - OnFailure = 1, - OnSuccess = 2, - OnNewFailuresOnly = 3 -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.d.ts deleted file mode 100644 index 0a73878c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/config/report/TestResultsConfiguration.d.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { GroupTestResultsBy } from "./GroupTestResultsBy"; -export declare class TestResultsConfiguration { - private includeFailedTests; - private includePassedTests; - private includeInconclusiveTests; - private includeNotExecutedTests; - private includeOtherTests; - private groupTestResultsBy; - private maxItemsToShow; - constructor($includeFailedTests: boolean, $includePassedTests: boolean, $includeInconclusiveTests: boolean, $includeNotExecutedTests: boolean, $includeOtherTests: boolean, $groupTestResultsBy: GroupTestResultsBy, $maxItemsToShow: number); - /** - * Getter $includeFailedTests - * @return {boolean} - */ - get $includeFailedTests(): boolean; - /** - * Getter $includePassedTests - * @return {boolean} - */ - get $includePassedTests(): boolean; - /** - * Getter $includeInconclusiveTests - * @return {boolean} - */ - get $includeInconclusiveTests(): boolean; - /** - * Getter $includeNotExecutedTests - * @return {boolean} - */ - get $includeNotExecutedTests(): boolean; - /** - * Getter $includeOtherTests - * @return {boolean} - */ - get $includeOtherTests(): boolean; - /** - * Getter $groupTestResultsBy - * @return {GroupTestResultsBy} - */ - get $groupTestResultsBy(): GroupTestResultsBy; - /** - * Getter $maxItemsToShow - * @return {number} - */ - get $maxItemsToShow(): number; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.d.ts deleted file mode 100644 index 9b6a8d92..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/DataProviderError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class DataProviderError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.d.ts deleted file mode 100644 index 808fd744..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InputError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class InputError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.d.ts deleted file mode 100644 index 9dfa8656..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/InvalidTestResultDataError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class InvalidTestResultDataError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.d.ts deleted file mode 100644 index 08659da2..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MailError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class MailError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.d.ts deleted file mode 100644 index b4d47a5c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/MissingDataError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class MissingDataError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.d.ts deleted file mode 100644 index 9ab6105d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PipelineNotFoundError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class PipelineNotFoundError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.d.ts deleted file mode 100644 index 40ff69a1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/PostProcessorError.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReportError } from "./ReportError"; -export declare class PostProcessorError extends ReportError { - constructor(message: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.d.ts deleted file mode 100644 index aa924ae6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/exceptions/ReportError.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare abstract class ReportError extends Error { - innerError: any; - constructor(message: string); - getMessage(): string; - static HandleError(err: Error, rethrow?: boolean): void; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.d.ts deleted file mode 100644 index 9c4145c4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/HTMLReportCreator.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IHTMLReportCreator } from './IHTMLReportCreator'; -import { Report } from '../model/Report'; -import { ReportConfiguration } from '../config/ReportConfiguration'; -export declare class HTMLReportCreator implements IHTMLReportCreator { - createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.d.ts deleted file mode 100644 index 9ceab733..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/htmlreport/IHTMLReportCreator.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Report } from "../model/Report"; -import { ReportConfiguration } from "../config/ReportConfiguration"; -export interface IHTMLReportCreator { - createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.d.ts deleted file mode 100644 index a84f16d5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/BuildReport.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Build, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; -import { Report } from "./Report"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; -import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; -import { PhaseModel } from "./PhaseModel"; -import { ChangeModel } from "./ChangeModel"; -export declare class BuildReport extends Report { - private build; - private timeline; - private lastCompletedBuild; - private lastCompletedTimeline; - setBuildData($build: Build, $timeline: Timeline, $lastCompletedBuild: Build, $lastCompletedTimeline: Timeline, $phases: PhaseModel[], $changes: ChangeModel[]): void; - hasPrevGotSameFailures(): boolean; - hasFailedTasks(): boolean; - hasPrevFailedTasks(): boolean; - arePrevFailedTasksSame(): boolean; - getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; - getEnvironmentStatus(): string; - getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel; - getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; - hasCanceledPhases(): boolean; - private timelineHasFailedTasks; - private getTasksByResultinTimeline; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.d.ts deleted file mode 100644 index 72f457c1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ChangeModel.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; -export declare class ChangeModel { - private id; - private author; - private location; - private timeStamp; - private message; - constructor($id: string, $author: IdentityRef, $location: string, $timeStamp: Date, $message: string); - /** - * Getter $id - * @return {string} - */ - get $id(): string; - /** - * Getter $author - * @return {IdentityRef} - */ - get $author(): IdentityRef; - /** - * Getter $location - * @return {string} - */ - get $location(): string; - /** - * Getter $timeStamp - * @return {Date} - */ - get $timeStamp(): Date; - /** - * Getter $message - * @return {string} - */ - get $message(): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.d.ts deleted file mode 100644 index 11185df1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/IssueModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -export declare class IssueModel { - private message; - private issueType; - constructor($issueType: string, $message: string); - /** - * Getter $message - * @return {string} - */ - get $message(): string; - /** - * Getter $issueType - * @return {string} - */ - get $issueType(): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.d.ts deleted file mode 100644 index c9fd7b75..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/JobModel.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { TaskModel } from "./TaskModel"; -import { IssueModel } from "./IssueModel"; -export declare class JobModel { - private tasks; - private jobStatus; - private issues; - private jobName; - constructor($jobName: string, $jobStatus: TaskStatus, $issues: IssueModel[], $tasks: TaskModel[]); - /** - * Getter $jobName - * @return {string} - */ - get $jobName(): string; - /** - * Getter $issues - * @return {IssueModel[]} - */ - get $issues(): IssueModel[]; - /** - * Getter $tasks - * @return {TaskModel[]} - */ - get $tasks(): TaskModel[]; - /** - * Getter $jobStatus - * @return {TaskStatus} - */ - get $jobStatus(): TaskStatus; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.d.ts deleted file mode 100644 index d99f19bd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/PhaseModel.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { JobModel } from "./JobModel"; -export declare class PhaseModel { - private name; - private jobs; - private status; - private rank; - constructor($name: string, $jobs: JobModel[], $status: string, $rank: number); - /** - * Getter $name - * @return {string} - */ - get $name(): string; - /** - * Getter $jobs - * @return {JobModel[]} - */ - get $jobs(): JobModel[]; - /** - * Getter $status - * @return {string} - */ - get $status(): string; - /** - * Getter $rank - * @return {number} - */ - get $rank(): number; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.d.ts deleted file mode 100644 index 69da9784..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReleaseReport.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Report } from "./Report"; -import { Artifact, Release, ReleaseEnvironment, ReleaseTask } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { ChangeModel } from "./ChangeModel"; -import { PhaseModel } from "./PhaseModel"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; -import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; -export declare class ReleaseReport extends Report { - private artifacts; - private release; - private environment; - private lastCompletedRelease; - private lastCompletedEnvironment; - setReleaseData($release: Release, $environment: ReleaseEnvironment, $lastCompletedRelease: Release, $phases: PhaseModel[], $changes: ChangeModel[], $lastCompletedEnvironment?: ReleaseEnvironment): void; - /** - * Getter $artifacts - * @return {Artifact[]} - */ - get $artifacts(): Artifact[]; - /** - * Getter $release - * @return {Release} - */ - get $release(): Release; - /** - * Getter $environment - * @return {ReleaseEnvironment} - */ - get $environment(): ReleaseEnvironment; - /** - * Getter $lastCompletedRelease - * @return {Release} - */ - get $lastCompletedRelease(): Release; - /** - * Getter $lastCompletedEnvironment - * @return {ReleaseEnvironment} - */ - get $lastCompletedEnvironment(): ReleaseEnvironment; - hasPrevGotSameFailures(): boolean; - hasFailedTasks(): boolean; - hasPrevFailedTasks(): boolean; - arePrevFailedTasksSame(): boolean; - getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; - getEnvironmentStatus(): string; - private hasPartiallySucceededTasks; - hasCanceledPhases(): boolean; - getPipelineViewModel(config: PipelineConfiguration): ReleaseViewModel; - getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; - getReleaseTasks(source: ReleaseEnvironment): ReleaseTask[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.d.ts deleted file mode 100644 index 85204208..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/Report.d.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; -import { ChangeModel } from "./ChangeModel"; -import { PhaseModel } from "./PhaseModel"; -import { TestSummaryGroupModel } from "./testresults/TestSummaryGroupModel"; -import { TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { TestResultsGroupModel } from "./testresults/TestResultGroupModel"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ArtifactViewModel } from "./viewmodel/ArtifactViewModel"; -import { BuildReferenceViewModel } from "./viewmodel/BuildReferenceViewModel"; -import { ReleaseViewModel } from "./viewmodel/ReleaseViewModel"; -export declare abstract class Report { - private dataMissing; - private sendMailConditionSatisfied; - createdBy: IdentityRef; - protected associatedChanges: ChangeModel[]; - protected phases: PhaseModel[]; - private failedTestOwners; - filteredResults: TestResultsGroupModel[]; - hasFilteredTests: boolean; - private testSummaryGroups; - testResultSummary: TestResultSummary; - /** - * Getter $dataMissing - * @return {boolean} - */ - get $dataMissing(): boolean; - /** - * Getter $associatedChanges - * @return {ChangeModel[]} - */ - get $associatedChanges(): ChangeModel[]; - /** - * Getter $associatedChanges - * @return {ChangeModel[]} - */ - get $phases(): PhaseModel[]; - /** - * Getter $sendMailConditionSatisfied - * @return {boolean} - */ - get $sendMailConditionSatisfied(): boolean; - /** - * Setter $dataMissing - * @param {boolean} value - */ - set $dataMissing(value: boolean); - /** - * Setter $sendMailConditionSatisfied - * @param {boolean} value - */ - set $sendMailConditionSatisfied(value: boolean); - /** - * Getter $testSummaryGroups - * @return {TestSummaryGroupModel[]} - */ - get $testSummaryGroups(): TestSummaryGroupModel[]; - /** - * Getter $failedTestOwners - * @return {IdentityRef[] } - */ - get $failedTestOwners(): IdentityRef[]; - abstract hasPrevGotSameFailures(): boolean; - abstract hasFailedTasks(): boolean; - abstract hasPrevFailedTasks(): boolean; - abstract arePrevFailedTasksSame(): boolean; - abstract getPrevConfig(config: PipelineConfiguration): PipelineConfiguration; - abstract getEnvironmentStatus(): string; - abstract getPipelineViewModel(config: PipelineConfiguration): BuildReferenceViewModel | ReleaseViewModel; - abstract getArtifactViewModels(config: PipelineConfiguration): ArtifactViewModel[]; - hasFailedTests(includeOthersInTotal: boolean): boolean; - private getTestCountForOutcome; - abstract hasCanceledPhases(): boolean; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.d.ts deleted file mode 100644 index f8335f5d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/ReportFactory.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ReleaseReport } from "./ReleaseReport"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { Report } from "./Report"; -import { BuildReport } from "./BuildReport"; -export declare class ReportFactory { - static createNewReport(pipelineConfig: PipelineConfiguration): ReleaseReport | BuildReport; - static mergeReports(reports: Report[]): Report; - private static mergeTwoReports; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.d.ts deleted file mode 100644 index 38981545..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/TaskModel.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { TaskStatus } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { IssueModel } from "./IssueModel"; -export declare class TaskModel { - private name; - private status; - private issues; - private agentName; - private finishTime; - private startTime; - constructor($name: string, $status: TaskStatus, $issues: IssueModel[], $agentName: string, $finishTime: Date, $startTime: Date); - /** - * Getter $name - * @return {string} - */ - get $name(): string; - /** - * Getter $status - * @return {TaskStatus} - */ - get $status(): TaskStatus; - /** - * Getter $issues - * @return {IssueModel[]} - */ - get $issues(): IssueModel[]; - /** - * Getter $agentName - * @return {string} - */ - get $agentName(): string; - /** - * Getter $finishTime - * @return {Date} - */ - get $finishTime(): Date; - /** - * Getter $startTime - * @return {Date} - */ - get $startTime(): Date; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.d.ts deleted file mode 100644 index 72d5f999..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/LinkHelper.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestCaseResult } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class LinkHelper { - private static readonly TcmPipelineExtension; - private static readonly ReleaseProgressView; - private static readonly ReleaseDefView; - private static readonly ReleaseEnvironmentExtension; - private static readonly ReleaseEnvironmentLogsExtension; - private static readonly ReleaseLinkTestExtensionId; - private static readonly WorkItemPipelineExtension; - private static readonly BuildPipelineExtension; - static getBuildDefinitionLinkById(definitionId: any, config: PipelineConfiguration): string; - private static getBuildLink; - static getCommitLink(changeId: string, changeUri: string, config: PipelineConfiguration): string; - static getCreateBugLinkForTest(config: PipelineConfiguration, testResult: TestCaseResult): string; - static getQueryParameter(parameterValues: Map): string; - static getReleaseDefinitionLink(config: PipelineConfiguration, releaseDefinitionId: number): string; - static getReleaseLogsTabLink(config: PipelineConfiguration): string; - static getReleaseSummaryLink(config: PipelineConfiguration): string; - static getTestResultLink(config: PipelineConfiguration, runId: string, resultId: number, queryParams?: Map): string; - static getTestTabLinkInRelease(config: PipelineConfiguration): string; - static getWorkItemLink(config: PipelineConfiguration, workItemId: number): string; - private static getBuildRelativeUrl; - static getTestTabLinkInBuild(config: PipelineConfiguration): string; - private static getTcmRelativeUrl; - private static getWorkItemRelativeUrl; - static getTestTabLink(pipelineConfiguration: PipelineConfiguration): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.d.ts deleted file mode 100644 index 0173bac6..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TestResultsHelper.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; -export declare class TestResultsHelper { - static readonly PercentagePrecision = 2; - static getTestOutcomePercentage(testCountForOutcome: number, totalTests: number): number; - private static getCustomizedDecimalValue; - static getTestOutcomePercentageString(testCountForOutcome: number, totalTests: number): string; - static getTotalTestCountBasedOnUserConfiguration(testCountsByOutcome: Map, includeOthersInTotal: boolean): number; - static getTotalTestCountBasedOnUserConfigurationPriority(testCountsByOutcome: Map, includeOthersInTotal: boolean): number; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.d.ts deleted file mode 100644 index c4e88503..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/helpers/TimeFormatter.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare class TimeFormatter { - static ConvertTimeStringToMilliSeconds(duration: string): number; - static FormatDuration(timeInMilliseconds: number): string; - static FormatDurationStr(timeStr: string): string; - private static getCombinedTimeString; - private static getTimeUnitString; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.d.ts deleted file mode 100644 index c2dbc46e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestOutcomeForPriority.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare enum TestOutcomeForPriority { - Failed = 0, - Inconclusive = 1, - NotExecuted = 2, - Passed = 3, - Other = 4 -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.d.ts deleted file mode 100644 index 097ec84b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultGroupModel.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { TestResultModel } from "./TestResultModel"; -import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultsGroupModel { - groupName: string; - testResults: Map; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.d.ts deleted file mode 100644 index ed658c8d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestResultModel.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TestCaseResult, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; -export declare class TestResultModel { - testResult: TestCaseResult; - associatedBugRefs: WorkItemReference[]; - associatedBugs: WorkItem[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.d.ts deleted file mode 100644 index d75cd7ec..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryGroupModel.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; -import { TestSummaryItemModel } from "./TestSummaryItemModel"; -export declare class TestSummaryGroupModel { - groupedBy: GroupTestResultsBy; - runs: TestSummaryItemModel[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.d.ts deleted file mode 100644 index d9a886e1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/testresults/TestSummaryItemModel.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { TestOutcomeForPriority } from "./TestOutcomeForPriority"; -import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestSummaryItemModel { - private name; - private id; - private totalTestCount; - private testCountByOutcome; - private testCountForOutcomeByPriority; - private duration; - constructor($name: string, $id: string); - /** - * Getter $name - * @return {string} - */ - get $name(): string; - /** - * Getter $id - * @return {string} - */ - get $id(): string; - /** - * Getter $totalTestCount - * @return {number} - */ - get $totalTestCount(): number; - /** - * Getter $testCountByOutcome - * @return {Map} - */ - get $testCountByOutcome(): Map; - /** - * Getter $testCountForOutcomeByPriority - * @return {Map} - */ - get $testCountForOutcomeByPriority(): Map>; - /** - * Getter $duration - * @return {any} - */ - get $duration(): number; - /** - * Setter $totalTestCount - * @param {number} value - */ - set $totalTestCount(value: number); - /** - * Setter $duration - * @param {any} value - */ - set $duration(value: number); - getFailedTestsCount(): number; - getOtherTestsCount(): number; - getPassedTestsCount(): number; - private getTestOutcomeCount; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.d.ts deleted file mode 100644 index 54340d1d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ArtifactViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Artifact } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export declare class ArtifactViewModelWrapper { - ArtifactViewModel: ArtifactViewModel[]; -} -export declare class ArtifactViewModel { - ArtifactDefinitionUrl: string; - BranchName: string; - BuildSummaryUrl: string; - Name: string; - Version: string; - IsPrimary: boolean; - constructor(artifact: Artifact, config: PipelineConfiguration); - private getArtifactInfo; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.d.ts deleted file mode 100644 index ec082909..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/BuildReferenceViewModel.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { BuildReference, Build } from "azure-devops-node-api/interfaces/BuildInterfaces"; -export declare class BuildReferenceViewModel { - Id: string; - Number: string; - Branch: string; - Url: string; - DefinitionUrl: string; - DefinitionName: string; - constructor(config: PipelineConfiguration, buildReference: BuildReference, build: Build); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.d.ts deleted file mode 100644 index af5beb94..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ChangeViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ChangeModel } from "../ChangeModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export declare class ChangeViewModelWrapper { - ChangeViewModel: ChangeViewModel[]; -} -export declare class ChangeViewModel { - readonly ConstHashLength = 8; - AuthorName: string; - Id: string; - Message: string; - TimeStamp: string; - Url: string; - ShortId: string; - constructor(change: ChangeModel, config: PipelineConfiguration); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.d.ts deleted file mode 100644 index 9ef5f238..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/DeploymentJobViewModel.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { JobModel } from "../JobModel"; -import { TaskResultViewModelWrapper } from "./TaskResultViewModel"; -export declare class DeploymentJobViewModel { - Tasks: TaskResultViewModelWrapper; - MinTaskStartTime: Date; - MaxTaskFinishTime: Date; - constructor(jobs: JobModel[]); - private getMinTime; - private getMaxTime; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.d.ts deleted file mode 100644 index bf616383..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/EmailReportViewModel.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Report } from "../Report"; -import { ReportConfiguration } from "../../config/ReportConfiguration"; -import { ReleaseViewModel } from "./ReleaseViewModel"; -import { PhaseViewModelWrapper } from "./PhaseViewModel"; -import { PhaseIssuesViewModel } from "./PhaseIssuesViewModel"; -import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; -import { ArtifactViewModelWrapper } from "./ArtifactViewModel"; -import { ChangeViewModelWrapper } from "./ChangeViewModel"; -import { TestSummaryGroupViewModelWrapper } from "./TestSummaryGroupViewModel"; -import { TestResultsGroupViewModelWrapper } from "./TestResultsGroupViewModel"; -export declare class EmailReportViewModel { - DataMissing: boolean; - HasTestResultsToShow: boolean; - HasFailedTests: boolean; - HasFilteredTests: boolean; - HasTaskFailures: boolean; - HasCanceledPhases: boolean; - MaxTestResultsToShow: number; - ProjectName: string; - Release: ReleaseViewModel; - Build: any; - Phases: PhaseViewModelWrapper; - PhaseIssuesSummary: PhaseIssuesViewModel; - AllTests: TestResultSummaryViewModel; - Artifacts: ArtifactViewModelWrapper; - AssociatedChanges: ChangeViewModelWrapper; - SummaryGroups: TestSummaryGroupViewModelWrapper; - TestResultsGroups: TestResultsGroupViewModelWrapper; - TestTabLink: string; - ShowAssociatedChanges: boolean; - constructor(report: Report, reportConfiguration: ReportConfiguration); - private InitializePhases; - private SetMailSubject; - private InitializeAssociatedChanges; - private InitializeSummaryGroupViewModel; - private InitializeTestResultGroups; - private GetPassPercentage; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.d.ts deleted file mode 100644 index def8692e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/MailAddressViewModel.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { MailConfiguration } from "../../config/mail/MailConfiguration"; -import { Report } from "../Report"; -export declare class MailAddressViewModel { - cc: string[]; - from: string; - to: string[]; - private defaultDomain; - constructor(report: Report, mailConfig: MailConfiguration); - private getMailAddresses; - private getFailedTestOwners; - private getActiveBugOwnersForFailedTests; - private getChangesetOwners; - private filterValidMailAddresses; - private getValidEmailAddress; - private isValidEmail; - private getMailAddressFromIdentityRef; - private getUniqueName; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.d.ts deleted file mode 100644 index 351ef469..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseIssuesViewModel.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TaskResultViewModelWrapper } from "./TaskResultViewModel"; -import { PhaseModel } from "../PhaseModel"; -export declare class PhaseIssuesViewModel { - Tasks: TaskResultViewModelWrapper; - Name: string; - constructor(phases: PhaseModel[]); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.d.ts deleted file mode 100644 index af1b7f7f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/PhaseViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { DeploymentJobViewModel } from "./DeploymentJobViewModel"; -import { PhaseModel } from "../PhaseModel"; -export declare class PhaseViewModelWrapper { - PhaseViewModel: PhaseViewModel[]; -} -export declare class PhaseViewModel { - DeploymentJob: DeploymentJobViewModel; - TasksDuration: string; - Status: string; - Rank: number; - Name: string; - constructor(phase: PhaseModel); - private InitializeDeploymentJobs; - private InitializeTasksDuration; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.d.ts deleted file mode 100644 index 2124209c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseEnvironmentViewModel.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -export declare class ReleaseEnvironmentViewModel { - EnvironmentName: string; - EnvironmentOwnerEmail: string; - constructor(environment: ReleaseEnvironment); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.d.ts deleted file mode 100644 index b777d56d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseReferenceViewModel.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReleaseReference } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -export declare class ReleaseReferenceViewModel { - Id: number; - Name: string; - Url: string; - constructor(config: PipelineConfiguration, releaseReference: ReleaseReference); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.d.ts deleted file mode 100644 index a17f897f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/ReleaseViewModel.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReleaseEnvironmentViewModel } from "./ReleaseEnvironmentViewModel"; -export declare class ReleaseViewModel { - CurrentEnvironment: ReleaseEnvironmentViewModel; - ReleaseDefinitionName: string; - ReleaseDefinitionUrl: string; - ReleaseId: number; - ReleaseName: string; - ReleaseSummaryUrl: string; - ReleaseLogsLink: string; - constructor(currentEnvironment: ReleaseEnvironment, releaseConfig: PipelineConfiguration); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.d.ts deleted file mode 100644 index 76748801..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueSummaryViewModel.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { TaskIssueViewModel, TaskIssueViewModelWrapper } from "./TaskIssueViewModel"; -import { TaskModel } from "../TaskModel"; -export declare class TaskIssueSummaryViewModel { - Issues: TaskIssueViewModelWrapper; - ErrorMessage: string; - ErrorCount: number; - WarningCount: number; - constructor(tasks: TaskModel[]); - TruncateIssues(issues: TaskIssueViewModel[], characterLimit?: number): TaskIssueViewModel[]; -} -export declare class IssueTypeConstants { - static readonly Error = "error"; - static readonly Warning = "warning"; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.d.ts deleted file mode 100644 index 4818465a..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskIssueViewModel.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export declare class TaskIssueViewModelWrapper { - TaskIssueViewModel: TaskIssueViewModel[]; -} -export declare class TaskIssueViewModel { - Message: string; - IssueType: string; - AgentName: string; - constructor(issueMessage: string, issueType: string, agentName: string); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.d.ts deleted file mode 100644 index 7342ec72..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TaskResultViewModel.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { TaskIssueSummaryViewModel } from "./TaskIssueSummaryViewModel"; -import { TaskModel } from "../TaskModel"; -export declare class TaskResultViewModelWrapper { - TaskResultViewModel: TaskResultViewModel[]; -} -export declare class TaskResultViewModel { - Duration: string; - HasFailed: boolean; - HasSkipped: boolean; - NotYetRun: boolean; - HasPartiallySucceeded: boolean; - HasNotRunOnSomeAgents: boolean; - GotCancelled: boolean; - NotRunMessage: string; - IssuesSummary: TaskIssueSummaryViewModel; - Name: string; - StartTime: string; - Status: string; - constructor(tasks: TaskModel[]); - private InitializeDuration; - private getMinTime; - private getMaxTime; - private getTimeDiff; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.d.ts deleted file mode 100644 index 3e1c85ea..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestInfoByPriorityViewModel.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TestOutcomeForPriority } from "../testresults/TestOutcomeForPriority"; -export declare class TestInfoByPriorityViewModelWrapper { - TestInfoByPriorityViewModel: TestInfoByPriorityViewModel[]; -} -export declare class TestInfoByPriorityViewModel { - Priority: number; - PassingRate: string; - TestCount: number; - constructor(priority: number, testCountByOutcome: Map, includeOthersInTotal: boolean); - private getPassingTestCountByOutcome; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.d.ts deleted file mode 100644 index 0743b369..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultSummaryViewModel.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultSummaryViewModel { - static readonly MaxSupportedPriority = 2; - Duration: string; - FailedTests: number; - OtherTests: number; - PassedTests: number; - PassingRate: string; - TotalTests: number; - Url: string; - constructor(summaryItemModel: TestSummaryItemModel, summary: TestResultSummary, pipelineConfiguration: PipelineConfiguration, includeOthersInTotal: boolean); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.d.ts deleted file mode 100644 index a6fc2fbd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultViewModel.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { WorkItemViewModelWrapper } from "./WorkItemViewModel"; -import { TestResultModel } from "../testresults/TestResultModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReleaseReferenceViewModel } from "./ReleaseReferenceViewModel"; -export declare class TestResultViewModelWrapper { - TestResultViewModel: TestResultViewModel[]; -} -export declare class TestResultViewModel { - private readonly StackTraceLineCount; - AssociatedBugs: WorkItemViewModelWrapper; - CreateBugLink: string; - Duration: string; - ErrorMessage: string; - FailingSinceBuild: any; - FailingSinceRelease: ReleaseReferenceViewModel; - FailingSinceTime: string; - Id: number; - Owner: string; - Priority: string; - StackTrace: string; - TestCaseTitle: string; - TestOutcome: string; - Url: string; - constructor(testResultModel: TestResultModel, config: PipelineConfiguration); - private InitializeAssociatedBugs; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.d.ts deleted file mode 100644 index cee07a69..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestResultsGroupViewModel.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TestResultViewModelWrapper } from "./TestResultViewModel"; -import { ReportConfiguration } from "../../config/ReportConfiguration"; -import { TestResultsGroupModel } from "../testresults/TestResultGroupModel"; -import { TestOutcome } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { TestResultModel } from "../testresults/TestResultModel"; -export declare class TestResultsGroupViewModelWrapper { - TestResultsGroupViewModel: TestResultsGroupViewModel[]; -} -export declare class TestResultsGroupViewModel { - FailedTests: TestResultViewModelWrapper; - GroupName: string; - OtherTests: TestResultViewModelWrapper; - PassedTests: TestResultViewModelWrapper; - constructor(resultsGroupModel: TestResultsGroupModel, reportConfig: ReportConfiguration); - private setGroupName; - private getTestResultViewModels; - getTestResultsByOutcomes(source: TestResultsGroupModel, outcomes: TestOutcome[]): TestResultModel[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.d.ts deleted file mode 100644 index 1883ea5b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryGroupViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TestSummaryGroupModel } from "../testresults/TestSummaryGroupModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestSummaryItemViewModelWrapper } from "./TestSummaryItemViewModel"; -export declare class TestSummaryGroupViewModelWrapper { - TestSummaryGroupViewModel: TestSummaryGroupViewModel[]; -} -export declare class TestSummaryGroupViewModel { - GroupName: string; - SummaryItems: TestSummaryItemViewModelWrapper; - private SupportedPriorityColumns; - constructor(testSummaryGroup: TestSummaryGroupModel, config: PipelineConfiguration, includeOthersInTotal: boolean); - private InitializeSummaryItems; - private InitializeSupportedPriorityColumns; - private getDescription; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.d.ts deleted file mode 100644 index b1d8c132..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/TestSummaryItemViewModel.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TestResultSummaryViewModel } from "./TestResultSummaryViewModel"; -import { TestInfoByPriorityViewModelWrapper } from "./TestInfoByPriorityViewModel"; -import { TestSummaryItemModel } from "../testresults/TestSummaryItemModel"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { GroupTestResultsBy } from "../../config/report/GroupTestResultsBy"; -export declare class TestSummaryItemViewModelWrapper { - TestSummaryItemViewModel: TestSummaryItemViewModel[]; -} -export declare class TestSummaryItemViewModel extends TestResultSummaryViewModel { - Name: string; - TestsByPriority: TestInfoByPriorityViewModelWrapper; - constructor(groupedBy: GroupTestResultsBy, summaryItem: TestSummaryItemModel, config: PipelineConfiguration, includeOthersInTotal: boolean); - private setupPriorityData; - getDisplayName(priority: string): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.d.ts deleted file mode 100644 index d4d1babd..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/model/viewmodel/WorkItemViewModel.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export declare class WorkItemViewModelWrapper { - WorkItemViewModel: WorkItemViewModel[]; -} -export declare class WorkItemViewModel { - AssignedTo: string; - ChangedDate: string; - Id: number; - State: string; - Title: string; - Url: string; - constructor(config: PipelineConfiguration, workItem: WorkItem); -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.d.ts deleted file mode 100644 index cefac9c4..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/DataProviderFactory.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IDataProviderFactory } from "./IDataProviderFactory"; -import { IDataProvider } from "./IDataProvider"; -import { IPostProcessor } from "./IPostProcessor"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -export declare class DataProviderFactory implements IDataProviderFactory { - private pipelineConfig; - private dataProviders; - private postProcessors; - private testResultsClient; - constructor($pipelineConfig: PipelineConfiguration); - getDataProviders(): IDataProvider[]; - getPostProcessors(): IPostProcessor[]; - private getTestResultsClient; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.d.ts deleted file mode 100644 index bb18722d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProvider.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Report } from "../model/Report"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ReportDataConfiguration } from "../config/report/ReportDataConfiguration"; -export interface IDataProvider { - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.d.ts deleted file mode 100644 index a22567be..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IDataProviderFactory.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IDataProvider } from "./IDataProvider"; -import { IPostProcessor } from "./IPostProcessor"; -export interface IDataProviderFactory { - getDataProviders(): IDataProvider[]; - getPostProcessors(): IPostProcessor[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.d.ts deleted file mode 100644 index 0c1f4301..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IPostProcessor.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ReportConfiguration } from "../config/ReportConfiguration"; -import { Report } from "../model/Report"; -export interface IPostProcessor { - processReportAsync(reportConfig: ReportConfiguration, finalReport: Report): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.d.ts deleted file mode 100644 index 3a18e882..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/IReportProvider.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Report } from "../model/Report"; -import { ReportConfiguration } from "../config/ReportConfiguration"; -export interface IReportProvider { - createReportAsync(reportConfig: ReportConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.d.ts deleted file mode 100644 index 4707ea61..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/ReportProvider.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IReportProvider } from "./IReportProvider"; -import { ReportConfiguration } from "../config/ReportConfiguration"; -import { Report } from "../model/Report"; -import { IDataProviderFactory } from "./IDataProviderFactory"; -export declare class ReportProvider implements IReportProvider { - private dataProviders; - private postProcessors; - constructor(dataProviderFactory: IDataProviderFactory); - createReportAsync(reportConfig: ReportConfiguration): Promise; - private callDataProvider; - private callPostProcessor; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.d.ts deleted file mode 100644 index a1317cb3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/SendMailConditionProcessor.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IPostProcessor } from "./IPostProcessor"; -import { Report } from "../model/Report"; -import { ReportConfiguration } from "../config/ReportConfiguration"; -import { PipelineConfiguration } from "../config/pipeline/PipelineConfiguration"; -import { ITestResultsClient } from "./restclients/ITestResultsClient"; -export declare class SendMailConditionProcessor implements IPostProcessor { - private testResultsClient; - private readonly TestResultFieldsToQuery; - constructor(testResultsClient: ITestResultsClient); - processReportAsync(reportConfig: ReportConfiguration, report: Report): Promise; - hasPreviousReleaseGotSameFailuresAsync(report: Report, config: PipelineConfiguration, hasTestFailures: boolean, hasFailedTasks: boolean): Promise; - private getFailureCountFromSummary; - private fetchFailedTestCaseIdsAsync; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.d.ts deleted file mode 100644 index 7e4dc619..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/AbstractTestResultsDetailsParser.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { TestResultsDetails, TestResultsDetailsForGroup } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; -export declare abstract class AbstractTestResultsDetailsParser { - protected testResultDetails: TestResultsDetails; - constructor(testResultDetails: TestResultsDetails); - abstract getSummaryItems(): Array; - abstract getGroupByValue(group: TestResultsDetailsForGroup): string; - protected parseBaseData(resultsForGroup: TestResultsDetailsForGroup, summaryItem: TestSummaryItemModel): void; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.d.ts deleted file mode 100644 index 78c07e95..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserFactory.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; -import { TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultDetailsParserFactory { - static getParser(resultDetails: TestResultsDetails): AbstractTestResultsDetailsParser; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.d.ts deleted file mode 100644 index 9844cd01..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForPriority.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; -import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; -import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultDetailsParserForPriority extends AbstractTestResultsDetailsParser { - constructor(testResultDetails: TestResultsDetails); - getSummaryItems(): TestSummaryItemModel[]; - getGroupByValue(group: TestResultsDetailsForGroup): string; - getTestResultsForRun(runId: number): Map; - private getPriority; - private getTestCountByPriorityInTestRun; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.d.ts deleted file mode 100644 index db1b8ead..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/helpers/TestResultDetailsParserForRun.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AbstractTestResultsDetailsParser } from "./AbstractTestResultsDetailsParser"; -import { TestSummaryItemModel } from "../../model/testresults/TestSummaryItemModel"; -import { TestResultsDetailsForGroup, TestResultsDetails } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TestResultDetailsParserForRun extends AbstractTestResultsDetailsParser { - constructor(testResultDetails: TestResultsDetails); - getSummaryItems(): TestSummaryItemModel[]; - getGroupByValue(group: TestResultsDetailsForGroup): string; - private getTestRunSummaryInfo; - private readGroupByValue; -} -export declare class TestRunInfo { - id: number; - name: string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.d.ts deleted file mode 100644 index eaf08ab5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/BuildDataProvider.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { Report } from "../../model/Report"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; -export declare class BuildDataProvider implements IDataProvider { - private pipelineRestClient; - constructor(pipelineRestClient: IPipelineRestClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; - private getBuildAsync; - private getPhases; - private getTaskState; - private getOrder; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.d.ts deleted file mode 100644 index 6a0c5de3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/pipeline/ReleaseDataProvider.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { Report } from "../../model/Report"; -import { IPipelineRestClient } from "../restclients/IPipelineRestClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -export declare class ReleaseDataProvider implements IDataProvider { - private pipelineRestClient; - constructor(pipelineRestClient: IPipelineRestClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; - private getReleaseAsync; - private getEnvironment; - private getPhases; - private getJobModelsFromPhase; - private getReleaseByLastCompletedEnvironmentAsync; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.d.ts deleted file mode 100644 index d47f0af1..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractClient.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { WebApi } from "azure-devops-node-api"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export declare abstract class AbstractClient { - protected connection: WebApi; - protected pipelineConfig: PipelineConfiguration; - constructor(pipelineConfig: PipelineConfiguration); - /** - * Gets Web Api to allow fetching of other Api callers, such as Git Api and Build Api - * @param uri Default URL - * @param accessToken token to get credentials with access to Api calls - */ - private createConnection; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.d.ts deleted file mode 100644 index 60e99da5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/AbstractTestResultsClient.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { AbstractClient } from "./AbstractClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ITestApi } from "azure-devops-node-api/TestApi"; -import { TestResultsDetails, TestResultSummary, TestOutcome, TestResultsQuery, TestCaseResult, ResultsFilter, WorkItemReference } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { ITestResultsClient } from "./ITestResultsClient"; -import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; -export declare abstract class AbstractTestResultsClient extends AbstractClient implements ITestResultsClient { - private readonly MaxItemsSupported; - protected testApiPromise: Promise; - constructor(pipelineConfig: PipelineConfiguration); - queryTestResultBugs(automatedTestName: string, resultId: number): Promise; - getTestResultById(testRunId: number, resultId: number): Promise; - queryTestResultsReportAsync(parameterConfig?: PipelineConfiguration): Promise; - getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; - getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], parameterConfig?: PipelineConfiguration): Promise; - getTestResultSummaryAsync(includeFailures: boolean, parameterConfig?: PipelineConfiguration): Promise; - getTestResultsByQueryAsync(query: TestResultsQuery): Promise; - protected abstract getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; - protected abstract queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; - protected getOutcomeFilter(outcomes: TestOutcome[]): string; - private getUniqueName; - private isValid; -} -export declare class TestResultsQueryImpl implements TestResultsQuery { - fields: string[]; - results: TestCaseResult[]; - resultsFilter: ResultsFilter; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.d.ts deleted file mode 100644 index 453a236e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildClient.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IPipelineRestClient } from "./IPipelineRestClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { Build, Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; -import { ChangeModel } from "../../model/ChangeModel"; -import { AbstractClient } from "./AbstractClient"; -export declare class BuildRestClient extends AbstractClient implements IPipelineRestClient { - private buildApi; - constructor(pipelineConfig: PipelineConfiguration); - getPipelineAsync(): Promise; - getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; - getPipelineChangesAsync(prevPipelineId: number): Promise; - getPipelineTimelineAsync(pipelineId: number): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.d.ts deleted file mode 100644 index f7811c61..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/BuildTestResultsClient.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { ITestResultsClient } from "./ITestResultsClient"; -import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; -export declare class BuildTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { - constructor(pipelineConfig: PipelineConfiguration); - queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; - getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.d.ts deleted file mode 100644 index ed7a5b4d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IPipelineRestClient.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Timeline } from "azure-devops-node-api/interfaces/BuildInterfaces"; -import { ChangeModel } from "../../model/ChangeModel"; -export interface IPipelineRestClient { - getPipelineAsync(): Promise; - getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; - getPipelineChangesAsync(prevPipelineId: number): Promise; - getPipelineTimelineAsync(pipelineId: number): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.d.ts deleted file mode 100644 index 74404ca3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ITestResultsClient.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestResultsDetails, TestResultSummary, TestOutcome, TestCaseResult, WorkItemReference, TestResultsQuery } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { IdentityRef } from "azure-devops-node-api/interfaces/common/VSSInterfaces"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -export interface ITestResultsClient { - queryTestResultBugs(automatedTestName: string, resultId: number): Promise; - getTestResultById(testRunId: number, resultId: number): Promise; - queryTestResultsReportAsync(config?: PipelineConfiguration): Promise; - getTestResultOwnersAsync(resultsToFetch: TestCaseResult[]): Promise; - getTestResultsDetailsAsync(groupBy: string, outcomeFilters?: TestOutcome[], config?: PipelineConfiguration): Promise; - getTestResultSummaryAsync(includeFailures: boolean, config?: PipelineConfiguration): Promise; - getTestResultsByQueryAsync(query: TestResultsQuery): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.d.ts deleted file mode 100644 index 28259330..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/IWorkItemClient.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; -export interface IWorkItemClient { - getWorkItemsAsync(workItemIds: number[]): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.d.ts deleted file mode 100644 index a40b9e67..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseClient.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Release } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -import { AbstractClient } from "./AbstractClient"; -import { IPipelineRestClient } from "./IPipelineRestClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { ChangeModel } from "../../model/ChangeModel"; -export declare class ReleaseRestClient extends AbstractClient implements IPipelineRestClient { - constructor(pipelineConfig: PipelineConfiguration); - getPipelineAsync(): Promise; - getLastPipelineAsync(pipelineDefId: number, envDefId: number, sourceBranchFilter: string, maxCreatedDate?: Date): Promise; - getPipelineChangesAsync(prevPipelineId: number): Promise; - getPipelineTimelineAsync(pipelineId: number): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.d.ts deleted file mode 100644 index 4aa8b06e..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/ReleaseTestResultsClient.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { TestResultsDetails, TestResultSummary } from "azure-devops-node-api/interfaces/TestInterfaces"; -import { ITestResultsClient } from "./ITestResultsClient"; -import { AbstractTestResultsClient } from "./AbstractTestResultsClient"; -export declare class ReleaseTestResultsClient extends AbstractTestResultsClient implements ITestResultsClient { - constructor(pipelineConfig: PipelineConfiguration); - queryTestResultsReportForPipelineAsync(config: PipelineConfiguration, includeFailures?: boolean): Promise; - getTestResultsDetailsForPipelineAsync(config: PipelineConfiguration, groupBy?: string, filter?: string): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.d.ts deleted file mode 100644 index 2237a73c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/RetryablePromise.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare class RetryablePromise { - private static defaultRetryCount; - static RetryAsync(executor: () => Promise, executorName: string, times?: number): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.d.ts deleted file mode 100644 index 1283d408..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/restclients/WorkItemClient.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AbstractClient } from "./AbstractClient"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { IWorkItemClient } from "./IWorkItemClient"; -import { WorkItem } from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"; -export declare class WorkItemClient extends AbstractClient implements IWorkItemClient { - private workApiPromise; - constructor(pipelineConfig: PipelineConfiguration); - getWorkItemsAsync(workItemIds: number[]): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.d.ts deleted file mode 100644 index a7c5ae6c..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TcmHelper.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { TestOutcome, TestCaseResult, CustomTestField } from "azure-devops-node-api/interfaces/TestInterfaces"; -export declare class TcmHelper { - static readonly OutcomeConfidenceValue: Number; - static exceptOutcomes(outcomesToExclude: TestOutcome[]): TestOutcome[]; - static parseOutcome(outcomeString: string): TestOutcome; - static isTestFlaky(result: TestCaseResult): boolean; - static getCustomField(result: TestCaseResult, fieldName: string): CustomTestField; - static Merge(source: Array>): T[]; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.d.ts deleted file mode 100644 index 46e1f987..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestOwnersDataProvider.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { Report } from "../../model/Report"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -import { ITestResultsClient } from "../restclients/ITestResultsClient"; -export declare class TestOwnersDataProvider implements IDataProvider { - private testResultsClient; - constructor(testResultsClient: ITestResultsClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.d.ts deleted file mode 100644 index daee1718..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestResultsDataProvider.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { Report } from "../../model/Report"; -import { ITestResultsClient } from "../restclients/ITestResultsClient"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -import { IWorkItemClient } from "../restclients/IWorkItemClient"; -export declare class TestResultsDataProvider implements IDataProvider { - private testResultsClient; - private workItemClient; - constructor(testResultsClient: ITestResultsClient, workItemClient: IWorkItemClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfig: ReportDataConfiguration): Promise; - private setFilteredTestResults; - private getTestResultsWithWorkItems; - private getTestResultsForResultsGroupWithWorkItemsAsync; - private getWorkItemsAsync; - private getTestResultsWithBugRefs; - private filterTestResults; - private getIncludedOutcomes; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.d.ts deleted file mode 100644 index 9e3f97cc..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/providers/tcmproviders/TestSummaryDataProvider.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IDataProvider } from "../IDataProvider"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { Report } from "../../model/Report"; -import { ITestResultsClient } from "../restclients/ITestResultsClient"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -export declare class TestSummaryDataProvider implements IDataProvider { - private testResultsClient; - constructor(testResultsClient: ITestResultsClient); - getReportDataAsync(pipelineConfig: PipelineConfiguration, reportDataConfiguration: ReportDataConfiguration): Promise; - private getTestSummaryByPriorityAsync; - private getTestRunSummaryWithPriorityAsync; - private getSummaryByRun; - private getTestSummaryDataByPriorityAsync; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.d.ts deleted file mode 100644 index 103d2e9d..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/telemetry/TelemetryLogger.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ReportConfiguration } from "../config/ReportConfiguration"; -export declare class TelemetryLogger { - static readonly TELEMETRY_LINE = "##vso[telemetry.publish area=AgentTasks;feature=EmailReportTask]"; - private static instance; - private static reportConfig; - /** - * Formats and sends all telemetry collected to be published - */ - static LogTaskConfig(reportConfiguration: ReportConfiguration): void; - static LogModulePerf(moduleName: string, timeTaken: number, numRetries?: Number): void; - /** - * Publishes an object as a string as telemetry - * @param telemetryToLog Object to be logged as a string - */ - private static logTelemetry; - static InvokeWithPerfLogger(executor: () => Promise, executorName: string): Promise; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.d.ts deleted file mode 100644 index a95ad04b..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__e_to_e_tests__/InvokeTest.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IConfigurationProvider } from "../../config/IConfigurationProvider"; -import { SendMailCondition } from "../../config/report/SendMailCondition"; -import { PipelineConfiguration } from "../../config/pipeline/PipelineConfiguration"; -import { MailConfiguration } from "../../config/mail/MailConfiguration"; -import { ReportDataConfiguration } from "../../config/report/ReportDataConfiguration"; -export declare class FileWriter { - static writeToFile(content: string, fileName: string): void; -} -export declare class MockConfigProvider implements IConfigurationProvider { - getPipelineConfiguration(): PipelineConfiguration; - getMailConfiguration(): MailConfiguration; - getReportDataConfiguration(): ReportDataConfiguration; - getSendMailCondition(): SendMailCondition; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/tests/__tests__/ReportManagerTests.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.d.ts deleted file mode 100644 index 0199d3d5..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/DisplayNameHelper.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class DisplayNameHelper { - static getPriorityDisplayName(priority: string): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.d.ts deleted file mode 100644 index c233622f..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnumUtils.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SendMailCondition } from "../config/report/SendMailCondition"; -import { GroupTestResultsBy } from "../config/report/GroupTestResultsBy"; -export declare class EnumUtils { - static GetMailConditionString(condition: SendMailCondition): string; - static GetGroupTestResultsByString(condition: GroupTestResultsBy): string; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.d.ts deleted file mode 100644 index 6e9dd614..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/EnvironmentExtensions.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ReleaseDeployPhase, ReleaseEnvironment } from "azure-devops-node-api/interfaces/ReleaseInterfaces"; -export declare class EnvironmentExtensions { - static getPhases(environment: ReleaseEnvironment): Array; -} diff --git a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.d.ts b/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.d.ts deleted file mode 100644 index ca46ba16..00000000 --- a/Extensions/emailReportTask/Tasks/emailReportTask/emailReportTaskV2/utils/StringUtils.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare class StringUtils { - static isNullOrWhiteSpace(input: string): boolean; - static CompressNewLines(content: string): string; - private static getNonEmptyLines; - static ReplaceNewlineWithBrTag(content: string): string; - static getFirstNLines(content: string, lineCount: number): string; -} From b43b016cde20e7d4eb3d7ccd983039a343cdf926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20K=C3=B5osaar?= Date: Tue, 17 Oct 2023 11:23:50 +0300 Subject: [PATCH 11/11] Update configs/dev.json Co-authored-by: Mathias Olausson --- configs/dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/dev.json b/configs/dev.json index ca44d420..eff027af 100644 --- a/configs/dev.json +++ b/configs/dev.json @@ -2,5 +2,5 @@ "id": "EmailReportExtension", "name": "Email Report Extension (Dev)", "public": false, - "publisher": "solidify-labs" + "publisher": "ms-devlabs" } \ No newline at end of file