├── LICENSE ├── .gitignore ├── icon.png ├── dev_manifest.json ├── PublishHtmlReport ├── icon.png ├── package.json ├── task.json ├── index.js └── package-lock.json ├── src ├── tabContent.scss ├── tabContent.html └── tabContent.tsx ├── tsconfig.json ├── README.md ├── OVERVIEW.md ├── webpack.config.js ├── package.json ├── azure-devops-extension.json └── azure-pipelines.yaml /LICENSE: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JakubRumpca/azure-pipeline-html-report/HEAD/icon.png -------------------------------------------------------------------------------- /dev_manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifestVersion": 1, 3 | "id": "extension", 4 | "publisher": "JakubRumpca" 5 | } -------------------------------------------------------------------------------- /PublishHtmlReport/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JakubRumpca/azure-pipeline-html-report/HEAD/PublishHtmlReport/icon.png -------------------------------------------------------------------------------- /src/tabContent.scss: -------------------------------------------------------------------------------- 1 | @import "node_modules/azure-devops-ui/Core/_platformCommon.scss"; 2 | 3 | .bolt-tabbar-tabs { 4 | font-size: $fontSizeM; 5 | margin-bottom: 10px; 6 | font-family: Arial, sans-serif; 7 | } 8 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "amd", 4 | "moduleResolution": "node", 5 | "target": "es6", 6 | "outDir": "dist/", 7 | "jsx": "react", 8 | "types": [ 9 | "react", 10 | "node" 11 | ], 12 | "skipLibCheck": true, 13 | }, 14 | "files": [ 15 | "src/tabContent.tsx" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /PublishHtmlReport/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "publish-html-report", 3 | "version": "1.0.8", 4 | "description": "", 5 | "main": "index.js", 6 | "private": true, 7 | "dependencies": { 8 | "azure-pipelines-task-lib": "^2.9.3", 9 | "cheerio": "^1.0.0-rc.3", 10 | "dashify": "^2.0.0", 11 | "fs": "0.0.2", 12 | "fs-extra": "^8.1.0", 13 | "globby": "^11.0.0", 14 | "hat": "0.0.3" 15 | }, 16 | "devDependencies": {}, 17 | "scripts": {}, 18 | "author": "", 19 | "license": "ISC" 20 | } 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # azure-pipeline-html-report 2 | 3 | 4 | Azure DevOps extension that provides a task for publishing report in a HTML format and embeds it into a Build and Release pages. 5 | 6 | ### Extension 7 | 8 | In order to see report on tab one must first use `Publish HTML Report` task. This is supporting task which makes html tab visible. 9 | 10 | This task takes one parameter - required `reportDir` which is a path to report directory and also optional `tabName` which is the name of the tab displayed within Azure DevOps report. 11 | #### Example YAML setup 12 | 13 | ```YAML 14 | steps: 15 | - task: PublishHtmlReport@1 16 | displayName: 'Publish HTML Report' 17 | inputs: 18 | reportDir: '$(ResultsPath)/reportName.html' 19 | ``` -------------------------------------------------------------------------------- /OVERVIEW.md: -------------------------------------------------------------------------------- 1 | # azure-pipeline-html-report 2 | 3 | 4 | Azure DevOps extension that provides a task for publishing report in a HTML format and embeds it into a Build and Release pages. 5 | 6 | ### Extension 7 | 8 | In order to see report on tab one must first use `Publish HTML Report` task. This is supporting task which makes html tab visible. 9 | 10 | This task takes one parameter - required `reportDir` which is a path to report directory and also optional `tabName` which is the name of the tab displayed within Azure DevOps report. 11 | #### Example YAML setup 12 | 13 | ```YAML 14 | steps: 15 | - task: PublishHtmlReport@1 16 | displayName: 'Publish HTML Report' 17 | inputs: 18 | reportDir: '$(ResultsPath)/reportName.html' 19 | ``` -------------------------------------------------------------------------------- /PublishHtmlReport/task.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "bf52d8fd-c399-4acd-98c7-a03ceee2a974", 3 | "name": "PublishHtmlReport", 4 | "friendlyName": "Publish Html Report", 5 | "description": "Publish Html Report", 6 | "author": "", 7 | "helpMarkDown": "Replace with markdown to show in help", 8 | "category": "Utility", 9 | "visibility": [ 10 | "Build" 11 | ], 12 | "demands": [], 13 | "version": { 14 | "Major": "1", 15 | "Minor": "0", 16 | "Patch": "8" 17 | }, 18 | "minimumAgentVersion": "1.95.0", 19 | "instanceNameFormat": "Publish Html Report", 20 | "inputs": [ 21 | { 22 | "name": "tabName", 23 | "type": "string", 24 | "label": "Report tab name", 25 | "defaultValue": "HTML-Report", 26 | "required": false, 27 | "helpMarkDown": "Name of the tab displayed in the report" 28 | }, 29 | { 30 | "name": "reportDir", 31 | "type": "filePath", 32 | "label": "HTML file Directory", 33 | "defaultValue": "", 34 | "required": true, 35 | "helpMarkDown": "HTML file directory where PublishHtmlReport is run." 36 | } 37 | ], 38 | "execution": { 39 | "Node10": { 40 | "target": "index.js", 41 | "argumentFormat": "" 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const CopyWebpackPlugin = require("copy-webpack-plugin"); 3 | const webpack = require('webpack'); 4 | 5 | module.exports = { 6 | entry: { 7 | tabContent: "./src/tabContent.tsx", 8 | }, 9 | 10 | resolve: { 11 | extensions: [".ts", ".tsx", ".js"], 12 | alias: { 13 | "azure-devops-extension-sdk": path.resolve("node_modules/azure-devops-extension-sdk") 14 | }, 15 | }, 16 | stats: { 17 | warnings: false 18 | }, 19 | module: { 20 | rules: [ 21 | { 22 | test: /\.tsx?$/, 23 | loader: "ts-loader" 24 | }, 25 | { 26 | test: /\.scss$/, 27 | use: ["style-loader", "css-loader", "azure-devops-ui/buildScripts/css-variables-loader", "sass-loader"] 28 | }, 29 | { 30 | test: /\.css$/, 31 | use: ["style-loader", "css-loader"], 32 | }, 33 | { 34 | test: /\.woff$/, 35 | use: [{ 36 | loader: 'base64-inline-loader' 37 | }] 38 | }, 39 | { 40 | test: /\.html$/, 41 | loader: "file-loader" 42 | } 43 | ] 44 | }, 45 | plugins: [ 46 | new CopyWebpackPlugin([ 47 | { from: "*.html", context: "src/" }, 48 | ]), 49 | new webpack.SourceMapDevToolPlugin({}) 50 | ] 51 | }; -------------------------------------------------------------------------------- /src/tabContent.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 66 | 67 | 68 | 69 |
70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "azure-pipelines-html-report", 3 | "version": "1.0.8", 4 | "private": true, 5 | "author": "Jakub Rumpca", 6 | "dependencies": { 7 | "@material-ui/core": "^4.10.1", 8 | "@material-ui/icons": "^4.9.1", 9 | "azure-devops-extension-api": "^1.157.0", 10 | "azure-devops-extension-sdk": "^2.0.11", 11 | "azure-devops-ui": "^2.165.1", 12 | "dashify": "^2.0.0", 13 | "material-table": "^1.60.0", 14 | "mustache": "^3.0.1", 15 | "node-fetch": "^2.6.1", 16 | "node-sass": "^4.14.1", 17 | "react": "^16.13.1", 18 | "react-dom": "^16.13.1", 19 | "react-object-inspector": "^0.2.1" 20 | }, 21 | "devDependencies": { 22 | "@types/node": "^13.13.30", 23 | "@types/node-fetch": "^2.5.5", 24 | "@types/react": "^16.9.25", 25 | "@types/react-dom": "^16.9.5", 26 | "base64-inline-loader": "^1.1.1", 27 | "copy-webpack-plugin": "^5.1.1", 28 | "css-loader": "^3.4.2", 29 | "file-loader": "^6.0.0", 30 | "jsdom": "^16.2.1", 31 | "rimraf": "^3.0.2", 32 | "sass-loader": "^8.0.2", 33 | "style-loader": "^1.1.3", 34 | "tfx-cli": "^0.7.11", 35 | "ts-loader": "^6.2.1", 36 | "typescript": "^3.8.3", 37 | "webpack": "^4.42.0", 38 | "webpack-cli": "^3.3.11" 39 | }, 40 | "scripts": { 41 | "clean": "rimraf ./dist", 42 | "build:cidev": "npm run clean && webpack --mode development", 43 | "build": "npm run clean && webpack --mode development", 44 | "postbuild": "npm run package-extension", 45 | "postinstall": "cd PublishHtmlReport && npm install", 46 | "test": "echo No test available", 47 | "prune": "npm prune --production --ignore-scripts", 48 | "package-extension": "tfx extension create --manifest-globs azure-devops-extension.json --overrides-file dev_manifest.json" 49 | }, 50 | "eslintConfig": { 51 | "extends": "react-app" 52 | }, 53 | "browserslist": { 54 | "production": [ 55 | ">0.2%", 56 | "not dead", 57 | "not op_mini all" 58 | ], 59 | "development": [ 60 | "last 1 chrome version", 61 | "last 1 firefox version", 62 | "last 1 safari version" 63 | ] 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /azure-devops-extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifestVersion": 1, 3 | "id": "azure-pipelines-html-report", 4 | "publisher": "JakubRumpca", 5 | "version": "1.0.8", 6 | "author": "Jakub Rumpca", 7 | "name": "Html Viewer Dev", 8 | "description": "Embed HTML report in Azure Pipelines", 9 | "public": false, 10 | "categories": ["Azure Pipelines"], 11 | "icons": { 12 | "default": "icon.png" 13 | }, 14 | "tags": ["Preview"], 15 | "targets": [ 16 | { 17 | "id": "Microsoft.VisualStudio.Services" 18 | } 19 | ], 20 | "repository": { 21 | "type": "git", 22 | "uri": "https://github.com/JakubRumpca/azure-pipeline-html-report" 23 | }, 24 | "content": { 25 | "details": { 26 | "path": "README.md" 27 | }, 28 | "license": { 29 | "path": "LICENSE" 30 | } 31 | }, 32 | "scopes": [ 33 | "vso.build_execute" 34 | ], 35 | "demands": [ 36 | "api-version/3.0" 37 | ], 38 | "contributions": [ 39 | { 40 | "id": "build-html-report-tab", 41 | "type": "ms.vss-build-web.build-results-tab", 42 | "description": "Embed HTML files viewer in Azure Pipelines Release", 43 | "targets": ["ms.vss-build-web.build-results-view"], 44 | "properties": { 45 | "name": "HTML Viewer", 46 | "uri": "dist/tabContent.html", 47 | "registeredObjectId": "registerBuild", 48 | "supportsTasks": ["bf52d8fd-c399-4acd-98c7-a03ceee2a974"], 49 | "dynamic": true 50 | }, 51 | "includes": ["ms.vss-releaseManagement-web.release-service-data-external"] 52 | }, 53 | { 54 | "id": "PublishHtmlReport", 55 | "type": "ms.vss-distributed-task.task", 56 | "targets": ["ms.vss-distributed-task.tasks"], 57 | "properties": { 58 | "name": "PublishHtmlReport", 59 | "displayName": "Publish HTML Report" 60 | } 61 | } 62 | ], 63 | "files": [ 64 | { 65 | "path": "./PublishHtmlReport", 66 | "packagePath": "PublishHtmlReport", 67 | "addressable": false 68 | }, 69 | { 70 | "path": "./dist", 71 | "packagePath": "dist", 72 | "addressable": true 73 | } 74 | ] 75 | } -------------------------------------------------------------------------------- /PublishHtmlReport/index.js: -------------------------------------------------------------------------------- 1 | const tl = require('azure-pipelines-task-lib'); 2 | const { resolve, basename, join } = require('path'); 3 | const dashify = require('dashify') 4 | const globby = require('globby') 5 | const { readFileSync, writeFileSync } = require('fs') 6 | const { load } = require('cheerio') 7 | 8 | function run () { 9 | let reportDir = tl.getPathInput('reportDir', true, true); 10 | 11 | let files = globby.sync([reportDir.replace(/\\/g, '/')], {expandDirectories : {files: ['*'], extensions: ['html']}}) 12 | 13 | const fileProperties = [] 14 | 15 | files.forEach(file => { 16 | tl.debug(`Reading report ${file}`) 17 | const fileContent = readFileSync(file).toString() 18 | const document = load(fileContent) 19 | writeFileSync(file, document.html()) 20 | 21 | const attachmentProperties = { 22 | name: generateName(basename(file)), 23 | type: 'report-html' 24 | } 25 | 26 | fileProperties.push(attachmentProperties) 27 | tl.command('task.addattachment', attachmentProperties, file) 28 | 29 | }) 30 | 31 | const jobName = dashify(tl.getVariable('Agent.JobName')) 32 | const stageName = dashify(tl.getVariable('System.StageDisplayName')) 33 | const stageAttempt = tl.getVariable('System.StageAttempt') 34 | const tabName = tl.getInput('tabName', false ) || 'Html-Report' 35 | const summaryPath = resolve(reportDir) 36 | writeFileSync(summaryPath, JSON.stringify(fileProperties)) 37 | console.log(summaryPath) 38 | tl.addAttachment('report-html', `${tabName}.${jobName}.${stageName}.${stageAttempt}`, summaryPath) 39 | } 40 | function generateName (fileName) { 41 | const jobName = dashify(tl.getVariable('Agent.JobName')) 42 | const stageName = dashify(tl.getVariable('System.StageDisplayName')) 43 | const stageAttempt = tl.getVariable('System.StageAttempt') 44 | const tabName = tl.getInput('tabName', false ) || 'Html-Report' 45 | 46 | return `${tabName}.${jobName}.${stageName}.${stageAttempt}.${fileName}` 47 | } 48 | 49 | try { 50 | let reportDir = tl.getPathInput('reportDir', true, true); 51 | const jobName = dashify(tl.getVariable('Agent.JobName')) 52 | const stageName = dashify(tl.getVariable('System.StageDisplayName')) 53 | const stageAttempt = tl.getVariable('System.StageAttempt') 54 | const tabName = tl.getInput('tabName', false ) || 'Html-Report' 55 | let path = resolve(reportDir) 56 | console.log(path) 57 | tl.addAttachment('report-html', `${tabName}.${jobName}.${stageName}.${stageAttempt}`, path) 58 | } catch (error) { 59 | tl.setResult(tl.TaskResult.SucceededWithIssues, error.message); 60 | } -------------------------------------------------------------------------------- /azure-pipelines.yaml: -------------------------------------------------------------------------------- 1 | steps: 2 | - task: NodeTool@0 3 | inputs: 4 | versionSpec: '12.x' 5 | 6 | - task: Npm@1 7 | displayName: 'NPM: Install Task Dependencies' 8 | inputs: 9 | workingDir: PublishHtmlReport 10 | verbose: false 11 | 12 | - task: Npm@1 13 | displayName: 'npm install extension' 14 | inputs: 15 | workingDir: . 16 | verbose: false 17 | 18 | - task: Npm@1 19 | displayName: 'build extension' 20 | inputs: 21 | command: custom 22 | workingDir: . 23 | verbose: false 24 | customCommand: 'run build:cidev' 25 | 26 | - task: PackageAzureDevOpsExtension@2 27 | displayName: 'TFX: Package Extension Prod' 28 | inputs: 29 | rootFolder: . 30 | patternManifest: 'azure-devops-extension.json' 31 | publisherId: JakubRumpca 32 | extensionId: azure-pipelines-html-report 33 | extensionName: 'Html Viewer' 34 | extensionVisibility: public 35 | extensionPricing: free 36 | condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'main')) 37 | 38 | - task: PackageAzureDevOpsExtension@2 39 | displayName: 'TFX: Package Extension Dev' 40 | inputs: 41 | rootFolder: . 42 | patternManifest: 'azure-devops-extension.json' 43 | publisherId: JakubRumpca 44 | extensionId: azure-pipelines-html-report 45 | extensionTag: dev 46 | extensionName: 'Html Viewer Dev' 47 | extensionVersion: '1.0.$(Build.BuildId)' 48 | updateTasksVersion: true 49 | extensionVisibility: private 50 | extensionPricing: free 51 | condition: and(succeeded(), ne(variables['Build.SourceBranchName'], 'main')) 52 | 53 | - task: PublishAzureDevOpsExtension@2 54 | displayName: 'TFX: Publish Extension Dev' 55 | inputs: 56 | connectedServiceName: JakubMarketPlace 57 | rootFolder: . 58 | patternManifest: 'azure-devops-extension.json' 59 | publisherId: JakubRumpca 60 | extensionId: azure-pipelines-html-report 61 | extensionTag: dev 62 | extensionName: 'Html Viewer Dev' 63 | extensionVersion: '1.0.$(Build.BuildId)' 64 | extensionVisibility: private 65 | extensionPricing: free 66 | condition: and(succeeded(), ne(variables['Build.SourceBranchName'], 'main')) 67 | 68 | - task: ShareAzureDevOpsExtension@2 69 | displayName: 'TFX: Share Extension' 70 | inputs: 71 | connectedServiceName: JakubMarketPlace 72 | method: vsix 73 | vsixFile: '**.vsix' 74 | accounts: 'maciejmaciejewski-dev' 75 | condition: and(succeeded(), ne(variables['Build.SourceBranchName'], 'main')) 76 | 77 | - task: CopyFiles@2 78 | displayName: 'Copy Files' 79 | inputs: 80 | SourceFolder: '$(System.DefaultWorkingDirectory)' 81 | Contents: '**.vsix' 82 | TargetFolder: '$(Build.ArtifactStagingDirectory)/results' 83 | condition: succeededOrFailed() 84 | 85 | - task: PublishBuildArtifacts@1 86 | displayName: 'Publish Artifact' 87 | inputs: 88 | PathtoPublish: '$(Build.ArtifactStagingDirectory)/results' 89 | condition: succeededOrFailed() 90 | -------------------------------------------------------------------------------- /src/tabContent.tsx: -------------------------------------------------------------------------------- 1 | import "./tabContent.scss" 2 | 3 | import * as React from "react" 4 | import * as ReactDOM from "react-dom" 5 | import * as SDK from "azure-devops-extension-sdk" 6 | 7 | import { getClient } from "azure-devops-extension-api" 8 | import { Build, BuildRestClient, Attachment } from "azure-devops-extension-api/Build" 9 | 10 | import { ObservableValue, ObservableObject } from "azure-devops-ui/Core/Observable" 11 | import { Observer } from "azure-devops-ui/Observer" 12 | import { Tab, TabBar, TabSize } from "azure-devops-ui/Tabs" 13 | 14 | 15 | const ATTACHMENT_TYPE = "report-html"; 16 | 17 | SDK.init() 18 | SDK.ready().then(() => { 19 | try { 20 | const config = SDK.getConfiguration() 21 | config.onBuildChanged((build: Build) => { 22 | let buildAttachmentClient = new BuildAttachmentClient(build) 23 | buildAttachmentClient.init().then(() => { 24 | displayReports(buildAttachmentClient) 25 | }).catch(error => {throw new Error(error)}) 26 | }) 27 | } catch(error) { 28 | throw new Error(error) 29 | } 30 | }) 31 | 32 | function displayReports(attachmentClient: AttachmentClient) { 33 | ReactDOM.render(, document.getElementById("html-report-extention-container")) 34 | } 35 | 36 | abstract class AttachmentClient { 37 | protected attachments: Attachment[] = [] 38 | protected authHeaders: Object = undefined 39 | protected reportHtmlContent: string = undefined 40 | constructor() {} 41 | 42 | public getAttachments() : Attachment[] { 43 | return this.attachments 44 | } 45 | 46 | public getDownloadableAttachment(attachmentName: string): Attachment { 47 | const attachment = this.attachments.find((attachment) => { return attachment.name === attachmentName}) 48 | if (!(attachment && attachment._links && attachment._links.self && attachment._links.self.href)) { 49 | throw new Error("Attachment " + attachmentName + " is not downloadable") 50 | } 51 | return attachment 52 | } 53 | 54 | public async getAttachmentContent(attachmentName: string): Promise { 55 | if (this.authHeaders === undefined) { 56 | console.log('Get access token') 57 | const accessToken = await SDK.getAccessToken() 58 | const b64encodedAuth = Buffer.from(':' + accessToken).toString('base64') 59 | this.authHeaders = { headers: {'Authorization': 'Basic ' + b64encodedAuth} } 60 | } 61 | console.log("Get " + attachmentName + " attachment content") 62 | const attachment = this.getDownloadableAttachment(attachmentName) 63 | const response = await fetch(attachment._links.self.href, this.authHeaders) 64 | if (!response.ok) { 65 | throw new Error(response.statusText) 66 | } 67 | const responseText = await response.text() 68 | console.log(responseText) 69 | return responseText 70 | } 71 | 72 | } 73 | 74 | class BuildAttachmentClient extends AttachmentClient { 75 | private build: Build 76 | 77 | constructor(build: Build) { 78 | super() 79 | this.build = build 80 | } 81 | 82 | public async init() { 83 | const buildClient: BuildRestClient = getClient(BuildRestClient) 84 | this.attachments = await buildClient.getAttachments(this.build.project.id, this.build.id, ATTACHMENT_TYPE) 85 | console.log(this.attachments) 86 | } 87 | } 88 | 89 | 90 | interface TaskAttachmentPanelProps { 91 | attachmentClient: AttachmentClient 92 | } 93 | 94 | export default class TaskAttachmentPanel extends React.Component { 95 | private selectedTabId: ObservableValue 96 | private tabContents: ObservableObject 97 | private tabInitialContent: string = '

Loading...

' 98 | 99 | constructor(props: TaskAttachmentPanelProps) { 100 | super(props); 101 | this.selectedTabId = new ObservableValue(props.attachmentClient.getAttachments()[0].name) 102 | this.tabContents = new ObservableObject() 103 | } 104 | 105 | public escapeHTML(str: string) { 106 | return str.replace(/[&<>'"]/g, tag => ({ 107 | '&': '&', 108 | '<': '<', 109 | '>': '>', 110 | "'": ''', 111 | '"': '"' 112 | }[tag] || tag)) 113 | } 114 | 115 | public render() { 116 | const attachments = this.props.attachmentClient.getAttachments() 117 | if (attachments.length == 0) { 118 | return (null) 119 | } else { 120 | const tabs = [] 121 | for (const attachment of attachments) { 122 | const metadata = attachment.name.split('.') 123 | // Conditionally add counter for multistage pipeline 124 | const name = metadata[2] !== '__default' ? `${metadata[2]} #${metadata[3]}` : metadata[0] 125 | 126 | tabs.push() 127 | this.tabContents.add(attachment.name, this.tabInitialContent) 128 | } 129 | return ( 130 |
131 | { attachments.length > 0 ? 132 | 136 | {tabs} 137 | 138 | : null } 139 | 140 | {(props: { selectedTabId: string }) => { 141 | if ( this.tabContents.get(props.selectedTabId) === this.tabInitialContent) { 142 | this.props.attachmentClient.getAttachmentContent(props.selectedTabId).then((content) => { 143 | this.tabContents.set(props.selectedTabId, '') 144 | }) 145 | } 146 | return 147 | }} 148 | 149 |
150 | ); 151 | } 152 | } 153 | 154 | private onSelectedTabChanged = (newTabId: string) => { 155 | this.selectedTabId.value = newTabId; 156 | } 157 | } 158 | 159 | 160 | 161 | -------------------------------------------------------------------------------- /PublishHtmlReport/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "publish-html-report", 3 | "version": "1.0.8", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@nodelib/fs.scandir": { 8 | "version": "2.1.3", 9 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", 10 | "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", 11 | "requires": { 12 | "@nodelib/fs.stat": "2.0.3", 13 | "run-parallel": "^1.1.9" 14 | } 15 | }, 16 | "@nodelib/fs.stat": { 17 | "version": "2.0.3", 18 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", 19 | "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" 20 | }, 21 | "@nodelib/fs.walk": { 22 | "version": "1.2.4", 23 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", 24 | "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", 25 | "requires": { 26 | "@nodelib/fs.scandir": "2.1.3", 27 | "fastq": "^1.6.0" 28 | } 29 | }, 30 | "array-union": { 31 | "version": "2.1.0", 32 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/array-union/-/array-union-2.1.0.tgz", 33 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" 34 | }, 35 | "asap": { 36 | "version": "2.0.6", 37 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/asap/-/asap-2.0.6.tgz", 38 | "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" 39 | }, 40 | "azure-pipelines-task-lib": { 41 | "version": "2.11.3", 42 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/azure-pipelines-task-lib/-/azure-pipelines-task-lib-2.11.3.tgz", 43 | "integrity": "sha512-gXops6Npkloh7AKPIvptx0KY1kdf1yd+BFdp/ksnbyW7CS3uXzBQXU1Dermr7A895TrOd02PI6hmsL8cBlePNA==", 44 | "requires": { 45 | "minimatch": "3.0.4", 46 | "mockery": "^1.7.0", 47 | "q": "^1.1.2", 48 | "semver": "^5.1.0", 49 | "shelljs": "^0.3.0", 50 | "sync-request": "3.0.1", 51 | "uuid": "^3.0.1" 52 | } 53 | }, 54 | "balanced-match": { 55 | "version": "1.0.0", 56 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/balanced-match/-/balanced-match-1.0.0.tgz", 57 | "integrity": "sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==" 58 | }, 59 | "boolbase": { 60 | "version": "1.0.0", 61 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/boolbase/-/boolbase-1.0.0.tgz", 62 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" 63 | }, 64 | "brace-expansion": { 65 | "version": "1.1.11", 66 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/brace-expansion/-/brace-expansion-1.1.11.tgz", 67 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 68 | "requires": { 69 | "balanced-match": "^1.0.0", 70 | "concat-map": "0.0.1" 71 | } 72 | }, 73 | "braces": { 74 | "version": "3.0.2", 75 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/braces/-/braces-3.0.2.tgz", 76 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 77 | "requires": { 78 | "fill-range": "^7.0.1" 79 | } 80 | }, 81 | "buffer-from": { 82 | "version": "1.1.1", 83 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/buffer-from/-/buffer-from-1.1.1.tgz", 84 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 85 | }, 86 | "caseless": { 87 | "version": "0.11.0", 88 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/caseless/-/caseless-0.11.0.tgz", 89 | "integrity": "sha512-ODLXH644w9C2fMPAm7bMDQ3GRvipZWZfKc+8As6hIadRIelE0n0xZuN38NS6kiK3KPEVrpymmQD8bvncAHWQkQ==" 90 | }, 91 | "cheerio": { 92 | "version": "1.0.0-rc.5", 93 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/cheerio/-/cheerio-1.0.0-rc.5.tgz", 94 | "integrity": "sha512-yoqps/VCaZgN4pfXtenwHROTp8NG6/Hlt4Jpz2FEP0ZJQ+ZUkVDd0hAPDNKhj3nakpfPt/CNs57yEtxD1bXQiw==", 95 | "requires": { 96 | "cheerio-select-tmp": "^0.1.0", 97 | "dom-serializer": "~1.2.0", 98 | "domhandler": "^4.0.0", 99 | "entities": "~2.1.0", 100 | "htmlparser2": "^6.0.0", 101 | "parse5": "^6.0.0", 102 | "parse5-htmlparser2-tree-adapter": "^6.0.0" 103 | } 104 | }, 105 | "cheerio-select-tmp": { 106 | "version": "0.1.1", 107 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/cheerio-select-tmp/-/cheerio-select-tmp-0.1.1.tgz", 108 | "integrity": "sha512-YYs5JvbpU19VYJyj+F7oYrIE2BOll1/hRU7rEy/5+v9BzkSo3bK81iAeeQEMI92vRIxz677m72UmJUiVwwgjfQ==", 109 | "requires": { 110 | "css-select": "^3.1.2", 111 | "css-what": "^4.0.0", 112 | "domelementtype": "^2.1.0", 113 | "domhandler": "^4.0.0", 114 | "domutils": "^2.4.4" 115 | } 116 | }, 117 | "concat-map": { 118 | "version": "0.0.1", 119 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/concat-map/-/concat-map-0.0.1.tgz", 120 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 121 | }, 122 | "concat-stream": { 123 | "version": "1.6.2", 124 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/concat-stream/-/concat-stream-1.6.2.tgz", 125 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 126 | "requires": { 127 | "buffer-from": "^1.0.0", 128 | "inherits": "^2.0.3", 129 | "readable-stream": "^2.2.2", 130 | "typedarray": "^0.0.6" 131 | } 132 | }, 133 | "core-util-is": { 134 | "version": "1.0.2", 135 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/core-util-is/-/core-util-is-1.0.2.tgz", 136 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" 137 | }, 138 | "css-select": { 139 | "version": "3.1.2", 140 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/css-select/-/css-select-3.1.2.tgz", 141 | "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==", 142 | "requires": { 143 | "boolbase": "^1.0.0", 144 | "css-what": "^4.0.0", 145 | "domhandler": "^4.0.0", 146 | "domutils": "^2.4.3", 147 | "nth-check": "^2.0.0" 148 | } 149 | }, 150 | "css-what": { 151 | "version": "4.0.0", 152 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/css-what/-/css-what-4.0.0.tgz", 153 | "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==" 154 | }, 155 | "dashify": { 156 | "version": "2.0.0", 157 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/dashify/-/dashify-2.0.0.tgz", 158 | "integrity": "sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==" 159 | }, 160 | "dir-glob": { 161 | "version": "3.0.1", 162 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/dir-glob/-/dir-glob-3.0.1.tgz", 163 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 164 | "requires": { 165 | "path-type": "^4.0.0" 166 | } 167 | }, 168 | "dom-serializer": { 169 | "version": "1.2.0", 170 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/dom-serializer/-/dom-serializer-1.2.0.tgz", 171 | "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==", 172 | "requires": { 173 | "domelementtype": "^2.0.1", 174 | "domhandler": "^4.0.0", 175 | "entities": "^2.0.0" 176 | } 177 | }, 178 | "domelementtype": { 179 | "version": "2.1.0", 180 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/domelementtype/-/domelementtype-2.1.0.tgz", 181 | "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==" 182 | }, 183 | "domhandler": { 184 | "version": "4.0.0", 185 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/domhandler/-/domhandler-4.0.0.tgz", 186 | "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", 187 | "requires": { 188 | "domelementtype": "^2.1.0" 189 | } 190 | }, 191 | "domutils": { 192 | "version": "2.4.4", 193 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/domutils/-/domutils-2.4.4.tgz", 194 | "integrity": "sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==", 195 | "requires": { 196 | "dom-serializer": "^1.0.1", 197 | "domelementtype": "^2.0.1", 198 | "domhandler": "^4.0.0" 199 | } 200 | }, 201 | "entities": { 202 | "version": "2.1.0", 203 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/entities/-/entities-2.1.0.tgz", 204 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" 205 | }, 206 | "fast-glob": { 207 | "version": "3.2.4", 208 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/fast-glob/-/fast-glob-3.2.4.tgz", 209 | "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", 210 | "requires": { 211 | "@nodelib/fs.stat": "^2.0.2", 212 | "@nodelib/fs.walk": "^1.2.3", 213 | "glob-parent": "^5.1.0", 214 | "merge2": "^1.3.0", 215 | "micromatch": "^4.0.2", 216 | "picomatch": "^2.2.1" 217 | } 218 | }, 219 | "fastq": { 220 | "version": "1.9.0", 221 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/fastq/-/fastq-1.9.0.tgz", 222 | "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", 223 | "requires": { 224 | "reusify": "^1.0.4" 225 | } 226 | }, 227 | "fill-range": { 228 | "version": "7.0.1", 229 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/fill-range/-/fill-range-7.0.1.tgz", 230 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 231 | "requires": { 232 | "to-regex-range": "^5.0.1" 233 | } 234 | }, 235 | "fs": { 236 | "version": "0.0.2", 237 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/fs/-/fs-0.0.2.tgz", 238 | "integrity": "sha512-YAiVokMCrSIFZiroB1oz51hPiPRVcUtSa4x2U5RYXyhS9VAPdiFigKbPTnOSq7XY8wd3FIVPYmXpo5lMzFmxgg==" 239 | }, 240 | "fs-extra": { 241 | "version": "8.1.0", 242 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/fs-extra/-/fs-extra-8.1.0.tgz", 243 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 244 | "requires": { 245 | "graceful-fs": "^4.2.0", 246 | "jsonfile": "^4.0.0", 247 | "universalify": "^0.1.0" 248 | } 249 | }, 250 | "glob-parent": { 251 | "version": "5.1.1", 252 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/glob-parent/-/glob-parent-5.1.1.tgz", 253 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 254 | "requires": { 255 | "is-glob": "^4.0.1" 256 | } 257 | }, 258 | "globby": { 259 | "version": "11.0.1", 260 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/globby/-/globby-11.0.1.tgz", 261 | "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", 262 | "requires": { 263 | "array-union": "^2.1.0", 264 | "dir-glob": "^3.0.1", 265 | "fast-glob": "^3.1.1", 266 | "ignore": "^5.1.4", 267 | "merge2": "^1.3.0", 268 | "slash": "^3.0.0" 269 | } 270 | }, 271 | "graceful-fs": { 272 | "version": "4.2.4", 273 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/graceful-fs/-/graceful-fs-4.2.4.tgz", 274 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 275 | }, 276 | "hat": { 277 | "version": "0.0.3", 278 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/hat/-/hat-0.0.3.tgz", 279 | "integrity": "sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==" 280 | }, 281 | "htmlparser2": { 282 | "version": "6.0.0", 283 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/htmlparser2/-/htmlparser2-6.0.0.tgz", 284 | "integrity": "sha512-numTQtDZMoh78zJpaNdJ9MXb2cv5G3jwUoe3dMQODubZvLoGvTE/Ofp6sHvH8OGKcN/8A47pGLi/k58xHP/Tfw==", 285 | "requires": { 286 | "domelementtype": "^2.0.1", 287 | "domhandler": "^4.0.0", 288 | "domutils": "^2.4.4", 289 | "entities": "^2.0.0" 290 | } 291 | }, 292 | "http-basic": { 293 | "version": "2.5.1", 294 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/http-basic/-/http-basic-2.5.1.tgz", 295 | "integrity": "sha1-jORHvbW2xXf4pj4/p4BW7Eu02/s=", 296 | "requires": { 297 | "caseless": "~0.11.0", 298 | "concat-stream": "^1.4.6", 299 | "http-response-object": "^1.0.0" 300 | } 301 | }, 302 | "http-response-object": { 303 | "version": "1.1.0", 304 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/http-response-object/-/http-response-object-1.1.0.tgz", 305 | "integrity": "sha1-p8TnWq6C87tJBOT0P2FWc7TVGMM=" 306 | }, 307 | "ignore": { 308 | "version": "5.1.8", 309 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/ignore/-/ignore-5.1.8.tgz", 310 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" 311 | }, 312 | "inherits": { 313 | "version": "2.0.4", 314 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/inherits/-/inherits-2.0.4.tgz", 315 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 316 | }, 317 | "is-extglob": { 318 | "version": "2.1.1", 319 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/is-extglob/-/is-extglob-2.1.1.tgz", 320 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 321 | }, 322 | "is-glob": { 323 | "version": "4.0.1", 324 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/is-glob/-/is-glob-4.0.1.tgz", 325 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 326 | "requires": { 327 | "is-extglob": "^2.1.1" 328 | } 329 | }, 330 | "is-number": { 331 | "version": "7.0.0", 332 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/is-number/-/is-number-7.0.0.tgz", 333 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 334 | }, 335 | "isarray": { 336 | "version": "1.0.0", 337 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/isarray/-/isarray-1.0.0.tgz", 338 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 339 | }, 340 | "jsonfile": { 341 | "version": "4.0.0", 342 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/jsonfile/-/jsonfile-4.0.0.tgz", 343 | "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", 344 | "requires": { 345 | "graceful-fs": "^4.1.6" 346 | } 347 | }, 348 | "merge2": { 349 | "version": "1.4.1", 350 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/merge2/-/merge2-1.4.1.tgz", 351 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 352 | }, 353 | "micromatch": { 354 | "version": "4.0.2", 355 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/micromatch/-/micromatch-4.0.2.tgz", 356 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 357 | "requires": { 358 | "braces": "^3.0.1", 359 | "picomatch": "^2.0.5" 360 | } 361 | }, 362 | "minimatch": { 363 | "version": "3.0.4", 364 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/minimatch/-/minimatch-3.0.4.tgz", 365 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 366 | "requires": { 367 | "brace-expansion": "^1.1.7" 368 | } 369 | }, 370 | "mockery": { 371 | "version": "1.7.0", 372 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/mockery/-/mockery-1.7.0.tgz", 373 | "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" 374 | }, 375 | "nth-check": { 376 | "version": "2.0.0", 377 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/nth-check/-/nth-check-2.0.0.tgz", 378 | "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", 379 | "requires": { 380 | "boolbase": "^1.0.0" 381 | } 382 | }, 383 | "parse5": { 384 | "version": "6.0.1", 385 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/parse5/-/parse5-6.0.1.tgz", 386 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" 387 | }, 388 | "parse5-htmlparser2-tree-adapter": { 389 | "version": "6.0.1", 390 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", 391 | "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", 392 | "requires": { 393 | "parse5": "^6.0.1" 394 | } 395 | }, 396 | "path-type": { 397 | "version": "4.0.0", 398 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/path-type/-/path-type-4.0.0.tgz", 399 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" 400 | }, 401 | "picomatch": { 402 | "version": "2.2.2", 403 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/picomatch/-/picomatch-2.2.2.tgz", 404 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" 405 | }, 406 | "process-nextick-args": { 407 | "version": "2.0.1", 408 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 409 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 410 | }, 411 | "promise": { 412 | "version": "7.3.1", 413 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/promise/-/promise-7.3.1.tgz", 414 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 415 | "requires": { 416 | "asap": "~2.0.3" 417 | } 418 | }, 419 | "q": { 420 | "version": "1.5.1", 421 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/q/-/q-1.5.1.tgz", 422 | "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" 423 | }, 424 | "qs": { 425 | "version": "6.9.4", 426 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/qs/-/qs-6.9.4.tgz", 427 | "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" 428 | }, 429 | "readable-stream": { 430 | "version": "2.3.7", 431 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/readable-stream/-/readable-stream-2.3.7.tgz", 432 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 433 | "requires": { 434 | "core-util-is": "~1.0.0", 435 | "inherits": "~2.0.3", 436 | "isarray": "~1.0.0", 437 | "process-nextick-args": "~2.0.0", 438 | "safe-buffer": "~5.1.1", 439 | "string_decoder": "~1.1.1", 440 | "util-deprecate": "~1.0.1" 441 | } 442 | }, 443 | "reusify": { 444 | "version": "1.0.4", 445 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/reusify/-/reusify-1.0.4.tgz", 446 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 447 | }, 448 | "run-parallel": { 449 | "version": "1.1.10", 450 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/run-parallel/-/run-parallel-1.1.10.tgz", 451 | "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" 452 | }, 453 | "safe-buffer": { 454 | "version": "5.1.2", 455 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/safe-buffer/-/safe-buffer-5.1.2.tgz", 456 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 457 | }, 458 | "semver": { 459 | "version": "5.7.1", 460 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/semver/-/semver-5.7.1.tgz", 461 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 462 | }, 463 | "shelljs": { 464 | "version": "0.3.0", 465 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/shelljs/-/shelljs-0.3.0.tgz", 466 | "integrity": "sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==" 467 | }, 468 | "slash": { 469 | "version": "3.0.0", 470 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/slash/-/slash-3.0.0.tgz", 471 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" 472 | }, 473 | "string_decoder": { 474 | "version": "1.1.1", 475 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/string_decoder/-/string_decoder-1.1.1.tgz", 476 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 477 | "requires": { 478 | "safe-buffer": "~5.1.0" 479 | } 480 | }, 481 | "sync-request": { 482 | "version": "3.0.1", 483 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/sync-request/-/sync-request-3.0.1.tgz", 484 | "integrity": "sha1-yqEjWq+Im6UBB2oYNMQ2gwqC+3M=", 485 | "requires": { 486 | "concat-stream": "^1.4.7", 487 | "http-response-object": "^1.0.1", 488 | "then-request": "^2.0.1" 489 | } 490 | }, 491 | "then-request": { 492 | "version": "2.2.0", 493 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/then-request/-/then-request-2.2.0.tgz", 494 | "integrity": "sha1-ZnizL6DKIY/laZgbvYhxtZQGDYE=", 495 | "requires": { 496 | "caseless": "~0.11.0", 497 | "concat-stream": "^1.4.7", 498 | "http-basic": "^2.5.1", 499 | "http-response-object": "^1.1.0", 500 | "promise": "^7.1.1", 501 | "qs": "^6.1.0" 502 | } 503 | }, 504 | "to-regex-range": { 505 | "version": "5.0.1", 506 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/to-regex-range/-/to-regex-range-5.0.1.tgz", 507 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 508 | "requires": { 509 | "is-number": "^7.0.0" 510 | } 511 | }, 512 | "typedarray": { 513 | "version": "0.0.6", 514 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/typedarray/-/typedarray-0.0.6.tgz", 515 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" 516 | }, 517 | "universalify": { 518 | "version": "0.1.2", 519 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/universalify/-/universalify-0.1.2.tgz", 520 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 521 | }, 522 | "util-deprecate": { 523 | "version": "1.0.2", 524 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/util-deprecate/-/util-deprecate-1.0.2.tgz", 525 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 526 | }, 527 | "uuid": { 528 | "version": "3.4.0", 529 | "resolved": "https://alm-npmjs/nexus/repository/npm_group/uuid/-/uuid-3.4.0.tgz", 530 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 531 | } 532 | } 533 | } 534 | --------------------------------------------------------------------------------