From 8052a8ed9227c042347d311987506b7d581cc6a1 Mon Sep 17 00:00:00 2001 From: Yevhen Vydolob Date: Wed, 20 May 2020 12:42:07 +0300 Subject: [PATCH 1/5] #277 show condition run as child for taskrun Signed-off-by: Yevhen Vydolob --- src/tekton.d.ts | 1 + src/tekton/tektonitem.ts | 6 - src/tkn.ts | 127 +- test/clustertask.json | 2303 -------------------------------- test/extension.test.ts | 7 - test/pipelinerun.json | 172 +++ test/tekton/taskrun.test.ts | 7 - test/tekton/tektonitem.test.ts | 21 - test/tkn.test.ts | 195 +-- 9 files changed, 302 insertions(+), 2537 deletions(-) delete mode 100644 test/clustertask.json create mode 100644 test/pipelinerun.json diff --git a/src/tekton.d.ts b/src/tekton.d.ts index a42951b3..bde29383 100644 --- a/src/tekton.d.ts +++ b/src/tekton.d.ts @@ -110,6 +110,7 @@ export interface ConditionCheckStatus { startTime?: string; completionTime?: string; check?: ContainerState; + conditions?: PipelineRunConditions[]; } export interface PipelineRunConditionCheckStatus { diff --git a/src/tekton/tektonitem.ts b/src/tekton/tektonitem.ts index 008b78bf..734cdf05 100644 --- a/src/tekton/tektonitem.ts +++ b/src/tekton/tektonitem.ts @@ -50,12 +50,6 @@ export abstract class TektonItem { return taskList; } - static async getTaskRunNames(taskRun: TektonNode): Promise { - const taskRunList: Array = await TektonItem.tkn.getTaskRunsForPipelineRun(taskRun); - if (taskRunList.length === 0) { throw Error(errorMessage.TaskRun); } - return taskRunList; - } - static async getPipelineResourceNames(pipelineResource: TektonNode): Promise { const pipelineResourceList: Array = await TektonItem.tkn.getPipelineResources(pipelineResource); if (pipelineResourceList.length === 0) { throw Error(errorMessage.PipelineResource); } diff --git a/src/tkn.ts b/src/tkn.ts index d573353c..4bc6e968 100644 --- a/src/tkn.ts +++ b/src/tkn.ts @@ -10,7 +10,7 @@ import * as path from 'path'; import { ToolsConfig } from './tools'; import format = require('string-format'); import humanize = require('humanize-duration'); -import { TknPipelineResource, TknTask, PipelineRunData } from './tekton'; +import { TknPipelineResource, TknTask, PipelineRunData, TaskRun as RawTaskRun, PipelineRunConditionCheckStatus } from './tekton'; import { kubectl } from './kubectl'; import { pipelineExplorer } from './pipeline/pipelineExplorer'; import { StartObject } from './tekton/pipelinecontent'; @@ -74,6 +74,7 @@ export enum ContextType { CONDITIONSNODE = 'conditionsnode', CONDITIONS = 'conditions', PIPELINERUNNODE = 'pipelinerunnode', + CONDITIONRUN = 'conditionrunnode', } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -394,7 +395,7 @@ export class TektonNodeImpl implements TektonNode { pipelinerun: { icon: 'running.gif', tooltip: 'PipelineRun: {label}', - getChildren: () => this.tkn.getTaskRunsForPipelineRun(this) + getChildren: () => [] }, task: { icon: 'T.svg', @@ -406,6 +407,11 @@ export class TektonNodeImpl implements TektonNode { tooltip: 'TaskRun: {label}', getChildren: () => [] }, + conditionrunnode: { + icon: 'running.gif', + tooltip: 'ConditionRun: {label}', + getChildren: () => [] + }, clustertask: { icon: 'CT.svg', tooltip: 'Clustertask: {label}', @@ -476,7 +482,7 @@ export class TektonNodeImpl implements TektonNode { constructor(private parent: TektonNode, public readonly name: string, public readonly contextValue: ContextType, - private readonly tkn: Tkn, + protected readonly tkn: Tkn, public readonly collapsibleState: TreeItemCollapsibleState = TreeItemCollapsibleState.Collapsed, public readonly creationTime?: string, public readonly state?: string) { @@ -588,19 +594,86 @@ export class TaskRun extends TektonNodeImpl { } } +export abstract class BaseTaskRun extends TektonNodeImpl { + constructor(parent: TektonNode, + name: string, + contextType: ContextType, + tkn: Tkn, + collapsibleState: TreeItemCollapsibleState, + creationTime: string, + protected finished: string | undefined, + state: string) { + super(parent, name, contextType, tkn, collapsibleState, creationTime, state); + } + + get description(): string { + let r = ''; + if (this.getParent().contextValue === ContextType.TASK) { + if (this.creationTime) { + r = 'started ' + humanizer(Date.now() - Date.parse(this.creationTime)) + ' ago, finished in ' + humanizer(Date.parse(this.finished) - Date.parse(this.creationTime)); + } else { + r = 'started ' + humanizer(Date.now() - Date.parse(this.creationTime)) + ' ago, running for ' + humanizer(Date.now() - Date.parse(this.creationTime)); + } + } else { + if (this.finished) { + r = 'finished in ' + humanizer(Date.parse(this.finished) - Date.parse(this.creationTime)); + } else { + r = 'running for ' + humanizer(Date.now() - Date.parse(this.creationTime)); + } + } + return r; + } +} + +export class ConditionRun extends BaseTaskRun { + constructor(parent: TektonNode, name: string, tkn: Tkn, item: PipelineRunConditionCheckStatus) { + super(parent, name, ContextType.CONDITIONRUN, tkn, TreeItemCollapsibleState.None, item.status?.startTime, item.status?.completionTime, item.status?.conditions[0]?.status) + } +} + +export class TaskRunFromPipeline extends BaseTaskRun { + constructor(parent: TektonNode, name: string, tkn: Tkn, private rawTaskRun: RawTaskRun) { + super(parent, + name, + ContextType.TASKRUN, + tkn, + rawTaskRun.conditionChecks ? TreeItemCollapsibleState.Expanded : TreeItemCollapsibleState.None, + rawTaskRun.status.startTime, + rawTaskRun.status?.completionTime, + rawTaskRun.status ? rawTaskRun.status.conditions[0].status : ''); + } + + get label(): string { + return this.name; + } + + getChildren(): ProviderResult { + if (this.rawTaskRun.conditionChecks) { + const result = [] + for (const conditionName in this.rawTaskRun.conditionChecks) { + const rawCondition = this.rawTaskRun.conditionChecks[conditionName]; + result.push(new ConditionRun(this, rawCondition.conditionName, this.tkn, rawCondition)); + + } + return result.sort(compareTimeNewestFirst); + } else { + return super.getChildren(); + } + } +} export class PipelineRun extends TektonNodeImpl { private started: string; private finished: string; - private generateName: string; + private item: PipelineRunData; constructor(parent: TektonNode, name: string, tkn: Tkn, item: PipelineRunData, collapsibleState: TreeItemCollapsibleState) { super(parent, name, ContextType.PIPELINERUN, tkn, collapsibleState, item.metadata.creationTimestamp, item.status ? item.status.conditions[0].status : ''); this.started = item.metadata.creationTimestamp; - this.generateName = item.metadata.generateName; this.finished = item.status?.completionTime; + this.item = item; } get label(): string { @@ -616,6 +689,20 @@ export class PipelineRun extends TektonNodeImpl { } return r; } + + getChildren(): ProviderResult { + const result = []; + const tasks = this.item.status?.taskRuns; + if (!tasks) { + return result; + } + for (const task in tasks) { + const taskRun = tasks[task]; + result.push(new TaskRunFromPipeline(this, taskRun.pipelineTaskName, this.tkn, taskRun)); + } + + return result.sort(compareTimeNewestFirst); + } } export class MoreNode extends TreeItem implements TektonNode { @@ -664,7 +751,6 @@ export interface Tkn { getPipelineResources(pipelineResources: TektonNode): Promise; getTasks(task: TektonNode): Promise; getRawTasks(): Promise; - getTaskRunsForPipelineRun(taskRun: TektonNode): Promise; getClusterTasks(clustertask: TektonNode): Promise; getRawClusterTasks(): Promise; execute(command: CliCommand, cwd?: string, fail?: boolean): Promise; @@ -718,7 +804,7 @@ export class TknImpl implements Tkn { } if (result.error && getStderrString(result.error).indexOf('You must be logged in to the server (Unauthorized)') > -1) { const tknMessage = 'Please login to the server.'; - return [ new TektonNodeImpl(null, tknMessage, ContextType.TKN_DOWN, this, TreeItemCollapsibleState.None)] + return [new TektonNodeImpl(null, tknMessage, ContextType.TKN_DOWN, this, TreeItemCollapsibleState.None)] } if (result.error && getStderrString(result.error).indexOf('the server doesn\'t have a resource type \'pipeline\'') > -1) { const tknDownMsg = 'Please install the OpenShift Pipelines Operator.'; @@ -893,33 +979,6 @@ export class TknImpl implements Tkn { return data.map((value) => new TaskRun(taskRun, value.metadata.name, this, value)).sort(compareTimeNewestFirst); } - async getTaskRunsForPipelineRun(pipelineRun: TektonNode): Promise { - if (!pipelineRun.visibleChildren) { - pipelineRun.visibleChildren = this.defaultPageSize; - } - - const taskRuns = await this._getTaskRunsForPipelineRun(pipelineRun); - - return this.limitView(pipelineRun, taskRuns); - } - - async _getTaskRunsForPipelineRun(pipelinerun: TektonNode): Promise { - const result = await this.execute(Command.listTaskRunsForPipelineRun(pipelinerun.getName())); - if (result.error) { - console.log(result + ' Std.err when processing pipelines'); - return [new TektonNodeImpl(pipelinerun, getStderrString(result.error), ContextType.TASKRUN, this, TreeItemCollapsibleState.Expanded)]; - } - let data: PipelineTaskRunData[] = []; - try { - data = JSON.parse(result.stdout).items; - // eslint-disable-next-line no-empty - } catch (ignore) { - } - - return data - .map((value) => new TaskRun(pipelinerun, value.metadata.name, this, value)) - .sort(compareTimeNewestFirst); - } async getPipelines(pipeline: TektonNode): Promise { return this._getPipelines(pipeline); diff --git a/test/clustertask.json b/test/clustertask.json deleted file mode 100644 index ab38833e..00000000 --- a/test/clustertask.json +++ /dev/null @@ -1,2303 +0,0 @@ -[ - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "buildah", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/buildah", - "uid": "439b5b24-c02e-4a10-8358-5ecf1cd5fed1", - "resourceVersion": "78656", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:53Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "BUILDER_IMAGE", - "type": "string", - "description": "The location of the buildah builder image.", - "default": "quay.io/buildah/stable:v1.11.0" - }, - { - "name": "DOCKERFILE", - "type": "string", - "description": "Path to the Dockerfile to build.", - "default": "./Dockerfile" - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "build", - "image": "$(inputs.params.BUILDER_IMAGE)", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "$(inputs.params.DOCKERFILE)", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "$(inputs.params.BUILDER_IMAGE)", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "buildah-v0-8-0", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/buildah-v0-8-0", - "uid": "9b9b409f-d894-4805-9859-4c3842f72967", - "resourceVersion": "78657", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:53Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "BUILDER_IMAGE", - "type": "string", - "description": "The location of the buildah builder image.", - "default": "quay.io/buildah/stable:v1.11.0" - }, - { - "name": "DOCKERFILE", - "type": "string", - "description": "Path to the Dockerfile to build.", - "default": "./Dockerfile" - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "build", - "image": "$(inputs.params.BUILDER_IMAGE)", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "$(inputs.params.DOCKERFILE)", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "$(inputs.params.BUILDER_IMAGE)", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "example-cluster-task", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/example-cluster-task", - "uid": "9f432731-5492-4169-b297-bee09dc2cdbf", - "resourceVersion": "320397", - "generation": 1, - "creationTimestamp": "2020-01-21T02:18:59Z" - }, - "spec": { - "inputs": { - "params": [ - { - "name": "appName", - "type": "string" - } - ] - }, - "steps": [ - { - "name": "", - "image": "registry.redhat.io/ubi7/ubi-minimal", - "command": [ - "/bin/bash", - "-c", - "echo", - "$(inputs.params.appName)" - ], - "resources": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "openshift-client", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/openshift-client", - "uid": "67f97279-bc47-4032-95ac-f21a210255f3", - "resourceVersion": "78662", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:53Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "params": [ - { - "name": "ARGS", - "type": "array", - "description": "The OpenShift CLI arguments to run", - "default": [ - "help" - ] - } - ] - }, - "steps": [ - { - "name": "oc", - "image": "quay.io/openshift/origin-cli:latest", - "command": [ - "/usr/bin/oc" - ], - "args": [ - "$(inputs.params.ARGS)" - ], - "resources": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "openshift-client-v0-8-0", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/openshift-client-v0-8-0", - "uid": "5417e8f7-d10c-464d-b7ba-f15c92ca1e9d", - "resourceVersion": "78666", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:54Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "params": [ - { - "name": "ARGS", - "type": "array", - "description": "The OpenShift CLI arguments to run", - "default": [ - "help" - ] - } - ] - }, - "steps": [ - { - "name": "oc", - "image": "quay.io/openshift/origin-cli:latest", - "command": [ - "/usr/bin/oc" - ], - "args": [ - "$(inputs.params.ARGS)" - ], - "resources": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i", - "uid": "9bf60e52-d308-40f8-aa26-433588319811", - "resourceVersion": "78670", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:54Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "BUILDER_IMAGE", - "type": "string", - "description": "The location of the s2i builder image." - }, - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from.", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - }, - { - "name": "LOGLEVEL", - "type": "string", - "description": "Log level when running the S2I binary", - "default": "0" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i:nightly", - "command": [ - "/usr/local/bin/s2i", - "--loglevel=$(inputs.params.LOGLEVEL)", - "build", - "$(inputs.params.PATH_CONTEXT)", - "$(inputs.params.BUILDER_IMAGE)", - "--as-dockerfile", - "/gen-source/Dockerfile.gen" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-go", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-go", - "uid": "5a9b36c5-55c1-4cfe-9806-7f3218531029", - "resourceVersion": "78675", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:55Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from.", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/devtools/go-toolset-rhel7", - "--as-dockerfile", - "/gen-source/Dockerfile.gen" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-go-v0-8-0", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-go-v0-8-0", - "uid": "9b4324da-bdea-4427-8136-dfa48b8d6d0c", - "resourceVersion": "78678", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:55Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from.", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/devtools/go-toolset-rhel7", - "--as-dockerfile", - "/gen-source/Dockerfile.gen" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-java-11", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-java-11", - "uid": "9bcb84b1-fc11-4cf3-8f69-02c9322f0e93", - "resourceVersion": "78680", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:56Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - }, - { - "name": "MAVEN_ARGS_APPEND", - "type": "string", - "description": "Additional Maven arguments", - "default": "" - }, - { - "name": "MAVEN_CLEAR_REPO", - "type": "string", - "description": "Remove the Maven repository after the artifact is built", - "default": "false" - }, - { - "name": "MAVEN_MIRROR_URL", - "type": "string", - "description": "The base URL of a mirror used for retrieving artifacts", - "default": "" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "gen-env-file", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "/bin/sh", - "-c" - ], - "args": [ - "echo \"MAVEN_CLEAR_REPO=$(inputs.params.MAVEN_CLEAR_REPO)\" \u003e env-file\n\n[[ '$(inputs.params.MAVEN_ARGS_APPEND)' != \"\" ]] \u0026\u0026\n echo \"MAVEN_ARGS_APPEND=$(inputs.params.MAVEN_ARGS_APPEND)\" \u003e\u003e env-file\n\n[[ '$(inputs.params.MAVEN_MIRROR_URL)' != \"\" ]] \u0026\u0026\n echo \"MAVEN_MIRROR_URL=$(inputs.params.MAVEN_MIRROR_URL)\" \u003e\u003e env-file\n\necho \"Generated Env file\"\necho \"------------------------------\"\ncat env-file\necho \"------------------------------\"" - ], - "workingDir": "/env-params", - "resources": {}, - "volumeMounts": [ - { - "name": "envparams", - "mountPath": "/env-params" - } - ] - }, - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/openjdk/openjdk-11-rhel7", - "--image-scripts-url", - "image:///usr/local/s2i", - "--as-dockerfile", - "/gen-source/Dockerfile.gen", - "--environment-file", - "/env-params/env-file" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - }, - { - "name": "envparams", - "mountPath": "/env-params" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - }, - { - "name": "envparams", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-java-11-v0-8-0", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-java-11-v0-8-0", - "uid": "e65d1bbb-52a0-4c32-aa42-0105cc916faf", - "resourceVersion": "78682", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:56Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - }, - { - "name": "MAVEN_ARGS_APPEND", - "type": "string", - "description": "Additional Maven arguments", - "default": "" - }, - { - "name": "MAVEN_CLEAR_REPO", - "type": "string", - "description": "Remove the Maven repository after the artifact is built", - "default": "false" - }, - { - "name": "MAVEN_MIRROR_URL", - "type": "string", - "description": "The base URL of a mirror used for retrieving artifacts", - "default": "" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "gen-env-file", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "/bin/sh", - "-c" - ], - "args": [ - "echo \"MAVEN_CLEAR_REPO=$(inputs.params.MAVEN_CLEAR_REPO)\" \u003e env-file\n\n[[ '$(inputs.params.MAVEN_ARGS_APPEND)' != \"\" ]] \u0026\u0026\n echo \"MAVEN_ARGS_APPEND=$(inputs.params.MAVEN_ARGS_APPEND)\" \u003e\u003e env-file\n\n[[ '$(inputs.params.MAVEN_MIRROR_URL)' != \"\" ]] \u0026\u0026\n echo \"MAVEN_MIRROR_URL=$(inputs.params.MAVEN_MIRROR_URL)\" \u003e\u003e env-file\n\necho \"Generated Env file\"\necho \"------------------------------\"\ncat env-file\necho \"------------------------------\"" - ], - "workingDir": "/env-params", - "resources": {}, - "volumeMounts": [ - { - "name": "envparams", - "mountPath": "/env-params" - } - ] - }, - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/openjdk/openjdk-11-rhel7", - "--image-scripts-url", - "image:///usr/local/s2i", - "--as-dockerfile", - "/gen-source/Dockerfile.gen", - "--environment-file", - "/env-params/env-file" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - }, - { - "name": "envparams", - "mountPath": "/env-params" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - }, - { - "name": "envparams", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-java-8", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-java-8", - "uid": "9c745856-a38d-453b-8baa-c23e2efba838", - "resourceVersion": "78683", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:56Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - }, - { - "name": "MAVEN_ARGS_APPEND", - "type": "string", - "description": "Additional Maven arguments", - "default": "" - }, - { - "name": "MAVEN_CLEAR_REPO", - "type": "string", - "description": "Remove the Maven repository after the artifact is built", - "default": "false" - }, - { - "name": "MAVEN_MIRROR_URL", - "type": "string", - "description": "The base URL of a mirror used for retrieving artifacts", - "default": "" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "gen-env-file", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "/bin/sh", - "-c" - ], - "args": [ - "echo \"MAVEN_CLEAR_REPO=$(inputs.params.MAVEN_CLEAR_REPO)\" \u003e env-file\n\n[[ '$(inputs.params.MAVEN_ARGS_APPEND)' != \"\" ]] \u0026\u0026\n echo \"MAVEN_ARGS_APPEND=$(inputs.params.MAVEN_ARGS_APPEND)\" \u003e\u003e env-file\n\n[[ '$(inputs.params.MAVEN_MIRROR_URL)' != \"\" ]] \u0026\u0026\n echo \"MAVEN_MIRROR_URL=$(inputs.params.MAVEN_MIRROR_URL)\" \u003e\u003e env-file\n\necho \"Generated Env file\"\necho \"------------------------------\"\ncat env-file\necho \"------------------------------\"" - ], - "workingDir": "/env-params", - "resources": {}, - "volumeMounts": [ - { - "name": "envparams", - "mountPath": "/env-params" - } - ] - }, - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift", - "--image-scripts-url", - "image:///usr/local/s2i", - "--as-dockerfile", - "/gen-source/Dockerfile.gen", - "--environment-file", - "/env-params/env-file" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - }, - { - "name": "envparams", - "mountPath": "/env-params" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - }, - { - "name": "envparams", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-java-8-v0-8-0", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-java-8-v0-8-0", - "uid": "ce0b4989-dcc9-429f-93b3-da9051a0c4e9", - "resourceVersion": "78687", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:57Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - }, - { - "name": "MAVEN_ARGS_APPEND", - "type": "string", - "description": "Additional Maven arguments", - "default": "" - }, - { - "name": "MAVEN_CLEAR_REPO", - "type": "string", - "description": "Remove the Maven repository after the artifact is built", - "default": "false" - }, - { - "name": "MAVEN_MIRROR_URL", - "type": "string", - "description": "The base URL of a mirror used for retrieving artifacts", - "default": "" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "gen-env-file", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "/bin/sh", - "-c" - ], - "args": [ - "echo \"MAVEN_CLEAR_REPO=$(inputs.params.MAVEN_CLEAR_REPO)\" \u003e env-file\n\n[[ '$(inputs.params.MAVEN_ARGS_APPEND)' != \"\" ]] \u0026\u0026\n echo \"MAVEN_ARGS_APPEND=$(inputs.params.MAVEN_ARGS_APPEND)\" \u003e\u003e env-file\n\n[[ '$(inputs.params.MAVEN_MIRROR_URL)' != \"\" ]] \u0026\u0026\n echo \"MAVEN_MIRROR_URL=$(inputs.params.MAVEN_MIRROR_URL)\" \u003e\u003e env-file\n\necho \"Generated Env file\"\necho \"------------------------------\"\ncat env-file\necho \"------------------------------\"" - ], - "workingDir": "/env-params", - "resources": {}, - "volumeMounts": [ - { - "name": "envparams", - "mountPath": "/env-params" - } - ] - }, - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift", - "--image-scripts-url", - "image:///usr/local/s2i", - "--as-dockerfile", - "/gen-source/Dockerfile.gen", - "--environment-file", - "/env-params/env-file" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - }, - { - "name": "envparams", - "mountPath": "/env-params" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - }, - { - "name": "envparams", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-nodejs", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-nodejs", - "uid": "4f74140b-a7df-486b-9ac5-ffa363f3c31e", - "resourceVersion": "78689", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:57Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "VERSION", - "type": "string", - "description": "The version of the nodejs", - "default": "8" - }, - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from.", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/rhscl/nodejs-$(inputs.params.VERSION)-rhel7", - "--as-dockerfile", - "/gen-source/Dockerfile.gen" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-nodejs-v0-8-0", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-nodejs-v0-8-0", - "uid": "60cead5e-4acf-46e3-8334-859ab3a8530d", - "resourceVersion": "78693", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:58Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "VERSION", - "type": "string", - "description": "The version of the nodejs", - "default": "8" - }, - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from.", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/rhscl/nodejs-$(inputs.params.VERSION)-rhel7", - "--as-dockerfile", - "/gen-source/Dockerfile.gen" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-python-3", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-python-3", - "uid": "34a0225d-e0fc-40df-8f96-80673b08bded", - "resourceVersion": "78697", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:58Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "MINOR_VERSION", - "type": "string", - "description": "The minor version of the python 3", - "default": "6" - }, - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from.", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/rhscl/python-3$(inputs.params.MINOR_VERSION)-rhel7", - "--as-dockerfile", - "/gen-source/Dockerfile.gen" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-python-3-v0-8-0", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-python-3-v0-8-0", - "uid": "b23af17b-c770-43b6-af42-87afe5d4a846", - "resourceVersion": "78698", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:58Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "MINOR_VERSION", - "type": "string", - "description": "The minor version of the python 3", - "default": "6" - }, - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from.", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i:v0.8.0", - "command": [ - "s2i", - "build", - "$(inputs.params.PATH_CONTEXT)", - "registry.access.redhat.com/rhscl/python-3$(inputs.params.MINOR_VERSION)-rhel7", - "--as-dockerfile", - "/gen-source/Dockerfile.gen" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - } - ] - } - }, - { - "kind": "ClusterTask", - "apiVersion": "tekton.dev/v1alpha1", - "metadata": { - "name": "s2i-v0-8-0", - "selfLink": "/apis/tekton.dev/v1alpha1/clustertasks/s2i-v0-8-0", - "uid": "db57f332-ab01-4380-a208-b27e05eaee6d", - "resourceVersion": "78671", - "generation": 1, - "creationTimestamp": "2020-01-20T17:39:54Z", - "annotations": { - "manifestival": "new" - }, - "ownerReferences": [ - { - "apiVersion": "operator.tekton.dev/v1alpha1", - "kind": "Config", - "name": "cluster", - "uid": "e595c575-4148-42b5-8d8b-44ee77f92d4c", - "controller": true, - "blockOwnerDeletion": true - } - ] - }, - "spec": { - "inputs": { - "resources": [ - { - "name": "source", - "type": "git" - } - ], - "params": [ - { - "name": "BUILDER_IMAGE", - "type": "string", - "description": "The location of the s2i builder image." - }, - { - "name": "PATH_CONTEXT", - "type": "string", - "description": "The location of the path to run s2i from.", - "default": "." - }, - { - "name": "TLSVERIFY", - "type": "string", - "description": "Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)", - "default": "true" - }, - { - "name": "LOGLEVEL", - "type": "string", - "description": "Log level when running the S2I binary", - "default": "0" - } - ] - }, - "outputs": { - "resources": [ - { - "name": "image", - "type": "image" - } - ] - }, - "steps": [ - { - "name": "generate", - "image": "quay.io/openshift-pipeline/s2i:nightly", - "command": [ - "/usr/local/bin/s2i", - "--loglevel=$(inputs.params.LOGLEVEL)", - "build", - "$(inputs.params.PATH_CONTEXT)", - "$(inputs.params.BUILDER_IMAGE)", - "--as-dockerfile", - "/gen-source/Dockerfile.gen" - ], - "workingDir": "/workspace/source", - "resources": {}, - "volumeMounts": [ - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ] - }, - { - "name": "build", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "bud", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "--layers", - "-f", - "/gen-source/Dockerfile.gen", - "-t", - "$(outputs.resources.image.url)", - "." - ], - "workingDir": "/gen-source", - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - }, - { - "name": "gen-source", - "mountPath": "/gen-source" - } - ], - "securityContext": { - "privileged": true - } - }, - { - "name": "push", - "image": "quay.io/buildah/stable", - "command": [ - "buildah", - "push", - "--tls-verify=$(inputs.params.TLSVERIFY)", - "$(outputs.resources.image.url)", - "docker://$(outputs.resources.image.url)" - ], - "resources": {}, - "volumeMounts": [ - { - "name": "varlibcontainers", - "mountPath": "/var/lib/containers" - } - ], - "securityContext": { - "privileged": true - } - } - ], - "volumes": [ - { - "name": "varlibcontainers", - "emptyDir": {} - }, - { - "name": "gen-source", - "emptyDir": {} - } - ] - } - } -] diff --git a/test/extension.test.ts b/test/extension.test.ts index 26c0091d..3587a499 100644 --- a/test/extension.test.ts +++ b/test/extension.test.ts @@ -55,7 +55,6 @@ suite('Tekton Pipeline Extension', () => { sandbox.stub(TknImpl.prototype, '_getTasks').resolves([taskItem]); sandbox.stub(TknImpl.prototype, '_getClusterTasks').resolves([clustertaskItem]); sandbox.stub(TknImpl.prototype, '_getPipelineRuns').resolves([pipelinerunItem]); - sandbox.stub(TknImpl.prototype, '_getTaskRunsForPipelineRun').resolves([taskrunItem]); }); teardown(() => { @@ -106,12 +105,6 @@ suite('Tekton Pipeline Extension', () => { expect(pipelinerun.length).is.equals(1); }); - test('should load taskruns from pipelinerun folder', async () => { - sandbox.stub(TknImpl.prototype, 'execute').resolves({ error: undefined, stdout: '' }); - const taskrun = await tkn.getTaskRunsForPipelineRun(pipelinerunItem); - expect(taskrun.length).is.equals(1); - }); - test('should register all extension commands declared commands in package descriptor', async () => { return await vscode.commands.getCommands(true).then((commands) => { packagejson.contributes.commands.forEach(value => { diff --git a/test/pipelinerun.json b/test/pipelinerun.json new file mode 100644 index 00000000..1d958a9d --- /dev/null +++ b/test/pipelinerun.json @@ -0,0 +1,172 @@ +{ + "apiVersion": "tekton.dev/v1beta1", + "kind": "PipelineRun", + "metadata": { + "creationTimestamp": "2020-05-07T14:39:15Z", + "generation": 1, + "labels": { + "tekton.dev/pipeline": "conditional-pipeline" + }, + "name": "condtional-pr", + "namespace": "default", + "resourceVersion": "393173", + "selfLink": "/apis/tekton.dev/v1beta1/namespaces/default/pipelineruns/condtional-pr", + "uid": "92c53583-bbd9-4cc0-a191-04530ae21648" + }, + "spec": { + "pipelineRef": { + "name": "conditional-pipeline" + }, + "resources": [ + { + "name": "source-repo", + "resourceRef": { + "name": "pipeline-git" + } + } + ], + "serviceAccountName": "default", + "timeout": "1h0m0s" + }, + "status": { + "completionTime": "2020-05-07T14:43:15Z", + "conditions": [ + { + "lastTransitionTime": "2020-05-07T14:43:15Z", + "message": "Tasks Completed: 2, Skipped: 0", + "reason": "Succeeded", + "status": "True", + "type": "Succeeded" + } + ], + "startTime": "2020-05-07T14:39:15Z", + "taskRuns": { + "condtional-pr-first-create-file-x2cvl": { + "pipelineTaskName": "first-create-file", + "status": { + "completionTime": "2020-05-07T14:41:04Z", + "conditions": [ + { + "lastTransitionTime": "2020-05-07T14:41:04Z", + "message": "All Steps have completed executing", + "reason": "Succeeded", + "status": "True", + "type": "Succeeded" + } + ], + "podName": "condtional-pr-first-create-file-x2cvl-pod-2b7qt", + "startTime": "2020-05-07T14:39:15Z", + "steps": [ + { + "container": "step-write-new-stuff", + "imageID": "docker.io/library/ubuntu@sha256:5747316366b8cc9e3021cd7286f42b2d6d81e3d743e2ab571f55bcd5df788cc8", + "name": "write-new-stuff", + "terminated": { + "containerID": "cri-o://5dfd667521d20c91150a82e0971c9cbfd5c35a721e2b94bc8ea27cd91a421ada", + "exitCode": 0, + "finishedAt": "2020-05-07T14:41:03Z", + "reason": "Completed", + "startedAt": "2020-05-07T14:41:03Z" + } + }, + { + "container": "step-source-copy-pipeline-git-7szw9", + "imageID": "registry.access.redhat.com/ubi8/ubi-minimal@sha256:326c94ab44d1472a30d47c49c2f896df687184830fc66a66de00c416885125b0", + "name": "source-copy-pipeline-git-7szw9", + "terminated": { + "containerID": "cri-o://825bbdedd15e596b109843deb3e104eb29f446be02c0ab79b7bc48d3215b6ad1", + "exitCode": 0, + "finishedAt": "2020-05-07T14:41:04Z", + "reason": "Completed", + "startedAt": "2020-05-07T14:41:04Z" + } + }, + { + "container": "step-source-mkdir-pipeline-git-pvtn7", + "imageID": "registry.access.redhat.com/ubi8/ubi-minimal@sha256:326c94ab44d1472a30d47c49c2f896df687184830fc66a66de00c416885125b0", + "name": "source-mkdir-pipeline-git-pvtn7", + "terminated": { + "containerID": "cri-o://321366c33b0d38bfe52016cd6700457acda2469f3f0f88ccc7c1c09ffc3bafcf", + "exitCode": 0, + "finishedAt": "2020-05-07T14:41:03Z", + "reason": "Completed", + "startedAt": "2020-05-07T14:41:03Z" + } + }, + { + "container": "step-create-dir-workspace-m9tcg", + "imageID": "registry.access.redhat.com/ubi8/ubi-minimal@sha256:326c94ab44d1472a30d47c49c2f896df687184830fc66a66de00c416885125b0", + "name": "create-dir-workspace-m9tcg", + "terminated": { + "containerID": "cri-o://8f92eb5eb14742dddd80731c792214954698ff6390364162409a3077b26a3a18", + "exitCode": 0, + "finishedAt": "2020-05-07T14:41:02Z", + "reason": "Completed", + "startedAt": "2020-05-07T14:41:02Z" + } + } + ] + } + }, + "condtional-pr-then-check-mr5dp": { + "conditionChecks": { + "condtional-pr-then-check-mr5dp-file-exists-bhxgl": { + "conditionName": "file-exists", + "status": { + "check": { + "terminated": { + "containerID": "cri-o://24de1fa5e10ed936e478d0b415016c63d8cd7eef4b50bf1c9d46a8abc951cb8f", + "exitCode": 0, + "finishedAt": "2020-05-07T14:42:53Z", + "reason": "Completed", + "startedAt": "2020-05-07T14:42:53Z" + } + }, + "completionTime": "2020-05-07T14:42:54Z", + "conditions": [ + { + "lastTransitionTime": "2020-05-07T14:42:54Z", + "message": "All Steps have completed executing", + "reason": "Succeeded", + "status": "True", + "type": "Succeeded" + } + ], + "podName": "condtional-pr-then-check-mr5dp-file-exists-bhxgl-pod-75n9f", + "startTime": "2020-05-07T14:41:04Z" + } + } + }, + "pipelineTaskName": "then-check", + "status": { + "completionTime": "2020-05-07T14:43:15Z", + "conditions": [ + { + "lastTransitionTime": "2020-05-07T14:43:15Z", + "message": "All Steps have completed executing", + "reason": "Succeeded", + "status": "True", + "type": "Succeeded" + } + ], + "podName": "condtional-pr-then-check-mr5dp-pod-7nj9v", + "startTime": "2020-05-07T14:42:54Z", + "steps": [ + { + "container": "step-echo", + "imageID": "docker.io/library/ubuntu@sha256:5747316366b8cc9e3021cd7286f42b2d6d81e3d743e2ab571f55bcd5df788cc8", + "name": "echo", + "terminated": { + "containerID": "cri-o://133f1e5a347e7012c49cd78c25918545da3e9797310aaf043b245c877220bee5", + "exitCode": 0, + "finishedAt": "2020-05-07T14:43:14Z", + "reason": "Completed", + "startedAt": "2020-05-07T14:43:14Z" + } + } + ] + } + } + } + } +} diff --git a/test/tekton/taskrun.test.ts b/test/tekton/taskrun.test.ts index 6039914f..e055910c 100644 --- a/test/tekton/taskrun.test.ts +++ b/test/tekton/taskrun.test.ts @@ -21,7 +21,6 @@ chai.use(sinonChai); suite('Tekton/TaskRun', () => { const sandbox = sinon.createSandbox(); let execStub: sinon.SinonStub; - let getTaskRunsStub: sinon.SinonStub; let getPipelineRunNamesStub: sinon.SinonStub; const pipelineItem = new TestItem(null, 'pipeline', ContextType.PIPELINE); const pipelinerunItem = new TestItem(pipelineItem, 'pipelinerun', ContextType.PIPELINERUN, undefined, '2019-07-25T12:03:00Z', 'True'); @@ -29,7 +28,6 @@ suite('Tekton/TaskRun', () => { setup(() => { execStub = sandbox.stub(TknImpl.prototype, 'execute').resolves({ error: null, stdout: '', stderr: '' }); - sandbox.stub(TknImpl.prototype, 'getTaskRunsForPipelineRun').resolves([taskrunItem]); getPipelineRunNamesStub = sandbox.stub(TektonItem, 'getPipelinerunNames').resolves([pipelinerunItem]); sandbox.stub(vscode.window, 'showInputBox').resolves(); }); @@ -82,10 +80,6 @@ suite('Tekton/TaskRun', () => { suite('listFromTasks command', () => { const taskItem = new TestItem(null, 'task', ContextType.TASK); - setup(() => { - getTaskRunsStub = sandbox.stub(TektonItem, 'getTaskRunNames').resolves([taskrunItem]); - }); - suite('called from \'Tekton Pipelines Explorer\'', () => { test('executes the listFromTasks tkn command in terminal', async () => { @@ -98,7 +92,6 @@ suite('Tekton/TaskRun', () => { suite('called from command palette', () => { test('calls the appropriate error message when no project found', async () => { - getTaskRunsStub.restore(); sandbox.stub(TknImpl.prototype, 'getTaskRunsForTasks').resolves([]); try { await TaskRun.listFromTask(null); diff --git a/test/tekton/tektonitem.test.ts b/test/tekton/tektonitem.test.ts index eb2aec57..8e43e49d 100644 --- a/test/tekton/tektonitem.test.ts +++ b/test/tekton/tektonitem.test.ts @@ -149,27 +149,6 @@ suite('TektonItem', () => { }); }); - suite('getTaskrunNames', () => { - - test('returns an array of taskrun names for the pipelinerun if there is at least one task', async () => { - sandbox.stub(TknImpl.prototype, 'getTaskRunsForPipelineRun').resolves([taskrunItem]); - const taskrunNames = await TektonItem.getTaskRunNames(pipelinerunItem); - expect(taskrunNames[0].getName()).equals('taskrun'); - - }); - - test('throws error if there are no taskruns available', async () => { - sandbox.stub(TknImpl.prototype, 'getTaskRunsForPipelineRun').resolves([]); - try { - await TektonItem.getTaskRunNames(pipelinerunItem); - } catch (err) { - expect(err.message).equals('You need at least one TaskRun available. Please create new Tekton TaskRun and try again.'); - return; - } - fail('should throw error in case tasks array is empty'); - }); - }); - suite('getClustertaskNames', () => { test('returns an array of clustertask names for the task if there is at least one task', async () => { diff --git a/test/tkn.test.ts b/test/tkn.test.ts index 8792a83c..ed0a318c 100644 --- a/test/tkn.test.ts +++ b/test/tkn.test.ts @@ -13,12 +13,13 @@ import * as sinonChai from 'sinon-chai'; import * as assert from 'assert'; import { ToolsConfig } from '../src/tools'; import { WindowUtil } from '../src/util/windowUtils'; -import { Terminal } from 'vscode'; +import { Terminal, TreeItemCollapsibleState } from 'vscode'; import { TestItem } from './tekton/testTektonitem'; import { ExecException } from 'child_process'; import * as path from 'path'; import { TektonNode } from '../src/tkn'; import { StartObject, Resources, Params } from '../src/tekton/pipelinecontent'; +import { PipelineRunData } from '../src/tekton'; const expect = chai.expect; chai.use(sinonChai); @@ -106,7 +107,6 @@ suite('tkn', () => { toolsStub = sandbox.stub(ToolsConfig, 'detectOrDownload').resolves(path.join('segment1', 'segment2')); const ctStub = sandbox.stub(WindowUtil, 'createTerminal').returns(termFake); await tknCli.executeInTerminal(createCliCommand('tkn')); - // tslint:disable-next-line: no-unused-expression expect(termFake.show).calledOnce; expect(ctStub).calledWith('Tekton', process.cwd(), 'segment1'); }); @@ -130,7 +130,7 @@ suite('tkn', () => { const triggerTemplatesItem = new TestItem(tkn.TknImpl.ROOT, 'triggertemplates', tkn.ContextType.TRIGGERTEMPLATES); const triggerBindingItem = new TestItem(tkn.TknImpl.ROOT, 'triggerbinding', tkn.ContextType.TRIGGERBINDING); const eventListenerItem = new TestItem(tkn.TknImpl.ROOT, 'eventlistener', tkn.ContextType.EVENTLISTENER); - const conditionItem = new TestItem(tkn.TknImpl.ROOT, 'condition', tkn.ContextType.CONDITIONS ); + const conditionItem = new TestItem(tkn.TknImpl.ROOT, 'condition', tkn.ContextType.CONDITIONS); const pipelineRunNodeItem = new TestItem(tkn.TknImpl.ROOT, 'PipelineRun', tkn.ContextType.PIPELINERUNNODE); const taskRunNodeItem = new TestItem(tkn.TknImpl.ROOT, 'TaskRun', tkn.ContextType.TASKRUNNODE); @@ -858,136 +858,6 @@ suite('tkn', () => { expect(result).empty; }); - test('getTaskRun returns taskrun list for a pipelinerun', async () => { - execStub.resolves({ - error: null, stdout: JSON.stringify({ - 'items': [ - { - 'kind': 'TaskRun', - 'apiVersion': 'tekton.dev/v1alpha1', - 'metadata': { - 'creationTimestamp': '2019-07-25T12:03:01Z', - 'name': 'taskrun1', - 'ownerReferences': [{ - 'kind': 'PipelineRun', - 'name': 'pipelinerun1' - }], - 'labels': { - 'tekton.dev/pipelineRun': 'pipelinerun1' - } - - }, - 'status': { - 'conditions': [ - { - 'status': 'True', - } - ], - 'startTime': '2019-07-25T12:03:01Z', - } - }, - { - 'kind': 'TaskRun', - 'apiVersion': 'tekton.dev/v1alpha1', - 'metadata': { - 'creationTimestamp': '2019-07-25T12:03:00Z', - 'name': 'taskrun2', - 'ownerReferences': [{ - 'kind': 'PipelineRun', - 'name': 'pipelinerun1' - }], - 'labels': { - 'tekton.dev/pipelineRun': 'pipelinerun1' - } - }, - 'status': { - 'conditions': [ - { - 'status': 'True', - } - ], - 'startTime': '2019-07-25T12:03:00Z', - } - }] - }) - }); - const result = await tknCli.getTaskRunsForPipelineRun(pipelinerunItem); - - expect(result.length).equals(2); - expect(result[0].getName()).equals('taskrun1'); - }); - - test('getTaskruns returns taskruns for a pipelinerun', async () => { - const tknTaskRuns = ['taskrun1', 'taskrun2']; - execStub.resolves({ - error: null, stdout: JSON.stringify({ - 'items': [ - { - 'kind': 'TaskRun', - 'apiVersion': 'tekton.dev/v1alpha1', - 'metadata': { - 'creationTimestamp': '2019-07-25T12:03:01Z', - 'name': 'taskrun1', - 'ownerReferences': [{ - 'kind': 'PipelineRun', - 'name': 'pipelinerun1' - }], - 'labels': { - 'tekton.dev/pipelineRun': 'pipelinerun1' - } - }, - 'status': { - 'conditions': [ - { - 'status': 'True', - } - ], - 'startTime': '2019-07-25T12:03:01Z', - } - }, - { - 'kind': 'TaskRun', - 'apiVersion': 'tekton.dev/v1alpha1', - 'metadata': { - 'creationTimestamp': '2019-07-25T12:03:00Z', - 'name': 'taskrun2', - 'ownerReferences': [{ - 'kind': 'PipelineRun', - 'name': 'pipelinerun1' - }], - 'labels': { - 'tekton.dev/pipelineRun': 'pipelinerun1' - } - }, - 'status': { - 'conditions': [ - { - 'status': 'True', - } - ], - 'startTime': '2019-07-25T12:03:00Z', - } - }] - }) - }); - const result = await tknCli.getTaskRunsForPipelineRun(pipelinerunItem); - expect(execStub).calledWith(tkn.Command.listTaskRunsForPipelineRun(pipelinerunItem.getName())); - expect(result.length).equals(2); - for (let i = 0; i < result.length; i++) { - expect(result[i].getName()).equals(tknTaskRuns[i]); - } - }); - - test('getTaskRunsForPipelineRun returns an empty list if an error occurs', async () => { - sandbox.stub(tkn.TknImpl.prototype, 'getTaskRunsForPipelineRun').resolves([]); - execStub.onFirstCall().resolves({ error: undefined, stdout: '' }); - execStub.onSecondCall().rejects(errorMessage); - const result = await tknCli.getTaskRunsForPipelineRun(pipelinerunItem); - - // tslint:disable-next-line: no-unused-expression - expect(result).empty; - }); - test('getTaskRunFromTasks returns taskrun list for a task', async () => { execStub.resolves({ error: null, stdout: JSON.stringify({ @@ -1244,31 +1114,6 @@ suite('tkn', () => { } }); - test('getPipelineRunChildren returns taskruns for an pipelinerun', async () => { - sandbox.stub(tkn.TknImpl.prototype, 'getTaskRunsForPipelineRun').resolves([taskrunItem]); - execStub.onFirstCall().resolves({ - error: undefined, stdout: JSON.stringify({ - items: [ - { - metadata: { - name: 'taskrun1', - }, - spec: { - pipelineRef: { - name: 'pipeline1', - } - } - - } - ] - }) - }); - execStub.onSecondCall().resolves({ error: undefined, stdout: 'serv' }); - //TODO: Probably need a get children here - const result = await tknCli.getTaskRunsForPipelineRun(pipelinerunItem); - - expect(result[0].getName()).deep.equals('taskrun1'); - }); test('getRawClusterTasks returns items from tkn task list command', async () => { const tknTasks = ['clustertask1', 'clustertask2']; @@ -1348,7 +1193,7 @@ suite('tkn', () => { }); }); - suite('mode node', () => { + suite('more node', () => { const pipelineNodeItem = new TestItem(tkn.TknImpl.ROOT, 'pipelinenode', tkn.ContextType.PIPELINENODE); const pipelineItem = new TestItem(pipelineNodeItem, 'pipeline1', tkn.ContextType.PIPELINE); @@ -1374,4 +1219,36 @@ suite('tkn', () => { assert.equal(more.description, '4 from 10'); }); }); + + suite('PipelineRun node', () => { + const pipelineItem = new TestItem(null, 'pipeline', tkn.ContextType.PIPELINE); + + test('PipelineRun should use pipelinerun JSON to create TaskRun nodes', () => { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const json = require(path.join('..', '..', 'test', 'pipelinerun.json')) as PipelineRunData; + const pipelineRun = new tkn.PipelineRun(pipelineItem, json.metadata.name, undefined, json, TreeItemCollapsibleState.Expanded); + + expect(pipelineRun.label).equal('condtional-pr'); + const children = pipelineRun.getChildren(); + expect(children).to.have.lengthOf(2); + expect(children[0].name).eq('then-check'); + expect(children[1].name).eq('first-create-file'); + }); + + test('TaskRun should contains condition run node', () => { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const json = require(path.join('..', '..', 'test', 'pipelinerun.json')) as PipelineRunData; + const pipelineRun = new tkn.PipelineRun(pipelineItem, json.metadata.name, undefined, json, TreeItemCollapsibleState.Expanded); + + expect(pipelineRun.label).equal('condtional-pr'); + const children = pipelineRun.getChildren() as tkn.TektonNodeImpl[]; + expect(children).to.have.lengthOf(2); + expect(children[0].name).eq('then-check'); + + const conditionRun = children[0].getChildren() as tkn.TektonNodeImpl[]; + expect(conditionRun).not.undefined; + expect(conditionRun).to.have.lengthOf(1); + expect(conditionRun[0].name).eq('file-exists'); + }); + }); }); From 59c0dad8529bdebb4add2a516e1482c1d248c456 Mon Sep 17 00:00:00 2001 From: Yevhen Vydolob Date: Thu, 21 May 2020 11:10:09 +0300 Subject: [PATCH 2/5] Fix all issues related to start and refreash tree Signed-off-by: Yevhen Vydolob --- images/pending.svg | 11 +++ src/pipeline/pipeline-graph.ts | 38 +------- src/pipeline/pipelineExplorer.ts | 5 +- src/tkn.ts | 158 +++++++++++++++++++++++++------ src/util/tekton-vfs.ts | 5 +- test/tekton/testTektonitem.ts | 16 ++-- test/tkn.test.ts | 6 +- 7 files changed, 164 insertions(+), 75 deletions(-) create mode 100644 images/pending.svg diff --git a/images/pending.svg b/images/pending.svg new file mode 100644 index 00000000..31f307eb --- /dev/null +++ b/images/pending.svg @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/src/pipeline/pipeline-graph.ts b/src/pipeline/pipeline-graph.ts index 7ee68559..2435545b 100644 --- a/src/pipeline/pipeline-graph.ts +++ b/src/pipeline/pipeline-graph.ts @@ -4,12 +4,12 @@ *-----------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { tektonYaml, pipelineYaml, pipelineRunYaml, TektonYamlType, DeclaredTask, PipelineRunTask, RunState } from '../yaml-support/tkn-yaml'; +import { tektonYaml, pipelineYaml, pipelineRunYaml, TektonYamlType, DeclaredTask, PipelineRunTask } from '../yaml-support/tkn-yaml'; import { YamlDocument, VirtualDocument } from '../yaml-support/yaml-locator'; -import { ContextType, humanizer } from '../tkn'; +import { ContextType, humanizer, getPipelineRunTaskState } from '../tkn'; import { NodeOrEdge, NodeData, EdgeData } from '../../preview-src/model'; -import { PipelineRunData, TaskRuns, TaskRun, TaskRunStatus, PipelineRunConditionCheckStatus } from '../tekton'; +import { PipelineRunData, TaskRuns, TaskRun, PipelineRunConditionCheckStatus } from '../tekton'; import { tektonFSUri, tektonVfsProvider } from '../util/tekton-vfs'; const pipelineRunTaskCache = new Map(); @@ -142,7 +142,7 @@ function updatePipelineRunTasks(pipelineRun: PipelineRunData, tasks: DeclaredTas for (const task of tasks) { const runTask = task as PipelineRunTask; - let taskRun; + let taskRun: TaskRun | PipelineRunConditionCheckStatus; if (task.kind === 'Condition') { taskRun = findConditionInTaskRun(task.name, taskRuns); } else { @@ -152,7 +152,7 @@ function updatePipelineRunTasks(pipelineRun: PipelineRunData, tasks: DeclaredTas runTask.completionTime = taskRun.status?.completionTime; runTask.startTime = taskRun.status?.startTime; runTask.state = getPipelineRunTaskState(taskRun.status); - const steps = taskRun.status?.steps; + const steps = (taskRun as TaskRun).status?.steps; if (steps) { runTask.stepsCount = steps.length; let finishedSteps = 0; @@ -195,31 +195,3 @@ function findConditionInTaskRun(name: string, taskRuns: TaskRuns): PipelineRunCo } } } - -function getPipelineRunTaskState(status: TaskRunStatus): RunState { - let result: RunState = 'Unknown'; - if (!status) { - return result; // default state - } - const startTime = status.startTime; - if (startTime) { - result = 'Started'; - } - const conditionStatus = status.conditions; - if (conditionStatus) { - const status = conditionStatus[0]?.status; - if (status) { - if (status === 'True') { - result = 'Finished'; - } else if (status === 'False') { - const reason = conditionStatus[0]?.reason; - if (reason === 'TaskRunCancelled') { - result = 'Cancelled'; - } else { - result = 'Failed'; - } - } - } - } - return result; -} diff --git a/src/pipeline/pipelineExplorer.ts b/src/pipeline/pipelineExplorer.ts index 9ac3908e..69a44367 100644 --- a/src/pipeline/pipelineExplorer.ts +++ b/src/pipeline/pipelineExplorer.ts @@ -43,7 +43,10 @@ export class PipelineExplorer implements TreeDataProvider, Disposabl return element.getParent(); } - refresh(target?: TektonNode): void { + async refresh(target?: TektonNode): Promise { + if (target) { + await target.refresh(); + } this.onDidChangeTreeDataEmitter.fire(target); } diff --git a/src/tkn.ts b/src/tkn.ts index 4bc6e968..d5c16868 100644 --- a/src/tkn.ts +++ b/src/tkn.ts @@ -10,10 +10,11 @@ import * as path from 'path'; import { ToolsConfig } from './tools'; import format = require('string-format'); import humanize = require('humanize-duration'); -import { TknPipelineResource, TknTask, PipelineRunData, TaskRun as RawTaskRun, PipelineRunConditionCheckStatus } from './tekton'; +import { TknPipelineResource, TknTask, PipelineRunData, TaskRun as RawTaskRun, PipelineRunConditionCheckStatus, TaskRunStatus, ConditionCheckStatus } from './tekton'; import { kubectl } from './kubectl'; import { pipelineExplorer } from './pipeline/pipelineExplorer'; import { StartObject } from './tekton/pipelinecontent'; +import { RunState } from './yaml-support/tkn-yaml'; export const humanizer = humanize.humanizer(createConfig()); @@ -48,6 +49,7 @@ export interface TektonNode { getParent(): TektonNode | undefined; getName(): string; collapsibleState?: TreeItemCollapsibleState; + refresh(): Promise; } export enum ContextType { @@ -353,6 +355,10 @@ export class Command { static getPipelineResource(): CliCommand { return newK8sCommand('get', 'pipelineresources', '-o', 'json'); } + + static getPipelineRun(name: string): CliCommand { + return newK8sCommand('get', 'pipelinerun', name, '-o', 'json'); + } } export class TektonNodeImpl implements TektonNode { @@ -492,19 +498,17 @@ export class TektonNodeImpl implements TektonNode { get iconPath(): Uri { if (this.state) { let fileName = 'running.gif'; - if (this.state) { - switch (this.state) { - case 'False': { - fileName = 'failed.png'; - break; - } - case 'True': { - fileName = 'success.png'; - break; - } - default: { - break; - } + switch (this.state) { + case 'False': { + fileName = 'failed.png'; + break; + } + case 'True': { + fileName = 'success.png'; + break; + } + default: { + break; } } return Uri.file(path.join(__dirname, '../../images', fileName)); @@ -532,6 +536,10 @@ export class TektonNodeImpl implements TektonNode { return this.parent; } + refresh(): Promise { + return Promise.resolve(); + } + } type PipelineTaskRunData = { @@ -594,16 +602,49 @@ export class TaskRun extends TektonNodeImpl { } } +export function getPipelineRunTaskState(status: TaskRunStatus | ConditionCheckStatus): RunState { + let result: RunState = 'Unknown'; + if (!status) { + return result; // default state + } + const startTime = status.startTime; + if (startTime) { + result = 'Started'; + } + const conditionStatus = status.conditions; + if (conditionStatus) { + const status = conditionStatus[0]?.status; + if (status) { + if (status === 'True') { + result = 'Finished'; + } else if (status === 'False') { + const reason = conditionStatus[0]?.reason; + if (reason === 'TaskRunCancelled') { + result = 'Cancelled'; + } else { + result = 'Failed'; + } + } + } + } + return result; +} + export abstract class BaseTaskRun extends TektonNodeImpl { constructor(parent: TektonNode, name: string, + protected shortName: string, contextType: ContextType, tkn: Tkn, collapsibleState: TreeItemCollapsibleState, creationTime: string, protected finished: string | undefined, - state: string) { - super(parent, name, contextType, tkn, collapsibleState, creationTime, state); + status: TaskRunStatus | ConditionCheckStatus) { + super(parent, name, contextType, tkn, collapsibleState, creationTime, getPipelineRunTaskState(status)); + } + + get label(): string { + return this.shortName ? this.shortName : this.name; } get description(): string { @@ -623,28 +664,56 @@ export abstract class BaseTaskRun extends TektonNodeImpl { } return r; } + + get iconPath(): Uri { + if (this.state) { + let fileName = 'pending.svg'; + if (this.state) { + switch (this.state) { + case 'Failed': { + fileName = 'failed.png'; + break; + } + case 'Finished': { + fileName = 'success.png'; + break; + } + case 'Cancelled': + fileName = 'cancelled.png'; + break; + + case 'Started': + fileName = 'running.gif'; + break; + case 'Unknown': + default: + fileName = 'pending.svg'; + break; + } + } + return Uri.file(path.join(__dirname, '../../images', fileName)); + } + return super.iconPath; + } } export class ConditionRun extends BaseTaskRun { constructor(parent: TektonNode, name: string, tkn: Tkn, item: PipelineRunConditionCheckStatus) { - super(parent, name, ContextType.CONDITIONRUN, tkn, TreeItemCollapsibleState.None, item.status?.startTime, item.status?.completionTime, item.status?.conditions[0]?.status) + super(parent, name, name, ContextType.CONDITIONRUN, tkn, TreeItemCollapsibleState.None, item.status?.startTime, item.status?.completionTime, item.status) } } export class TaskRunFromPipeline extends BaseTaskRun { - constructor(parent: TektonNode, name: string, tkn: Tkn, private rawTaskRun: RawTaskRun) { + constructor(parent: TektonNode, name: string, shortName: string, tkn: Tkn, private rawTaskRun: RawTaskRun) { super(parent, name, + shortName, ContextType.TASKRUN, tkn, - rawTaskRun.conditionChecks ? TreeItemCollapsibleState.Expanded : TreeItemCollapsibleState.None, - rawTaskRun.status.startTime, + rawTaskRun.conditionChecks ? TreeItemCollapsibleState.Collapsed : TreeItemCollapsibleState.None, + rawTaskRun.status?.startTime, rawTaskRun.status?.completionTime, - rawTaskRun.status ? rawTaskRun.status.conditions[0].status : ''); - } - - get label(): string { - return this.name; + rawTaskRun.status); } getChildren(): ProviderResult { @@ -669,7 +738,8 @@ export class PipelineRun extends TektonNodeImpl { constructor(parent: TektonNode, name: string, tkn: Tkn, - item: PipelineRunData, collapsibleState: TreeItemCollapsibleState) { + item: PipelineRunData, + collapsibleState: TreeItemCollapsibleState) { super(parent, name, ContextType.PIPELINERUN, tkn, collapsibleState, item.metadata.creationTimestamp, item.status ? item.status.conditions[0].status : ''); this.started = item.metadata.creationTimestamp; this.finished = item.status?.completionTime; @@ -698,11 +768,18 @@ export class PipelineRun extends TektonNodeImpl { } for (const task in tasks) { const taskRun = tasks[task]; - result.push(new TaskRunFromPipeline(this, taskRun.pipelineTaskName, this.tkn, taskRun)); + result.push(new TaskRunFromPipeline(this, task, taskRun.pipelineTaskName, this.tkn, taskRun)); } return result.sort(compareTimeNewestFirst); } + + async refresh(): Promise { + const newItem = await this.tkn.getRawPipelineRun(this.item.metadata.name); + if (newItem) { + this.item = newItem; + } + } } export class MoreNode extends TreeItem implements TektonNode { @@ -739,6 +816,9 @@ export class MoreNode extends TreeItem implements TektonNode { return this.label; } + refresh(): Promise { + return Promise.resolve(); + } } export interface Tkn { @@ -763,6 +843,7 @@ export interface Tkn { getConditions(conditions: TektonNode): Promise; getPipelineRunsList(pipelineRun: TektonNode): Promise; getTaskRunList(taskRun: TektonNode): Promise; + getRawPipelineRun(name: string): Promise; clearCache?(): void; } @@ -924,7 +1005,7 @@ export class TknImpl implements Tkn { } return data - .map((value) => new PipelineRun(pipeline, value.metadata.name, this, value, TreeItemCollapsibleState.Expanded)) + .map((value) => new PipelineRun(pipeline, value.metadata.name, this, value, TreeItemCollapsibleState.Collapsed)) .sort(compareTimeNewestFirst); } @@ -998,8 +1079,7 @@ export class TknImpl implements Tkn { } let pipelines: string[] = data.map((value) => value.metadata.name); pipelines = [...new Set(pipelines)]; - const treeState = pipelines.length > 0 ? TreeItemCollapsibleState.Expanded : TreeItemCollapsibleState.Collapsed; - return pipelines.map((value) => new TektonNodeImpl(pipeline, value, ContextType.PIPELINE, this, treeState)).sort(compareNodes); + return pipelines.map((value) => new TektonNodeImpl(pipeline, value, ContextType.PIPELINE, this, TreeItemCollapsibleState.Collapsed)).sort(compareNodes); } async getPipelineResources(pipelineResources: TektonNode): Promise { @@ -1099,7 +1179,7 @@ export class TknImpl implements Tkn { let data: TknTask[] = []; const result = await this.execute(Command.listTasks()); if (result.error) { - console.log(result + 'Std.err when processing tasks'); + console.error(result + 'Std.err when processing tasks'); return data; } try { @@ -1111,6 +1191,22 @@ export class TknImpl implements Tkn { return data; } + async getRawPipelineRun(name: string): Promise { + const result = await this.execute(Command.getPipelineRun(name)); + let data: PipelineRunData; + if (result.error) { + console.error(result + 'Std.err when processing tasks'); + return undefined; + } + try { + data = JSON.parse(result.stdout); + // eslint-disable-next-line no-empty + } catch (ignore) { + } + + return data; + } + async getClusterTasks(clustertask: TektonNode): Promise { return this._getClusterTasks(clustertask); } diff --git a/src/util/tekton-vfs.ts b/src/util/tekton-vfs.ts index 7322f5de..77020508 100644 --- a/src/util/tekton-vfs.ts +++ b/src/util/tekton-vfs.ts @@ -48,7 +48,10 @@ export class TektonVFSProvider implements FileSystemProvider { this.fileStats.set(uri.toString(), new VFSFileStat()); } - return this.fileStats.get(uri.toString()); + const stat = this.fileStats.get(uri.toString()); + stat.changeStat(stat.size + 1); + + return stat; } async readFile(uri: Uri): Promise { diff --git a/test/tekton/testTektonitem.ts b/test/tekton/testTektonitem.ts index 4019ee6b..ad1ee36d 100644 --- a/test/tekton/testTektonitem.ts +++ b/test/tekton/testTektonitem.ts @@ -10,12 +10,12 @@ export class TestItem implements TektonNode { constructor( - private parent: TektonNode, - private name: string, - public readonly contextValue: ContextType, - private children = [], - public creationtime?: string, - public state?: string) { + private parent: TektonNode, + private name: string, + public readonly contextValue: ContextType, + private children = [], + public creationtime?: string, + public state?: string) { } getName(): string { @@ -37,4 +37,8 @@ export class TestItem implements TektonNode { get label(): string { return this.name; } + + refresh(): Promise { + return Promise.resolve(); + } } diff --git a/test/tkn.test.ts b/test/tkn.test.ts index ed0a318c..61598409 100644 --- a/test/tkn.test.ts +++ b/test/tkn.test.ts @@ -1231,8 +1231,8 @@ suite('tkn', () => { expect(pipelineRun.label).equal('condtional-pr'); const children = pipelineRun.getChildren(); expect(children).to.have.lengthOf(2); - expect(children[0].name).eq('then-check'); - expect(children[1].name).eq('first-create-file'); + expect(children[0].label).eq('then-check'); + expect(children[1].label).eq('first-create-file'); }); test('TaskRun should contains condition run node', () => { @@ -1243,7 +1243,7 @@ suite('tkn', () => { expect(pipelineRun.label).equal('condtional-pr'); const children = pipelineRun.getChildren() as tkn.TektonNodeImpl[]; expect(children).to.have.lengthOf(2); - expect(children[0].name).eq('then-check'); + expect(children[0].label).eq('then-check'); const conditionRun = children[0].getChildren() as tkn.TektonNodeImpl[]; expect(conditionRun).not.undefined; From 1461d124e7886c69118f8cfdbf223a3f9734ef4e Mon Sep 17 00:00:00 2001 From: Yevhen Vydolob Date: Thu, 21 May 2020 14:10:07 +0300 Subject: [PATCH 3/5] remove unused variables Signed-off-by: Yevhen Vydolob --- test/extension.test.ts | 1 - test/tekton/tektonitem.test.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/test/extension.test.ts b/test/extension.test.ts index 3587a499..344a9a66 100644 --- a/test/extension.test.ts +++ b/test/extension.test.ts @@ -36,7 +36,6 @@ suite('Tekton Pipeline Extension', () => { const clustertaskNode = new TektonNodeImpl(TknImpl.ROOT, 'Clustertasks', ContextType.CLUSTERTASKNODE, tkn, vscode.TreeItemCollapsibleState.Collapsed); const pipelineItem = new TektonNodeImpl(pipelineNode, 'test-pipeline', ContextType.PIPELINE, tkn, vscode.TreeItemCollapsibleState.Collapsed); const pipelinerunItem = new TektonNodeImpl(pipelineItem, 'test-pipeline-1', ContextType.PIPELINERUN, tkn, vscode.TreeItemCollapsibleState.Collapsed, '2019-07-25T12:00:00Z', 'True'); - const taskrunItem = new TektonNodeImpl(pipelinerunItem, 'test-taskrun-1', ContextType.TASKRUN, tkn, vscode.TreeItemCollapsibleState.Collapsed, '2019-07-25T12:03:00Z', 'True'); const taskItem = new TektonNodeImpl(taskNode, 'test-tasks', ContextType.TASK, tkn, vscode.TreeItemCollapsibleState.None); const clustertaskItem = new TektonNodeImpl(clustertaskNode, 'test-Clustertask', ContextType.CLUSTERTASK, tkn, vscode.TreeItemCollapsibleState.None); diff --git a/test/tekton/tektonitem.test.ts b/test/tekton/tektonitem.test.ts index 8e43e49d..e3707b12 100644 --- a/test/tekton/tektonitem.test.ts +++ b/test/tekton/tektonitem.test.ts @@ -24,7 +24,6 @@ suite('TektonItem', () => { const pipelineItem = new TestItem(null, 'pipeline', ContextType.PIPELINE); const pipelinerunItem = new TestItem(pipelineItem, 'pipelinerun', ContextType.PIPELINERUN, undefined, '2019-07-25T12:03:00Z', 'True'); const pipelineResourceItem = new TestItem(null, 'pipelineresource', ContextType.PIPELINERESOURCE); - const taskrunItem = new TestItem(pipelinerunItem, 'taskrun', ContextType.PIPELINERUN, undefined, '2019-07-25T12:03:00Z', 'True'); const taskItem = new TestItem(null, 'task', ContextType.TASK); const clustertaskItem = new TestItem(null, 'clustertask', ContextType.CLUSTERTASK); From c58575e4dd229091a8066a5cff7bb390202bc7ae Mon Sep 17 00:00:00 2001 From: Yevhen Vydolob Date: Thu, 21 May 2020 15:12:49 +0300 Subject: [PATCH 4/5] add more descriptive message in case taskrun load error Signed-off-by: Yevhen Vydolob --- src/tekton/tektonitem.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tekton/tektonitem.ts b/src/tekton/tektonitem.ts index 734cdf05..e80f0944 100644 --- a/src/tekton/tektonitem.ts +++ b/src/tekton/tektonitem.ts @@ -67,7 +67,13 @@ export abstract class TektonItem { if (doc) { window.showTextDocument(doc, { preserveFocus: true, preview: true }); } - }, (err) => window.showErrorMessage(`Error loading document: ${err}`)); + }, (err) => { + if (type === 'taskrun') { + window.showErrorMessage('TaskRun may not have started yet, try again when it starts running'); + } else { + window.showErrorMessage(`Error loading document: ${err}`) + } + }); } static getOutputFormat(): string { From fa11ea04eb9854838cf3caaf50e389a6e32da5f6 Mon Sep 17 00:00:00 2001 From: Yevhen Vydolob Date: Fri, 22 May 2020 10:36:43 +0300 Subject: [PATCH 5/5] Use new state icons for some tree items Signed-off-by: Yevhen Vydolob --- .gitignore | 1 - CONTRIBUTING.md | 10 + README.md | 10 +- build/build-svg-icons.ts | 41 ++ images/failed.png | Bin 2743 -> 0 bytes images/generated/error/C.svg | 1 + images/generated/error/PLR.svg | 1 + images/generated/error/TR.svg | 1 + images/generated/pending/C.svg | 1 + images/generated/pending/PLR.svg | 1 + images/generated/pending/TR.svg | 1 + images/success.png | Bin 2573 -> 0 bytes package-lock.json | 1038 +++++++++++++++++++++--------- package.json | 4 +- src/tkn.ts | 40 +- 15 files changed, 814 insertions(+), 336 deletions(-) create mode 100644 build/build-svg-icons.ts delete mode 100644 images/failed.png create mode 100644 images/generated/error/C.svg create mode 100644 images/generated/error/PLR.svg create mode 100644 images/generated/error/TR.svg create mode 100644 images/generated/pending/C.svg create mode 100644 images/generated/pending/PLR.svg create mode 100644 images/generated/pending/TR.svg delete mode 100644 images/success.png diff --git a/.gitignore b/.gitignore index 53be6839..83d81ec5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ node_modules *.vsix coverage/ preview/ - .DS_Store diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a9910f4a..13f8d2ea 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,3 +45,13 @@ To generate new snippet json, run: $ npm run snippets-build ``` npm script from extension root. + +## Generate new icons + +If you want to change icons for PipelieRun, TaskRun or Condition, you may want to generate new state icons for failed and pending state. +To do that run: +```bash +$ npm run icon-build +``` +npm script from extension root. +New icons will be placed in [images/generated](./images/generated). diff --git a/README.md b/README.md index 20f48500..0c272aa8 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ A Visual Studio Code extension for interacting with Tekton Pipelines.
### New icons and Tekton resources -
+
### Provides editing support for Pipeline yaml
@@ -92,8 +92,12 @@ Development of the Tekton Pipelines Extension is largely following development o
ClusterTask Node
PipelineResource Node
PipelineRun/TaskRun Running
-
PipelineRun/TaskRun Successful Run
-
PipelineRun/TaskRun Failed Run
+
PipelineRun Failed
+
TaskRun Failed
+
Condition Failed
+
PipelineRun Pending
+
TaskRun Pending
+
Condition Pending
### Extension Configuration Settings diff --git a/build/build-svg-icons.ts b/build/build-svg-icons.ts new file mode 100644 index 00000000..9dda8d9c --- /dev/null +++ b/build/build-svg-icons.ts @@ -0,0 +1,41 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ +import * as path from 'path'; +import * as fs from 'fs-extra'; +import * as svgTools from 'simple-svg-tools'; +import { exit } from 'shelljs'; + +const icons = ['C.svg', 'TR.svg', 'PLR.svg']; +const stateToColor = { + error: 'red', + pending: 'grey' +}; + +const imagesPath = path.join(__dirname, '..', '..', 'images'); +const destinationPath = path.join(__dirname, '..', '..', 'images', 'generated'); +fs.ensureDirSync(destinationPath); + + +async function generateIcons(): Promise { + for (const icon of icons) { + const iconPath = path.join(imagesPath, icon); + if (fs.existsSync(iconPath)) { + + for (const state in stateToColor) { + const color = stateToColor[state]; + fs.ensureDirSync(path.join(destinationPath, state)); + let svg = await svgTools.ImportSVG(iconPath); + svg = await svgTools.SVGO(svg); + svg = await svgTools.ChangePalette(svg, { + '#38812f': color, + }); + + await svgTools.ExportSVG(svg, path.join(destinationPath, state, icon)); + } + } + } +} + +generateIcons().then(() => exit(0)); diff --git a/images/failed.png b/images/failed.png deleted file mode 100644 index 194cad7c3000a9e62fbfaa0c30fc5bb091e79303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2743 zcmZ`*c{J2(82$~@7+hfnHHa|=8L~_Zr8_icn6b?m`%;$1F3NI^rAxBYy)m{48Ea*$ z#E7g>vLr+?ZuYW7v{sRdAH|Dq?#ED2}lY603bvr5oibKdf-t| z$U$6HZj3(wa3G#+2|cg~C_UjI=f6s_3j_c`_%8u2tn`LXIP%Vi>tr(1K*eh@z?g>E7tMRLCOuOGdx97lSs)T8G2&r zB0H@9_@rn(O9ee9W2%HF<2)539<90*%o|JKIqMuA@@ApkJwYlhPv>Nad*Z-Q%;s1eauaK3379ERX07t4{P4$rU^@^NF zS+Tb*iP9gQmOQMre99N&#AC~HpOD*hw33|;43lx(p8Gw&WZ26a<^JAAOT|SC4jEiL zc~~INy=~dYDUYFWYY%qhTF^{pvvtubG-|4N+lVK2X)qQZBDAwi$yXYs6r%Q;{+xF( z&GbNQx~J`;|C+oac1KrLW@N*RcJV4r=>7X}t<&{Cw`?x)02x+NEl74JI3y0X+QSv5rE9G=DWh`!?JccC$J9R zIPd}gE1c1iovKUUzHmm_waLLvOCLb}GaT+V23a-+@rKKv;a1Z`*Ve{O3%A1GGOYgL z8mWS8&8zue$y^{o%n1#R5fwZ(~cJDsFT{SH%#w-x`dEbD=I20uVOe@gRZal4)M z%LN#~j`WU*zviZq--&)>mW6p->g$^5d0Id?2d9*))}~~P@JO448$lkaQFf@gjwoUN zC!fo662Bf{jyxgTnl)Kg3eeG&W8-G9Ot^bCZSeD!u&H!P8U-zCsO7idqbk1Vg}vc{ zYEwFaD1}9&xIxE#Zaa#*6(|pa>M{j3Mlu251$R^XW;~HtIO~SD<=0DaNxBva5?lC* z3L^GiYzfxO`57ta{JUI5%ty2p!W^yIS&SuIEhGlKaI5VSeqM8IORtvIas-lm4%{fq zxss2@$X9`ZsBRM~^yHQRd)X!Du$Abtg4y*q^iT`Sn6~zV{}?01&GQdW&GXwAT~ld~ ziy5W4<-l}Ze)P&$k02c-OELIk>`(LeN_~1wdU+5JvdV@vuB+a&mCA9RjhnVKScCyl zp+uP=k8E6uit8t?Ls;m?vw_h1F;q|YD?;>y*6a*LeaCm%ilW;@hxtc1*A%Wu5JtWQ zlwl!Fk6P9eX$U(b0DwHi?ax?g<#guY8&CUUor3Va(eFI%vA(2i<h1_ml2b0UU z&aqTJa2klohBIGUeS|IQ3tX@GqP(Tns%=DvA3qVY;Gm;CDN9|X7lW<^t7|>`4RcI3 zwJ1qM)sOR7Xwb;b#MA^kFv-Fcm7@Wmz=L>s0m7upi-I{E&%5aknGRY^XA6f4!&T4PDbY{0&OGX6KK6{w-7GkZ{!xJ#_@6r#YWdVS3<);l`X+;dK zeM*^;SDVt84rnGX+UB}oFkU18Fi=~ShB(PXZS1>BEntXOBx4>R>eRtoGPSA02n*W8 z?r7?gX&Hdt4da`xJj8@WqII=qRH7a6B{SW8Vp6D783aIW;bL${(GjX8X{~OZK<1aI|iKJOBdn0tAF#EVhlGQ z9*o&%$hC<6c~f;v;;r= zZSg5#@iHe*aU#MT`I^B$nyO(_bvW+|&%@931l9F*wI*MfH@cAFJfSIp6H!qzhDA#R zH<06^Hy)1f$5TvQZ+SSydN~cn45m%KJ&lD@SaFico?f33_oan%jJdFg>P)%Yf8%o1 z&-+XIt4<$~Ky)DI{T_oK)pVy5W0 zfq?_kxvzJjq>&4f{u2w?=E=>fA)ZQ=mWaZKO2j; zNa7hY$eodwu|G}FVVzhD$%bh1-9xwMRi2aO``cr!_YAN3o9m>`Cu4YP2jqn^R#aAP z4;YphzI#Dt@5giadqrgs>8nihr7B0hDW%q@=PPkD$fS_gniG9B#G|zE;BxKLq3jC* z;+7!^lLY(SI3n_U*+_H$vqc>*GJp*$%Tu#@C#E-65T=vO>-57o@sM7~oWN_o!V0Ah zg|`c_3p6)VnV@@V<9(B@A*oC~q^ziCNOOOLsvrn=QS;6Bza9LS&;Gi%$*zJbeqgy# znt08s1;r+OYz*1GGFR!T`hm?h9op0C&Q$vnP~0S!y}t2lNg8<7 zPc)cyESO|rd;(fS5cR>xCfW_-u?bH9aM{pYi%C^SGML5pRr3(evqkNNA-J+GEZ}Fm mqQlIw|5I%LsX0TNRi}!Sp6P!oe?%Q9Pk>A`BUIs?qyGhFeEMhr diff --git a/images/generated/error/C.svg b/images/generated/error/C.svg new file mode 100644 index 00000000..2a53c386 --- /dev/null +++ b/images/generated/error/C.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/generated/error/PLR.svg b/images/generated/error/PLR.svg new file mode 100644 index 00000000..cb882423 --- /dev/null +++ b/images/generated/error/PLR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/generated/error/TR.svg b/images/generated/error/TR.svg new file mode 100644 index 00000000..cbc6e820 --- /dev/null +++ b/images/generated/error/TR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/generated/pending/C.svg b/images/generated/pending/C.svg new file mode 100644 index 00000000..c77ecaf8 --- /dev/null +++ b/images/generated/pending/C.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/generated/pending/PLR.svg b/images/generated/pending/PLR.svg new file mode 100644 index 00000000..d3145164 --- /dev/null +++ b/images/generated/pending/PLR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/generated/pending/TR.svg b/images/generated/pending/TR.svg new file mode 100644 index 00000000..23519788 --- /dev/null +++ b/images/generated/pending/TR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/success.png b/images/success.png deleted file mode 100644 index 092e665ea85bf6c4a4fb5c04a868a21cddfcc6c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2573 zcmaJ@i#OAa8~;vonTW>9@Mbm(p>in-nVFe8Gt4zH_e+V_oy5|_WO6AHMlM|@NiILM zgxn{gQkkOMFE6!niQnEo;P-pZ`8=QVJkL4LdCuoN&pA)JosF5esH`Xe0OIBZ9Ffo7 zd?bqq@%@@=>vcYXBe3Qq5xymeP-y%Za*5y)0Ra1@{sjmqERx~pYRz%Rq?n@RVz&_K zS=j5n*#X&;mZcg_siSF2eNyOvCxe2e<2pfebZkS+>ZsTW{^*=|J zwP)oy9PZH4fG!s}l+oo~M^^tINyq848=v-hOP-MI zkq5liVAayp-v(+!A~Oy`=ZH}@Eu@{P_o=BRj$0S+&^yz6TAORKY6(t+LSXRZZ+(W+ zp@ak7G}?iRqTb!I{IU(k44sCf^|a>PdEHp?(a~4!sw|t(G#5W9ZpILRpilk-eweSFjO+Tpx8P<1x#RITph_og41FQ`Snwsm_nU*Lw(zQ7>jo8vij{Wv1G|OG!_nk=k#*eaX33|c9pbxl5 z%Y%L%V{KxtuB<}EGuD{dOTl}L%hDMhoueu-hj1UivS7lZOU>?9M!d$X70dAPbjQxN zwn3vyq8^~UfwCcaeNAH=h~rjR13GJDLNf3-26s*uDnK%8@scp1On1N3TK@` zx`4X zp?%dOUx+9Zu#}zacYo4v*@Ib&J5VP9z^ejXpggi|K^OBI@HJETd5c5tT=)~(0FLdn zU8g`jJ9HLCWHPMsckf3&k8a>-4*IGy$Ke+rj^-B3(QL5aF;Os+tmI8O^gi0+(3|)B zDmODttNWbZzNZlJ5C@e-lgcyn1LJpeb;tgpZr8r|pX$PIqJd-#YqV*lkvqB0bM~ym zqf%-K;}&bmAV9{zj97!OC+}m~h_LX-lrP9S_Xcp`M^HM`RWVxCt<;C1>;P`;jem6t zq&Q6XWuR(+^_UnLEt2^DAf_2@0(H+_V5Fpzw? z*qQc=hB$E6u@ZwEe6_sqb=Z!nj@AR50HDY*7oJ2`miX{`Goh6bcHjik2+?;{0t2Bpg1+C?O z&12vo0D}6?%4g8jy>%4DzUHN24a+db6VZU4n_e`pH1J6sZRgcyznFO23NBX*styuu zT}ztXzF$(Ta*32Es{e_E!iJtRLI{7&Keiouz%r z`L=;BGG$|6?!22lgi0{VR08%_ud>oa>CPl=FB z8*e_F6*!;Qp5ODm{YdEi6?@p#L-Ysu+_k$5-lvlCzQgktJtdL!-Je-m-+TbL;fzO~ z2+2Ija3ufZU%nG$Pq*y(-Y}n+_ZB=Jd*P3QLi8slUYuCytZOr3w#QH7(UTlDvneQ7 z3UoYsF26bpq6=NjFwokTE2uYVL$H`;RLjduvifs;c$AJ*9qU{1s*HTzp8IYMwj`t8 zCPah;`_IBB!H3hiK<+=jwm*dn$5rP9{XV&{3NJ`99QeAPEYR4odp@>oHW6W>lF1d% zQ}%PyKLwI5ZK*$PZKPfRF2$Yz4@90iabdieIY;3o4cA(^JH4EgJ$?>0lY}K7+rBZt z`i@?jE4P~m#~NkGOZhwgeNnubnMdBkRqLNb~NR9dhLw;_p9L8P;YQs6rx5-a7vy1?LAmd|jckY_WYh$h#|pW$k% zLVb%Gj10Q(i)#V*{f#B;tzNj?0hSg#dZyOGKX+c|VW#LAfod3@O=B73{7S=1}zi!E>NB{r; diff --git a/package-lock.json b/package-lock.json index 6e53ef1a..7100a1b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ }, "@kubernetes/client-node": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.10.3.tgz", + "resolved": "http://localhost:8080/@kubernetes/client-node/-/client-node-0.10.3.tgz", "integrity": "sha512-mw+1zdKfMW4QN2ns82SKFhAvqC4SVUAiItto4oFg3Me+a510h3h9N5O7ad6m4efAmlQBlMc6Y5FHz70dAwuiMg==", "requires": { "@types/js-yaml": "^3.12.1", @@ -62,7 +62,7 @@ }, "@sindresorhus/is": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "resolved": "http://localhost:8080/@sindresorhus/is/-/is-0.7.0.tgz", "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" }, "@sinonjs/commons": { @@ -76,7 +76,7 @@ }, "@sinonjs/formatio": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "resolved": "http://localhost:8080/@sinonjs/formatio/-/formatio-3.2.2.tgz", "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", "dev": true, "requires": { @@ -86,7 +86,7 @@ }, "@sinonjs/samsam": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "resolved": "http://localhost:8080/@sinonjs/samsam/-/samsam-3.3.3.tgz", "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", "dev": true, "requires": { @@ -97,7 +97,7 @@ }, "@sinonjs/text-encoding": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "resolved": "http://localhost:8080/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, @@ -118,7 +118,7 @@ }, "@types/caseless": { "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "resolved": "http://localhost:8080/@types/caseless/-/caseless-0.12.2.tgz", "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" }, "@types/chai": { @@ -159,7 +159,7 @@ }, "@types/events": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "resolved": "http://localhost:8080/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, @@ -174,7 +174,7 @@ }, "@types/glob": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "resolved": "http://localhost:8080/@types/glob/-/glob-7.1.1.tgz", "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { @@ -185,7 +185,7 @@ }, "@types/humanize-duration": { "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.18.0.tgz", + "resolved": "http://localhost:8080/@types/humanize-duration/-/humanize-duration-3.18.0.tgz", "integrity": "sha512-11QHl+GvEQ5TlCjA9xqQKNv4S0P8XFq5uHeZe2UPjngESBl7tA1tai/60eEYwWMFWIyQOl7ybarYF0B33K3Qtg==", "dev": true }, @@ -202,13 +202,13 @@ }, "@types/minimatch": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "resolved": "http://localhost:8080/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, "@types/mkdirp": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "resolved": "http://localhost:8080/@types/mkdirp/-/mkdirp-0.5.2.tgz", "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", "dev": true, "requires": { @@ -217,7 +217,7 @@ }, "@types/mocha": { "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "resolved": "http://localhost:8080/@types/mocha/-/mocha-5.2.7.tgz", "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", "dev": true }, @@ -233,6 +233,12 @@ "integrity": "sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==", "dev": true }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, "@types/request": { "version": "2.48.5", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", @@ -272,7 +278,7 @@ }, "@types/sinon": { "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-5.0.7.tgz", + "resolved": "http://localhost:8080/@types/sinon/-/sinon-5.0.7.tgz", "integrity": "sha512-opwMHufhUwkn/UUDk35LDbKJpA2VBsZT8WLU8NjayvRLGPxQkN+8XmfC2Xl35MAscBE8469koLLBjaI3XLEIww==", "dev": true }, @@ -288,13 +294,13 @@ }, "@types/string-format": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/string-format/-/string-format-2.0.0.tgz", + "resolved": "http://localhost:8080/@types/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-mMwtmgN0ureESnJ3SuMM4W9lsi4CgOxs43YxNo14SDHgzJ+OPYO3yM7nOTJTh8x5YICseBdtrySUbvxnpb+NYQ==", "dev": true }, "@types/tmp": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.1.0.tgz", + "resolved": "http://localhost:8080/@types/tmp/-/tmp-0.1.0.tgz", "integrity": "sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA==", "dev": true }, @@ -310,7 +316,7 @@ }, "@types/validator": { "version": "10.11.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-10.11.3.tgz", + "resolved": "http://localhost:8080/@types/validator/-/validator-10.11.3.tgz", "integrity": "sha512-GKF2VnEkMmEeEGvoo03ocrP9ySMuX1ypKazIYMlsjfslfBMhOAtC5dmEWKdJioW4lJN7MZRS88kalTsVClyQ9w==", "dev": true }, @@ -583,7 +589,7 @@ }, "abbrev": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "resolved": "http://localhost:8080/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, @@ -610,7 +616,7 @@ }, "aggregate-error": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", + "resolved": "http://localhost:8080/aggregate-error/-/aggregate-error-1.0.0.tgz", "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", "requires": { "clean-stack": "^1.0.0", @@ -642,14 +648,14 @@ }, "amdefine": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "resolved": "http://localhost:8080/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true, "optional": true }, "ansi-colors": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "resolved": "http://localhost:8080/ansi-colors/-/ansi-colors-3.2.3.tgz", "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, @@ -678,7 +684,7 @@ }, "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "resolved": "http://localhost:8080/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { @@ -687,7 +693,7 @@ }, "ansi-wrap": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "resolved": "http://localhost:8080/ansi-wrap/-/ansi-wrap-0.1.0.tgz", "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, @@ -710,7 +716,7 @@ }, "argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "resolved": "http://localhost:8080/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { "sprintf-js": "~1.0.2" @@ -718,13 +724,13 @@ }, "argv": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "resolved": "http://localhost:8080/argv/-/argv-0.0.2.tgz", "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", "dev": true }, "arr-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "resolved": "http://localhost:8080/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, @@ -736,13 +742,13 @@ }, "arr-union": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "resolved": "http://localhost:8080/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, "array-from": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "resolved": "http://localhost:8080/array-from/-/array-from-2.1.1.tgz", "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, @@ -754,7 +760,7 @@ }, "asn1": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "resolved": "http://localhost:8080/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { "safer-buffer": "~2.1.0" @@ -808,18 +814,18 @@ }, "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "resolved": "http://localhost:8080/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assertion-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "resolved": "http://localhost:8080/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "assign-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "resolved": "http://localhost:8080/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, @@ -831,7 +837,7 @@ }, "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "http://localhost:8080/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -844,12 +850,12 @@ }, "async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "resolved": "http://localhost:8080/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "resolved": "http://localhost:8080/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { @@ -860,7 +866,7 @@ }, "aws-sign2": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "resolved": "http://localhost:8080/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { @@ -870,7 +876,7 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": "http://localhost:8080/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { @@ -935,12 +941,12 @@ }, "base64url": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "resolved": "http://localhost:8080/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" }, "bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "resolved": "http://localhost:8080/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { "tweetnacl": "^0.14.3" @@ -954,7 +960,7 @@ }, "binary": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "resolved": "http://localhost:8080/binary/-/binary-0.3.0.tgz", "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", "requires": { "buffers": "~0.1.1", @@ -970,7 +976,7 @@ }, "binary-search": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", + "resolved": "http://localhost:8080/binary-search/-/binary-search-1.3.6.tgz", "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "bindings": { @@ -985,7 +991,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://localhost:8080/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { "readable-stream": "^2.3.5", @@ -1004,9 +1010,15 @@ "integrity": "sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==", "dev": true }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "bops": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.3.tgz", + "resolved": "http://localhost:8080/bops/-/bops-0.0.3.tgz", "integrity": "sha1-xcv2/qi+dAHKXqbRZ55sTotAfHk=", "requires": { "base64-js": "0.0.2", @@ -1022,7 +1034,7 @@ }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": "http://localhost:8080/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", @@ -1046,7 +1058,7 @@ }, "browser-stdout": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "resolved": "http://localhost:8080/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, @@ -1154,7 +1166,7 @@ }, "buffer-alloc": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "resolved": "http://localhost:8080/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "requires": { "buffer-alloc-unsafe": "^1.1.0", @@ -1163,17 +1175,17 @@ }, "buffer-alloc-unsafe": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "resolved": "http://localhost:8080/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, "buffer-fill": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "resolved": "http://localhost:8080/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, "buffer-from": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "resolved": "http://localhost:8080/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, @@ -1185,7 +1197,7 @@ }, "buffers": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "resolved": "http://localhost:8080/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, "builtin-status-codes": { @@ -1196,7 +1208,7 @@ }, "byline": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "resolved": "http://localhost:8080/byline/-/byline-5.0.0.tgz", "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" }, "cacache": { @@ -1252,7 +1264,7 @@ }, "cacheable-request": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "resolved": "http://localhost:8080/cacheable-request/-/cacheable-request-2.1.4.tgz", "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", "requires": { "clone-response": "1.0.2", @@ -1266,19 +1278,19 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://localhost:8080/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "lowercase-keys": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "resolved": "http://localhost:8080/lowercase-keys/-/lowercase-keys-1.0.0.tgz", "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" } } }, "callsite": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "resolved": "http://localhost:8080/callsite/-/callsite-1.0.0.tgz", "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", "dev": true }, @@ -1290,18 +1302,18 @@ }, "camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "resolved": "http://localhost:8080/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "resolved": "http://localhost:8080/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chai": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "resolved": "http://localhost:8080/chai/-/chai-4.2.0.tgz", "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { @@ -1315,7 +1327,7 @@ }, "chainsaw": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "resolved": "http://localhost:8080/chainsaw/-/chainsaw-0.1.0.tgz", "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", "requires": { "traverse": ">=0.3.0 <0.4" @@ -1323,7 +1335,7 @@ }, "chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "resolved": "http://localhost:8080/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { @@ -1340,10 +1352,34 @@ }, "check-error": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "resolved": "http://localhost:8080/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + } + }, "chokidar": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", @@ -1415,7 +1451,7 @@ }, "clean-stack": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "resolved": "http://localhost:8080/clean-stack/-/clean-stack-1.3.0.tgz", "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" }, "cli-cursor": { @@ -1435,7 +1471,7 @@ }, "cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "resolved": "http://localhost:8080/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { @@ -1458,7 +1494,7 @@ }, "string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "resolved": "http://localhost:8080/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -1471,12 +1507,23 @@ }, "clone-response": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "resolved": "http://localhost:8080/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "requires": { "mimic-response": "^1.0.0" } }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, "codecov": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.7.0.tgz", @@ -1502,7 +1549,7 @@ }, "color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "resolved": "http://localhost:8080/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { @@ -1511,13 +1558,13 @@ }, "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "resolved": "http://localhost:8080/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "resolved": "http://localhost:8080/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" @@ -1525,7 +1572,7 @@ }, "commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "resolved": "http://localhost:8080/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, @@ -1543,7 +1590,7 @@ }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "http://localhost:8080/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { @@ -1603,7 +1650,7 @@ }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": "http://localhost:8080/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "create-ecdh": { @@ -1653,7 +1700,7 @@ }, "cross-spawn": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "resolved": "http://localhost:8080/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { "nice-try": "^1.0.4", @@ -1665,7 +1712,7 @@ "dependencies": { "semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "resolved": "http://localhost:8080/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } @@ -1689,6 +1736,87 @@ "randomfill": "^1.0.3" } }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "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 + } + } + }, + "cyberalien-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cyberalien-color/-/cyberalien-color-1.0.0.tgz", + "integrity": "sha1-9/kTX+Daof9bNzs4W+mEGcJk/l4=", + "dev": true + }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -1726,7 +1854,7 @@ }, "dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "resolved": "http://localhost:8080/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" @@ -1757,18 +1885,18 @@ }, "decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "resolved": "http://localhost:8080/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "decode-uri-component": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "resolved": "http://localhost:8080/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress-response": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "resolved": "http://localhost:8080/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { "mimic-response": "^1.0.0" @@ -1776,7 +1904,7 @@ }, "deep-eql": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "resolved": "http://localhost:8080/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { @@ -1785,13 +1913,13 @@ }, "deep-is": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "resolved": "http://localhost:8080/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "define-properties": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "resolved": "http://localhost:8080/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { @@ -1841,7 +1969,7 @@ }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": "http://localhost:8080/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "des.js": { @@ -1862,7 +1990,7 @@ }, "diff": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "resolved": "http://localhost:8080/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, @@ -1894,25 +2022,60 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, "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 }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "duplex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/duplex/-/duplex-1.0.0.tgz", + "resolved": "http://localhost:8080/duplex/-/duplex-1.0.0.tgz", "integrity": "sha1-arxcFuwX5MV4V4cnEmcAWQ06Ldo=" }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://localhost:8080/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, "duplexer3": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "resolved": "http://localhost:8080/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "duplexify": { @@ -1929,7 +2092,7 @@ }, "ecc-jsbn": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "resolved": "http://localhost:8080/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { "jsbn": "~0.1.0", @@ -1961,7 +2124,7 @@ }, "emit-function": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/emit-function/-/emit-function-0.0.2.tgz", + "resolved": "http://localhost:8080/emit-function/-/emit-function-0.0.2.tgz", "integrity": "sha1-46ULPWG+G/jKiLkkv3ExV6W+wSQ=" }, "emoji-regex": { @@ -1978,7 +2141,7 @@ }, "end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "resolved": "http://localhost:8080/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" @@ -1995,6 +2158,12 @@ "tapable": "^1.0.0" } }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -2025,7 +2194,7 @@ }, "es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "resolved": "http://localhost:8080/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { @@ -2036,12 +2205,12 @@ }, "es6-promise": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "resolved": "http://localhost:8080/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://localhost:8080/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -2050,13 +2219,13 @@ }, "escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "resolved": "http://localhost:8080/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "escodegen": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "resolved": "http://localhost:8080/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "requires": { @@ -2069,7 +2238,7 @@ "dependencies": { "esprima": { "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "resolved": "http://localhost:8080/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, @@ -2187,7 +2356,7 @@ }, "esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "resolved": "http://localhost:8080/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { @@ -2224,13 +2393,13 @@ }, "esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "resolved": "http://localhost:8080/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "http://localhost:8080/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "requires": { "duplexer": "~0.1.1", @@ -2260,7 +2429,7 @@ }, "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "resolved": "http://localhost:8080/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { "cross-spawn": "^6.0.0", @@ -2339,12 +2508,12 @@ }, "extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "resolved": "http://localhost:8080/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "resolved": "http://localhost:8080/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { @@ -2447,7 +2616,7 @@ }, "extsprintf": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "resolved": "http://localhost:8080/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { @@ -2462,7 +2631,7 @@ }, "fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "resolved": "http://localhost:8080/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, @@ -2499,7 +2668,7 @@ }, "fill-keys": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "resolved": "http://localhost:8080/fill-keys/-/fill-keys-1.0.2.tgz", "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", "dev": true, "requires": { @@ -2529,7 +2698,7 @@ }, "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "resolved": "http://localhost:8080/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { @@ -2667,7 +2836,7 @@ }, "flat": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "resolved": "http://localhost:8080/flat/-/flat-4.1.0.tgz", "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", "dev": true, "requires": { @@ -2720,12 +2889,12 @@ }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "resolved": "http://localhost:8080/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "resolved": "http://localhost:8080/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "requires": { "asynckit": "^0.4.0", @@ -2744,12 +2913,12 @@ }, "from": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "resolved": "http://localhost:8080/from/-/from-0.1.7.tgz", "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" }, "from2": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "resolved": "http://localhost:8080/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", @@ -2758,12 +2927,12 @@ }, "fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "resolved": "http://localhost:8080/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "resolved": "http://localhost:8080/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { "graceful-fs": "^4.1.2", @@ -2785,7 +2954,7 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": "http://localhost:8080/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { @@ -2797,7 +2966,7 @@ }, "function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "resolved": "http://localhost:8080/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, @@ -2809,24 +2978,24 @@ }, "fuzzysearch": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fuzzysearch/-/fuzzysearch-1.0.3.tgz", + "resolved": "http://localhost:8080/fuzzysearch/-/fuzzysearch-1.0.3.tgz", "integrity": "sha1-3/yA9tawQiPyImqnndGUIxCW0Ag=" }, "get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "resolved": "http://localhost:8080/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-func-name": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "resolved": "http://localhost:8080/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, "get-stream": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "resolved": "http://localhost:8080/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { "pump": "^3.0.0" @@ -2840,7 +3009,7 @@ }, "getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "resolved": "http://localhost:8080/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { "assert-plus": "^1.0.0" @@ -2848,7 +3017,7 @@ }, "git-fetch-pack": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/git-fetch-pack/-/git-fetch-pack-0.1.1.tgz", + "resolved": "http://localhost:8080/git-fetch-pack/-/git-fetch-pack-0.1.1.tgz", "integrity": "sha1-dwOjLPDbgPBg0nZqNKwA0CzrzfU=", "requires": { "bops": "0.0.3", @@ -2859,14 +3028,14 @@ "dependencies": { "through": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", + "resolved": "http://localhost:8080/through/-/through-2.2.7.tgz", "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=" } } }, "git-packed-ref-parse": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/git-packed-ref-parse/-/git-packed-ref-parse-0.0.0.tgz", + "resolved": "http://localhost:8080/git-packed-ref-parse/-/git-packed-ref-parse-0.0.0.tgz", "integrity": "sha1-uFBGkx8+SmVnm13lSvOl0983JkY=", "requires": { "line-stream": "0.0.0", @@ -2875,14 +3044,14 @@ "dependencies": { "through": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", + "resolved": "http://localhost:8080/through/-/through-2.2.7.tgz", "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=" } } }, "git-read-pkt-line": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/git-read-pkt-line/-/git-read-pkt-line-0.0.8.tgz", + "resolved": "http://localhost:8080/git-read-pkt-line/-/git-read-pkt-line-0.0.8.tgz", "integrity": "sha1-SUA3hU7Ve9kM1VZ2VA2GqwyzbKo=", "requires": { "bops": "0.0.3", @@ -2891,14 +3060,14 @@ "dependencies": { "through": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", + "resolved": "http://localhost:8080/through/-/through-2.2.7.tgz", "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=" } } }, "git-transport-protocol": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/git-transport-protocol/-/git-transport-protocol-0.1.0.tgz", + "resolved": "http://localhost:8080/git-transport-protocol/-/git-transport-protocol-0.1.0.tgz", "integrity": "sha1-mfTdY4m5Fh7e10qeYX1rpe0KbCw=", "requires": { "duplex": "~1.0.0", @@ -2910,14 +3079,14 @@ "dependencies": { "through": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", + "resolved": "http://localhost:8080/through/-/through-2.2.7.tgz", "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=" } } }, "git-write-pkt-line": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/git-write-pkt-line/-/git-write-pkt-line-0.1.0.tgz", + "resolved": "http://localhost:8080/git-write-pkt-line/-/git-write-pkt-line-0.1.0.tgz", "integrity": "sha1-qEwYVsCQEZCDibLwb5EdkfY5RpQ=", "requires": { "bops": "0.0.3", @@ -2926,14 +3095,14 @@ "dependencies": { "through": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", + "resolved": "http://localhost:8080/through/-/through-2.2.7.tgz", "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=" } } }, "glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "resolved": "http://localhost:8080/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", @@ -3007,7 +3176,7 @@ }, "got": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "resolved": "http://localhost:8080/got/-/got-8.3.2.tgz", "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", "requires": { "@sindresorhus/is": "^0.7.0", @@ -3031,7 +3200,7 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://localhost:8080/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } @@ -3052,7 +3221,7 @@ }, "growl": { "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "resolved": "http://localhost:8080/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, @@ -3079,12 +3248,12 @@ }, "har-schema": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "resolved": "http://localhost:8080/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "resolved": "http://localhost:8080/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { "ajv": "^6.5.5", @@ -3093,7 +3262,7 @@ }, "has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "resolved": "http://localhost:8080/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { @@ -3108,18 +3277,18 @@ }, "has-symbol-support-x": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "resolved": "http://localhost:8080/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" }, "has-symbols": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "resolved": "http://localhost:8080/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "has-to-string-tag-x": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "resolved": "http://localhost:8080/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "requires": { "has-symbol-support-x": "^1.4.1" @@ -3219,7 +3388,7 @@ }, "hasha": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.0.0.tgz", + "resolved": "http://localhost:8080/hasha/-/hasha-5.0.0.tgz", "integrity": "sha512-PqWdhnQhq6tqD32hZv+l1e5mJHNSudjnaAzgAHfkGiU0ABN6lmbZF8abJIulQHbZ7oiHhP8yL6O910ICMc+5pw==", "requires": { "is-stream": "^1.1.0", @@ -3228,7 +3397,7 @@ }, "he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "resolved": "http://localhost:8080/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, @@ -3258,9 +3427,36 @@ "parse-passwd": "^1.0.0" } }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "http-cache-semantics": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "resolved": "http://localhost:8080/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" }, "http-proxy-agent": { @@ -3276,7 +3472,7 @@ }, "http-signature": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "resolved": "http://localhost:8080/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { "assert-plus": "^1.0.0", @@ -3341,7 +3537,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "resolved": "http://localhost:8080/ignore-walk/-/ignore-walk-3.0.3.tgz", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "requires": { @@ -3376,7 +3572,7 @@ }, "indent-string": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "resolved": "http://localhost:8080/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" }, "infer-owner": { @@ -3387,7 +3583,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "resolved": "http://localhost:8080/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", @@ -3396,7 +3592,7 @@ }, "inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "resolved": "http://localhost:8080/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { @@ -3489,12 +3685,12 @@ }, "interpret": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "resolved": "http://localhost:8080/interpret/-/interpret-1.2.0.tgz", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" }, "into-stream": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "resolved": "http://localhost:8080/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "requires": { "from2": "^2.1.1", @@ -3545,7 +3741,7 @@ }, "is-buffer": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "resolved": "http://localhost:8080/is-buffer/-/is-buffer-2.0.4.tgz", "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", "dev": true }, @@ -3608,7 +3804,7 @@ }, "is-extendable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "resolved": "http://localhost:8080/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { @@ -3644,17 +3840,17 @@ }, "is-object": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "resolved": "http://localhost:8080/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, "is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "resolved": "http://localhost:8080/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "resolved": "http://localhost:8080/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { @@ -3672,17 +3868,17 @@ }, "is-retry-allowed": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "resolved": "http://localhost:8080/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "resolved": "http://localhost:8080/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-symbol": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "resolved": "http://localhost:8080/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { @@ -3691,7 +3887,7 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "resolved": "http://localhost:8080/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-windows": { @@ -3702,38 +3898,38 @@ }, "is-wsl": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "resolved": "http://localhost:8080/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": "http://localhost:8080/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "resolved": "http://localhost:8080/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "resolved": "http://localhost:8080/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "isomorphic-ws": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "resolved": "http://localhost:8080/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" }, "isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "resolved": "http://localhost:8080/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul": { "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "resolved": "http://localhost:8080/istanbul/-/istanbul-0.4.5.tgz", "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "requires": { @@ -3755,13 +3951,13 @@ "dependencies": { "esprima": { "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "resolved": "http://localhost:8080/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "glob": { "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "resolved": "http://localhost:8080/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { @@ -3780,7 +3976,7 @@ }, "resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "resolved": "http://localhost:8080/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, @@ -3797,7 +3993,7 @@ }, "isurl": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "resolved": "http://localhost:8080/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "requires": { "has-to-string-tag-x": "^1.2.0", @@ -3806,13 +4002,13 @@ }, "js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "resolved": "http://localhost:8080/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "resolved": "http://localhost:8080/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "requires": { "argparse": "^1.0.7", @@ -3821,12 +4017,12 @@ }, "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "resolved": "http://localhost:8080/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "json-buffer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "resolved": "http://localhost:8080/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, "json-parse-better-errors": { @@ -3837,12 +4033,12 @@ }, "json-schema": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "resolved": "http://localhost:8080/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "resolved": "http://localhost:8080/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { @@ -3853,7 +4049,7 @@ }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "resolved": "http://localhost:8080/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { @@ -3867,7 +4063,7 @@ }, "jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "resolved": "http://localhost:8080/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" @@ -3875,12 +4071,12 @@ }, "jsonpath-plus": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", + "resolved": "http://localhost:8080/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", "integrity": "sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==" }, "jsprim": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "resolved": "http://localhost:8080/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "requires": { "assert-plus": "1.0.0", @@ -3905,7 +4101,7 @@ }, "keyv": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "resolved": "http://localhost:8080/keyv/-/keyv-3.0.0.tgz", "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "requires": { "json-buffer": "3.0.0" @@ -3928,7 +4124,7 @@ }, "levn": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "resolved": "http://localhost:8080/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { @@ -3938,7 +4134,7 @@ }, "line-stream": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/line-stream/-/line-stream-0.0.0.tgz", + "resolved": "http://localhost:8080/line-stream/-/line-stream-0.0.0.tgz", "integrity": "sha1-iIt8x5UcagXOTWlt0ea4JiNxu0U=", "requires": { "through": "~2.2.0" @@ -3946,7 +4142,7 @@ "dependencies": { "through": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", + "resolved": "http://localhost:8080/through/-/through-2.2.7.tgz", "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=" } } @@ -3970,7 +4166,7 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "resolved": "http://localhost:8080/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { @@ -3983,15 +4179,87 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", + "dev": true + }, + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "dev": true + }, "log-symbols": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "resolved": "http://localhost:8080/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { @@ -4000,23 +4268,23 @@ }, "lolex": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "resolved": "http://localhost:8080/lolex/-/lolex-4.2.0.tgz", "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", "dev": true }, "long": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "resolved": "http://localhost:8080/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "lowercase-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "resolved": "http://localhost:8080/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "resolved": "http://localhost:8080/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" @@ -4048,7 +4316,7 @@ }, "makeerror": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "resolved": "http://localhost:8080/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { @@ -4072,7 +4340,7 @@ }, "map-stream": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "http://localhost:8080/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" }, "map-visit": { @@ -4095,6 +4363,12 @@ "safe-buffer": "^5.1.2" } }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", @@ -4126,7 +4400,7 @@ }, "merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "resolved": "http://localhost:8080/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, @@ -4179,7 +4453,7 @@ }, "mimic-response": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "resolved": "http://localhost:8080/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, "minimalistic-assert": { @@ -4196,7 +4470,7 @@ }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": "http://localhost:8080/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" @@ -4297,7 +4571,7 @@ }, "glob": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "resolved": "http://localhost:8080/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { @@ -4320,7 +4594,7 @@ }, "ms": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "resolved": "http://localhost:8080/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, @@ -4332,7 +4606,7 @@ }, "supports-color": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "resolved": "http://localhost:8080/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { @@ -4362,7 +4636,7 @@ }, "module-not-found-error": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "resolved": "http://localhost:8080/module-not-found-error/-/module-not-found-error-1.0.1.tgz", "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", "dev": true }, @@ -4393,7 +4667,7 @@ }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "resolved": "http://localhost:8080/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, @@ -4437,13 +4711,13 @@ }, "neo-async": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "resolved": "http://localhost:8080/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", + "resolved": "http://localhost:8080/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "nise": { @@ -4472,7 +4746,7 @@ }, "node-environment-flags": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "resolved": "http://localhost:8080/node-environment-flags/-/node-environment-flags-1.0.5.tgz", "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "dev": true, "requires": { @@ -4482,7 +4756,7 @@ "dependencies": { "semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "resolved": "http://localhost:8080/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } @@ -4490,13 +4764,13 @@ }, "node-fetch": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "resolved": "http://localhost:8080/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, "node-forge": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", + "resolved": "http://localhost:8080/node-forge/-/node-forge-0.8.5.tgz", "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" }, "node-jose": { @@ -4573,7 +4847,7 @@ }, "nopt": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "resolved": "http://localhost:8080/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { @@ -4589,7 +4863,7 @@ }, "normalize-url": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "resolved": "http://localhost:8080/normalize-url/-/normalize-url-2.0.1.tgz", "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "requires": { "prepend-http": "^2.0.0", @@ -4599,20 +4873,29 @@ }, "npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "resolved": "http://localhost:8080/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { "path-key": "^2.0.0" } }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, "oauth-sign": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "resolved": "http://localhost:8080/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": "http://localhost:8080/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { @@ -4654,18 +4937,18 @@ }, "object-hash": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "resolved": "http://localhost:8080/object-hash/-/object-hash-1.3.1.tgz", "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" }, "object-inspect": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "resolved": "http://localhost:8080/object-inspect/-/object-inspect-1.7.0.tgz", "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, "object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "resolved": "http://localhost:8080/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, @@ -4680,7 +4963,7 @@ }, "object.assign": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "resolved": "http://localhost:8080/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { @@ -4709,14 +4992,26 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "oidc-token-hash": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-3.0.2.tgz", + "resolved": "http://localhost:8080/oidc-token-hash/-/oidc-token-hash-3.0.2.tgz", "integrity": "sha512-dTzp80/y/da+um+i+sOucNqiPpwRL7M/xPwj7pH1TFA2/bqQ+OK2sJahSXbemEoLtPkHcFLyhLhLWZa9yW5+RA==" }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "resolved": "http://localhost:8080/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" @@ -4733,7 +5028,7 @@ }, "open": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "resolved": "http://localhost:8080/open/-/open-6.4.0.tgz", "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", "requires": { "is-wsl": "^1.1.0" @@ -4741,7 +5036,7 @@ }, "openid-client": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-2.5.0.tgz", + "resolved": "http://localhost:8080/openid-client/-/openid-client-2.5.0.tgz", "integrity": "sha512-t3hFD7xEoW1U25RyBcRFaL19fGGs6hNVTysq9pgmiltH0IVUPzH/bQV9w24pM5Q7MunnGv2/5XjIru6BQcWdxg==", "requires": { "base64url": "^3.0.0", @@ -4756,7 +5051,7 @@ }, "optionator": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "resolved": "http://localhost:8080/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { @@ -4793,7 +5088,7 @@ }, "p-any": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-any/-/p-any-1.1.0.tgz", + "resolved": "http://localhost:8080/p-any/-/p-any-1.1.0.tgz", "integrity": "sha512-Ef0tVa4CZ5pTAmKn+Cg3w8ABBXh+hHO1aV8281dKOoUHfX+3tjG2EaFcC+aZyagg9b4EYGsHEjz21DnEE8Og2g==", "requires": { "p-some": "^2.0.0" @@ -4801,7 +5096,7 @@ }, "p-cancelable": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "resolved": "http://localhost:8080/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" }, "p-defer": { @@ -4812,12 +5107,12 @@ }, "p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "resolved": "http://localhost:8080/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "resolved": "http://localhost:8080/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" }, "p-limit": { @@ -4831,7 +5126,7 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "resolved": "http://localhost:8080/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { @@ -4840,7 +5135,7 @@ }, "p-some": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-some/-/p-some-2.0.1.tgz", + "resolved": "http://localhost:8080/p-some/-/p-some-2.0.1.tgz", "integrity": "sha1-Zdh8ixVO289SIdFnd4ttLhUPbwY=", "requires": { "aggregate-error": "^1.0.0" @@ -4848,7 +5143,7 @@ }, "p-timeout": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "resolved": "http://localhost:8080/p-timeout/-/p-timeout-2.0.1.tgz", "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "requires": { "p-finally": "^1.0.0" @@ -4856,7 +5151,7 @@ }, "p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "resolved": "http://localhost:8080/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, @@ -4926,28 +5221,28 @@ }, "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "resolved": "http://localhost:8080/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://localhost:8080/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "resolved": "http://localhost:8080/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "resolved": "http://localhost:8080/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "resolved": "http://localhost:8080/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { @@ -4956,7 +5251,7 @@ "dependencies": { "isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "resolved": "http://localhost:8080/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true } @@ -4964,13 +5259,13 @@ }, "pathval": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "resolved": "http://localhost:8080/pathval/-/pathval-1.1.0.tgz", "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, "pause-stream": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "http://localhost:8080/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "requires": { "through": "~2.3" @@ -4991,7 +5286,7 @@ }, "performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "resolved": "http://localhost:8080/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { @@ -5002,7 +5297,7 @@ }, "pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "resolved": "http://localhost:8080/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "pkg-dir": { @@ -5016,7 +5311,7 @@ }, "plugin-error": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "resolved": "http://localhost:8080/plugin-error/-/plugin-error-1.0.1.tgz", "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { @@ -5028,7 +5323,7 @@ "dependencies": { "ansi-colors": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "http://localhost:8080/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -5039,7 +5334,7 @@ }, "pluralize": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", + "resolved": "http://localhost:8080/pluralize/-/pluralize-4.0.0.tgz", "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=" }, "posix-character-classes": { @@ -5050,13 +5345,13 @@ }, "prelude-ls": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "resolved": "http://localhost:8080/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "prepend-http": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "resolved": "http://localhost:8080/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "process": { @@ -5066,7 +5361,7 @@ }, "process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "resolved": "http://localhost:8080/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { @@ -5083,7 +5378,7 @@ }, "proxyquire": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "resolved": "http://localhost:8080/proxyquire/-/proxyquire-2.1.3.tgz", "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", "dev": true, "requires": { @@ -5127,7 +5422,7 @@ }, "pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "resolved": "http://localhost:8080/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { "end-of-stream": "^1.1.0", @@ -5159,17 +5454,23 @@ }, "punycode": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "resolved": "http://localhost:8080/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, "qs": { "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "resolved": "http://localhost:8080/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "resolved": "http://localhost:8080/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "requires": { "decode-uri-component": "^0.2.0", @@ -5246,7 +5547,7 @@ }, "rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "resolved": "http://localhost:8080/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { "resolve": "^1.1.6" @@ -5270,7 +5571,7 @@ }, "remap-istanbul": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.13.0.tgz", + "resolved": "http://localhost:8080/remap-istanbul/-/remap-istanbul-0.13.0.tgz", "integrity": "sha512-rS5ZpVAx3fGtKZkiBe1esXg5mKYbgW9iz8kkADFt3p6lo3NsBBUX1q6SwdhwUtYCGnr7nK6gRlbYK3i8R0jbRA==", "dev": true, "requires": { @@ -5283,7 +5584,7 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "resolved": "http://localhost:8080/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } @@ -5349,7 +5650,7 @@ }, "request-progress": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "resolved": "http://localhost:8080/request-progress/-/request-progress-3.0.0.tgz", "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", "requires": { "throttleit": "^1.0.0" @@ -5357,13 +5658,13 @@ }, "require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "resolved": "http://localhost:8080/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", + "resolved": "http://localhost:8080/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, @@ -5429,7 +5730,7 @@ }, "responselike": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "resolved": "http://localhost:8080/responselike/-/responselike-1.0.2.tgz", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "requires": { "lowercase-keys": "^1.0.0" @@ -5510,9 +5811,15 @@ }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "resolved": "http://localhost:8080/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -5526,7 +5833,7 @@ }, "semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "resolved": "http://localhost:8080/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "serialize-javascript": { @@ -5537,7 +5844,7 @@ }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": "http://localhost:8080/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, @@ -5588,7 +5895,7 @@ }, "shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "resolved": "http://localhost:8080/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { "shebang-regex": "^1.0.0" @@ -5596,7 +5903,7 @@ }, "shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "resolved": "http://localhost:8080/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { @@ -5614,9 +5921,39 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "simple-svg-tools": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/simple-svg-tools/-/simple-svg-tools-1.1.12.tgz", + "integrity": "sha512-IFzkoAwOsE7F0J3FODgMXZ+Tvb8Tm/1X+jmQAkR2bRtet24GQrrvnhLtS3alZ6crCc27tLuuKYajjruRehKeqg==", + "dev": true, + "requires": { + "cheerio": "^0.22.0", + "cyberalien-color": "*", + "simple-tokenizer": "*", + "svgo": "^1.0.1", + "tmp": "0.0.31" + }, + "dependencies": { + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "simple-tokenizer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/simple-tokenizer/-/simple-tokenizer-1.0.2.tgz", + "integrity": "sha1-OFRJm9jkYhBGq0iNgZXtFMUZ/0E=", + "dev": true + }, "sinon": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "resolved": "http://localhost:8080/sinon/-/sinon-7.5.0.tgz", "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", "dev": true, "requires": { @@ -5796,7 +6133,7 @@ }, "sort-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "resolved": "http://localhost:8080/sort-keys/-/sort-keys-2.0.0.tgz", "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "requires": { "is-plain-obj": "^1.0.0" @@ -5810,7 +6147,7 @@ }, "source-map": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "resolved": "http://localhost:8080/source-map/-/source-map-0.2.0.tgz", "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", "dev": true, "optional": true, @@ -5857,7 +6194,7 @@ }, "split": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "resolved": "http://localhost:8080/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "requires": { "through": "2" @@ -5874,12 +6211,12 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "http://localhost:8080/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "resolved": "http://localhost:8080/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "requires": { "asn1": "~0.2.3", @@ -5902,6 +6239,12 @@ "figgy-pudding": "^3.5.1" } }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -5935,7 +6278,7 @@ }, "stream-combiner": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "http://localhost:8080/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "requires": { "duplexer": "~0.1.1" @@ -5981,12 +6324,12 @@ }, "strict-uri-encode": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "resolved": "http://localhost:8080/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-format": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "resolved": "http://localhost:8080/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" }, "string-width": { @@ -6055,7 +6398,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://localhost:8080/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" @@ -6063,7 +6406,7 @@ "dependencies": { "safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "resolved": "http://localhost:8080/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } @@ -6087,7 +6430,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://localhost:8080/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-json-comments": { @@ -6111,6 +6454,57 @@ "has-flag": "^3.0.0" } }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -6156,7 +6550,7 @@ }, "tar-fs": { "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "resolved": "http://localhost:8080/tar-fs/-/tar-fs-1.16.3.tgz", "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", "requires": { "chownr": "^1.0.1", @@ -6167,7 +6561,7 @@ "dependencies": { "pump": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "resolved": "http://localhost:8080/pump/-/pump-1.0.3.tgz", "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", "requires": { "end-of-stream": "^1.1.0", @@ -6178,7 +6572,7 @@ }, "tar-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "resolved": "http://localhost:8080/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "requires": { "bl": "^1.0.0", @@ -6192,7 +6586,7 @@ }, "targz": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", + "resolved": "http://localhost:8080/targz/-/targz-1.0.1.tgz", "integrity": "sha1-j3alI2lM3t+7XWCkB2/27uzFOY8=", "requires": { "tar-fs": "^1.8.1" @@ -6263,17 +6657,17 @@ }, "throttleit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "resolved": "http://localhost:8080/throttleit/-/throttleit-1.0.0.tgz", "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://localhost:8080/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz", + "resolved": "http://localhost:8080/through2/-/through2-3.0.0.tgz", "integrity": "sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==", "dev": true, "requires": { @@ -6283,7 +6677,7 @@ }, "timed-out": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "resolved": "http://localhost:8080/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { @@ -6297,7 +6691,7 @@ }, "tmp": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "resolved": "http://localhost:8080/tmp/-/tmp-0.1.0.tgz", "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", "dev": true, "requires": { @@ -6317,7 +6711,7 @@ }, "tmpl": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "resolved": "http://localhost:8080/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, @@ -6329,7 +6723,7 @@ }, "to-buffer": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "resolved": "http://localhost:8080/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, "to-object-path": { @@ -6381,7 +6775,7 @@ }, "to-utf8": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", + "resolved": "http://localhost:8080/to-utf8/-/to-utf8-0.0.1.tgz", "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" }, "tough-cookie": { @@ -6395,7 +6789,7 @@ }, "traverse": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "resolved": "http://localhost:8080/traverse/-/traverse-0.3.9.tgz", "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, "ts-loader": { @@ -6433,7 +6827,7 @@ }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "resolved": "http://localhost:8080/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" @@ -6441,12 +6835,12 @@ }, "tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "resolved": "http://localhost:8080/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "resolved": "http://localhost:8080/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { @@ -6455,13 +6849,13 @@ }, "type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "resolved": "http://localhost:8080/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "resolved": "http://localhost:8080/type-fest/-/type-fest-0.3.1.tgz", "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" }, "typedarray": { @@ -6531,9 +6925,15 @@ }, "universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "resolved": "http://localhost:8080/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6576,7 +6976,7 @@ }, "unzip-stream": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.0.tgz", + "resolved": "http://localhost:8080/unzip-stream/-/unzip-stream-0.3.0.tgz", "integrity": "sha512-NG1h/MdGIX3HzyqMjyj1laBCmlPYhcO4xEy7gEqqzGiSLw7XqDQCnY4nYSn5XSaH8mQ6TFkaujrO8d/PIZN85A==", "requires": { "binary": "^0.3.0", @@ -6592,7 +6992,7 @@ }, "uri-js": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "resolved": "http://localhost:8080/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { "punycode": "^2.1.0" @@ -6624,7 +7024,7 @@ }, "url-parse-lax": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "resolved": "http://localhost:8080/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "requires": { "prepend-http": "^2.0.0" @@ -6632,12 +7032,12 @@ }, "url-to-options": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "resolved": "http://localhost:8080/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, "urlgrey": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "resolved": "http://localhost:8080/urlgrey/-/urlgrey-0.4.4.tgz", "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", "dev": true }, @@ -6666,9 +7066,21 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": "http://localhost:8080/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -6682,12 +7094,12 @@ }, "validator": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-11.1.0.tgz", + "resolved": "http://localhost:8080/validator/-/validator-11.1.0.tgz", "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" }, "verror": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "resolved": "http://localhost:8080/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { "assert-plus": "^1.0.0", @@ -6774,7 +7186,7 @@ }, "walker": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "resolved": "http://localhost:8080/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "requires": { @@ -7347,7 +7759,7 @@ }, "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "resolved": "http://localhost:8080/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" @@ -7355,13 +7767,13 @@ }, "which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "resolved": "http://localhost:8080/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "resolved": "http://localhost:8080/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { @@ -7403,13 +7815,13 @@ }, "word-wrap": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "resolved": "http://localhost:8080/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "resolved": "http://localhost:8080/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, @@ -7424,7 +7836,7 @@ }, "wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "resolved": "http://localhost:8080/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { @@ -7447,7 +7859,7 @@ }, "string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "resolved": "http://localhost:8080/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -7460,7 +7872,7 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "resolved": "http://localhost:8080/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { @@ -7474,7 +7886,7 @@ }, "ws": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "resolved": "http://localhost:8080/ws/-/ws-6.2.1.tgz", "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "requires": { "async-limiter": "~1.0.0" @@ -7482,24 +7894,24 @@ }, "xml": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "resolved": "http://localhost:8080/xml/-/xml-1.0.1.tgz", "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, "xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "resolved": "http://localhost:8080/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "resolved": "http://localhost:8080/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "resolved": "http://localhost:8080/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yargs": { @@ -7534,7 +7946,7 @@ }, "string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "resolved": "http://localhost:8080/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -7557,7 +7969,7 @@ }, "yargs-unparser": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "resolved": "http://localhost:8080/yargs-unparser/-/yargs-unparser-1.6.0.tgz", "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { diff --git a/package.json b/package.json index 50ec31de..b9028746 100644 --- a/package.json +++ b/package.json @@ -765,7 +765,8 @@ "lint:fix": "eslint . --ext .ts --fix", "build-preview": "webpack-cli --mode production", "preview-watch": "webpack-cli -w --mode development", - "snippets-build": "node ./out/build/build-snippets.js" + "snippets-build": "node ./out/build/build-snippets.js", + "icons-build": "node ./out/build/build-svg-icons.js" }, "devDependencies": { "@types/byline": "^4.2.31", @@ -804,6 +805,7 @@ "proxyquire": "^2.1.0", "remap-istanbul": "^0.13.0", "rimraf": "^3.0.2", + "simple-svg-tools": "^1.1.12", "sinon": "^7.3.2", "sinon-chai": "^3.3.0", "source-map-support": "^0.5.16", diff --git a/src/tkn.ts b/src/tkn.ts index b072f647..dde4b233 100644 --- a/src/tkn.ts +++ b/src/tkn.ts @@ -365,8 +365,12 @@ export class Command { } } +const IMAGES = '../../images'; +const ERROR_PATH = '../../images/generated/error'; +const PENDING_PATH = '../../images/generated/pending'; + export class TektonNodeImpl implements TektonNode { - private readonly CONTEXT_DATA = { + protected readonly CONTEXT_DATA = { pipelinenode: { icon: 'PL.svg', tooltip: 'Pipelines: {label}', @@ -403,7 +407,7 @@ export class TektonNodeImpl implements TektonNode { getChildren: () => this.tkn.getPipelineRuns(this) }, pipelinerun: { - icon: 'running.gif', + icon: 'PLR.svg', tooltip: 'PipelineRun: {label}', getChildren: () => [] }, @@ -413,12 +417,12 @@ export class TektonNodeImpl implements TektonNode { getChildren: () => this.tkn.getTaskRunsForTasks(this) }, taskrun: { - icon: 'running.gif', + icon: 'TR.svg', tooltip: 'TaskRun: {label}', getChildren: () => [] }, conditionrunnode: { - icon: 'running.gif', + icon: 'C.svg', tooltip: 'ConditionRun: {label}', getChildren: () => [] }, @@ -501,23 +505,23 @@ export class TektonNodeImpl implements TektonNode { get iconPath(): Uri { if (this.state) { - let fileName = 'running.gif'; + let filePath = IMAGES; switch (this.state) { case 'False': { - fileName = 'failed.png'; + filePath = ERROR_PATH; break; } case 'True': { - fileName = 'success.png'; + filePath = IMAGES; break; } default: { - break; + return Uri.file(path.join(__dirname, IMAGES, 'running.gif')); } } - return Uri.file(path.join(__dirname, '../../images', fileName)); + return Uri.file(path.join(__dirname, filePath, this.CONTEXT_DATA[this.contextValue].icon)); } - return Uri.file(path.join(__dirname, '../../images', this.CONTEXT_DATA[this.contextValue].icon)); + return Uri.file(path.join(__dirname, IMAGES, this.CONTEXT_DATA[this.contextValue].icon)); } get tooltip(): string { @@ -671,31 +675,31 @@ export abstract class BaseTaskRun extends TektonNodeImpl { get iconPath(): Uri { if (this.state) { - let fileName = 'pending.svg'; + let filePath = IMAGES; if (this.state) { switch (this.state) { case 'Failed': { - fileName = 'failed.png'; + filePath = ERROR_PATH; break; } case 'Finished': { - fileName = 'success.png'; + filePath = IMAGES; break; } case 'Cancelled': - fileName = 'cancelled.png'; + filePath = ERROR_PATH; break; case 'Started': - fileName = 'running.gif'; - break; + return Uri.file(path.join(__dirname, IMAGES, 'running.gif')); + case 'Unknown': default: - fileName = 'pending.svg'; + filePath = PENDING_PATH; break; } } - return Uri.file(path.join(__dirname, '../../images', fileName)); + return Uri.file(path.join(__dirname, filePath, this.CONTEXT_DATA[this.contextValue].icon)); } return super.iconPath; }