diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1d085ca --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +** diff --git a/.gitignore b/.gitignore index aa65912..a05c38b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ dist coverage *.log + +develop.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 5d06db0..a3f6323 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,9 +14,12 @@ "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "args": [ "src/**/*.spec.ts", - "-r", "chai", - "-r", "chai-as-promised", - "-r", "ts-node/register" + "-r", + "chai", + "-r", + "chai-as-promised", + "-r", + "ts-node/register" ], "sourceMaps": true }, @@ -28,6 +31,22 @@ "outFiles": [ "${workspaceFolder}/**/*.js" ] + }, + { + "name": "Debug", + "type": "node", + "request": "launch", + "args": [ + "${workspaceRoot}/develop.ts" + ], + "runtimeArgs": [ + "--nolazy", + "-r", + "ts-node/register" + ], + "sourceMaps": true, + "cwd": "${workspaceRoot}", + "protocol": "inspector" } ] -} +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2a08a89 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,2 @@ +FROM scratch +ARG TEST diff --git a/README.md b/README.md index 0cace68..884e66b 100644 --- a/README.md +++ b/README.md @@ -7,25 +7,6 @@ A [semantic-release](https://github.com/semantic-release/semantic-release) plugin to use semantic versioning for docker images. -## Supported Steps - -### verifyConditions - -verifies that environment variables for authentication via username and password are set. -It uses a registry server provided via config or environment variable (preferred) or defaults to docker hub if none is given. -It also verifies that the credentials are correct by logging in to the given registry. - -### prepare - -tags the specified image with the version number determined by semantic-release and additional tags provided in the configuration. -In addition it supports specifying a complete image name (CIN) via configuration settings according to the canonical format specified by docker: - -`[registryhostname[:port]/][username/]imagename[:tag]` - -### publish - -pushes the tagged images to the registry. - ## Installation Run `npm i --save-dev @iteratec/semantic-release-docker` to install this semantic-release plugin. @@ -36,46 +17,37 @@ Run `npm i --save-dev @iteratec/semantic-release-docker` to install this semanti The `docker registry` authentication is **required** and can be set via environment variables. -### Environment variables - | Variable | Description | | ------------------------ | ----------------------------------------------------------------------------------------- | | DOCKER_REGISTRY_URL | The hostname and port used by the desired docker registry. Leave blank to use docker hub. | | DOCKER_REGISTRY_USER | The user name to authenticate with at the registry. | | DOCKER_REGISTRY_PASSWORD | The password used for authentication at the registry. | -### Options +### Plugin Configuration -| Option | Description | -| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| additionalTags | _Optional_. An array of strings allowing to specify additional tags to apply to the image. | -| imageName | **_Required_** The name of the image to release. | -| registryUrl | _Optional_. The hostname and port used by the the registry in format `hostname[:port]`. Omit the port if the registry uses the default port | -| repositoryName | _Optional_. The name of the repository in the registry, e.g. username on docker hub | - -## Usage - -full configuration: +#### Full configuration ```json { "verifyConfig": ["@iteratec/semantic-release-docker"], - "prepare": { - "path": "@iteratec/semantic-release-docker", - "additionalTags": ["test", "demo"], - "imageName": "my-image", - "registryUrl": "my-private-registry:5678", - "respositoryName": "my-repository" - }, + "prepare": [ + { + "path": "@iteratec/semantic-release-docker", + "additionalTags": ["test", "demo"], + "imageName": "my-image", + "registryUrl": "my-private-registry:5678", + "respositoryName": "my-repository" + } + ], "publish": { "path": "@iteratec/semantic-release-docker" } } ``` -results in `my-private-registry:5678/my-repository/my-image` with tags `test`, `demo` and the `` determined by `semantic-release`. +Results in `my-private-registry:5678/my-repository/my-image` with tags `test`, `demo` and the `` determined by `semantic-release`. -minimum configuration: +#### Minimum configuration ```json { @@ -90,4 +62,95 @@ minimum configuration: } ``` -results in `my-image:` +Results in `my-image:`. + +### Options + +| Option | Description | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| additionalTags | _Optional_. An array of strings allowing to specify additional tags to apply to the image. | +| imageName | **_Required_** The name of the image to release. | +| registryUrl | _Optional_. The hostname and port used by the the registry in format `hostname[:port]`. Omit the port if the registry uses the default port | +| repositoryName | _Optional_. The name of the repository in the registry, e.g. username on docker hub | + +## Steps + +### verifyConditions + +It uses a registry server provided via config or environment variable (preferred) or defaults to docker hub if none is given. + +1. Verifies that environment variables for authentication via username and password are set. +2. It also verifies that the credentials are correct by logging in to the given registry. + +### prepare + +Tags the specified image with the version number determined by semantic-release and additional tags provided in the configuration. +In addition it supports specifying a complete image name (CIN) via configuration settings according to the canonical format specified by docker: + +`[registryhostname[:port]/][username/]imagename[:tag]` + +### publish + +Pushes the tagged images to the registry. + +## Contribute + +### Develop + +1. Create a develop.ts file in the root of this Git-Repository and copy this: + + ```typescript + import { SemanticReleaseConfig, SemanticReleaseContext } from 'semantic-release'; + import { prepare, publish, verifyConditions } from './src'; + import { DockerPluginConfig } from './src/models'; + + process.env.DOCKER_REGISTRY_USER = ''; + process.env.DOCKER_REGISTRY_PASSWORD = ''; + + const config: SemanticReleaseConfig = { + branch: '', + noCi: true, + repositoryUrl: '', + tagFormat: '' + }; + const context: SemanticReleaseContext = { + logger: { + // tslint:disable-next-line:no-empty + log: (message: string) => {} + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + additionalTags: ['latest'], + imageName: 'testimage', + repositoryName: '', + path: '@iteratec/semantic-release-docker' + } as DockerPluginConfig, + { + additionalTags: ['latest'], + imageName: 'testimage1', + repositoryName: '', + path: '@iteratec/semantic-release-docker' + } as DockerPluginConfig + ], + repositoryUrl: '', + tagFormat: '' + }, + nextRelease: { + version: '1.0.3', + gitHead: '45jh345g', + gitTag: 'v1.0.3', + notes: 'Nothing special' + } + }; + context.logger.log = (string: string) => { + console.log(string); + }; + verifyConditions(config, context); + prepare(config, context); + publish(config, context); + ``` + +2. Simply run the "Debug" configuration in the Debug VS Code Tab. diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 53124fe..40b7541 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -5,11 +5,11 @@ jobs: demands: npm steps: - task: NodeTool@0 - displayName: "Use Node 10" + displayName: 'Use Node 10' inputs: versionSpec: 10.x - task: Npm@1 - displayName: "Install dependencies" + displayName: 'Install dependencies' inputs: verbose: false - task: Npm@1 @@ -17,6 +17,11 @@ jobs: inputs: command: custom customCommand: run build + - task: Npm@1 + displayName: End2End Test + inputs: + command: custom + customCommand: run e2e - task: Npm@1 displayName: Test inputs: diff --git a/package-lock.json b/package-lock.json index dd0bdf7..8e1cc0b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,26 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, "@commitlint/cli": { "version": "7.5.2", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-7.5.2.tgz", @@ -21,37 +41,6 @@ "meow": "5.0.0", "resolve-from": "4.0.0", "resolve-global": "0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.2.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@commitlint/config-conventional": { @@ -86,37 +75,6 @@ "requires": { "babel-runtime": "^6.23.0", "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@commitlint/is-ignored": { @@ -126,14 +84,6 @@ "dev": true, "requires": { "semver": "5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } } }, "@commitlint/lint": { @@ -270,14 +220,14 @@ } }, "@octokit/endpoint": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.2.0.tgz", - "integrity": "sha512-g4r1MKr8GJ8qubJQp3HP3JrxDY+ZeVqjYBTgtu1lPEDLhfQDY6rOhyZOoHKOw+gaIF6aAcmuvPPNZUro2OwmOg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.2.2.tgz", + "integrity": "sha512-VhKxM4CQanIUZDffExqpdpgqu3heF51qbY1wazoNtvIKXAAVoFjqLq2BOhesXkTqxXMO1Ze1XbS8DkIjUxAB+g==", "dev": true, "requires": { - "deepmerge": "3.3.0", + "deepmerge": "4.0.0", "is-plain-object": "^3.0.0", - "universal-user-agent": "^2.1.0", + "universal-user-agent": "^3.0.0", "url-template": "^2.0.8" }, "dependencies": { @@ -299,9 +249,9 @@ } }, "@octokit/request": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-4.1.1.tgz", - "integrity": "sha512-LOyL0i3oxRo418EXRSJNk/3Q4I0/NKawTn6H/CQp+wnrG1UFLGu080gSsgnWobhPo5BpUNgSQ5BRk5FOOJhD1Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.0.1.tgz", + "integrity": "sha512-SHOk/APYpfrzV1RNf7Ux8SZi+vZXhMIB2dBr4TQR6ExMX8R4jcy/0gHw26HLe1dWV7Wxe9WzYyDSEC0XwnoCSQ==", "dev": true, "requires": { "@octokit/endpoint": "^5.1.0", @@ -310,7 +260,7 @@ "is-plain-object": "^3.0.0", "node-fetch": "^2.3.0", "once": "^1.4.0", - "universal-user-agent": "^2.1.0" + "universal-user-agent": "^3.0.0" }, "dependencies": { "is-plain-object": { @@ -341,15 +291,15 @@ } }, "@octokit/rest": { - "version": "16.28.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.28.2.tgz", - "integrity": "sha512-csuYiHvJ1P/GFDadVn0QhwO83R1+YREjcwCY7ZIezB6aJTRIEidJZj+R7gAkUhT687cqYb4cXTZsDVu9F+Fmug==", + "version": "16.28.4", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.28.4.tgz", + "integrity": "sha512-ZBsfD46t3VNkwealxm5zloVgQta8d8o4KYBR/hMAZ582IgjmSDKZdkjyv5w37IUCM3tcPZWKUT+kml9pEIC2GA==", "dev": true, "requires": { - "@octokit/request": "^4.0.1", + "@octokit/request": "^5.0.0", "@octokit/request-error": "^1.0.2", "atob-lite": "^2.0.0", - "before-after-hook": "^1.4.0", + "before-after-hook": "^2.0.0", "btoa-lite": "^1.0.0", "deprecation": "^2.0.0", "lodash.get": "^4.4.2", @@ -357,7 +307,7 @@ "lodash.uniq": "^4.5.0", "octokit-pagination-methods": "^1.1.0", "once": "^1.4.0", - "universal-user-agent": "^2.0.0", + "universal-user-agent": "^3.0.0", "url-template": "^2.0.8" } }, @@ -400,6 +350,15 @@ "trim-off-newlines": "^1.0.0" } }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "meow": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", @@ -416,6 +375,12 @@ "redent": "^2.0.0", "trim-newlines": "^2.0.0" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -450,6 +415,15 @@ "url-join": "^4.0.0" }, "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -466,6 +440,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -505,16 +485,28 @@ "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", "dev": true }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, "read-pkg": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", - "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", - "parse-json": "^4.0.0", - "type-fest": "^0.4.1" + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" } } } @@ -562,6 +554,15 @@ "trim-off-newlines": "^1.0.0" } }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -609,6 +610,12 @@ } } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -633,6 +640,18 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -671,21 +690,21 @@ } }, "read-pkg": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", - "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", - "parse-json": "^4.0.0", - "type-fest": "^0.4.1" + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } @@ -761,9 +780,9 @@ } }, "@types/events": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, "@types/glob": { @@ -854,9 +873,9 @@ "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { @@ -1016,44 +1035,6 @@ "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", @@ -1157,9 +1138,9 @@ } }, "before-after-hook": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", - "integrity": "sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", "dev": true }, "binary-extensions": { @@ -1178,9 +1159,9 @@ } }, "bottleneck": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.1.tgz", - "integrity": "sha512-TrdmthuOG5SpYfFQTprSQOtqQUTreAgPkCFfow/aVOnryRRpIwiwfiQmmJUiiHUKgPV7LBNlfGecJ5hCVs30gw==", + "version": "2.19.4", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.4.tgz", + "integrity": "sha512-2poBdvpAGG+dkMVKZqtDhyuMN6JviD81h89W4bfmt3UO7O60F+qf/84V0alNqL8PM1RByl4SZ1fVMu/ZvxkmcA==", "dev": true }, "brace-expansion": { @@ -1288,7 +1269,7 @@ "dependencies": { "callsites": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true } @@ -1360,25 +1341,14 @@ } }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", + "ansi-styles": "^3.2.0", "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "supports-color": "^5.2.0" } }, "chardet": { @@ -1411,9 +1381,9 @@ } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" }, "class-utils": { "version": "0.3.6", @@ -1491,23 +1461,6 @@ "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "code-point-at": { @@ -1527,12 +1480,12 @@ } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -1554,9 +1507,9 @@ "dev": true }, "commitizen": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-3.0.7.tgz", - "integrity": "sha512-2j8E8Ik1pe1Jqy1gQ1SzEZDJCdr0ItjvhbXmDqhz186Q3ukRoQHMBkmCqmsFYmfDmchBkrOXV1239mTeXEPJKQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-3.1.1.tgz", + "integrity": "sha512-n5pnG8sNM5a3dS3Kkh3rYr+hFdPWZlqV6pfz6KGLmWV/gsIiTqAwhTgFKkcF/paKUpfIMp0x4YZlD0xLBNTW9g==", "dev": true, "requires": { "cachedir": "2.1.0", @@ -1603,9 +1556,9 @@ } }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "concat-map": { @@ -1616,7 +1569,7 @@ }, "concat-stream": { "version": "1.6.2", - "resolved": "http://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { "buffer-from": "^1.0.0", @@ -1821,20 +1774,12 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "^2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ms": "2.0.0" } }, "decamelize": { @@ -1889,9 +1834,9 @@ "dev": true }, "deepmerge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.0.0.tgz", + "integrity": "sha512-YZ1rOP5+kHor4hMAH+HRQnBQHg+wvS1un1hAOuIcxcBy0hzcUf6Jg2a1w65kpoOUnurOfZbERwjI1TfZxNjcww==", "dev": true }, "define-properties": { @@ -2158,9 +2103,9 @@ "dev": true }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esutils": { @@ -2253,9 +2198,9 @@ } }, "fast-glob": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.3.tgz", - "integrity": "sha512-scDJbDhN+6S4ELXzzN96Fqm5y1CMRn+Io3C4Go+n/gUKP+LW26Wma6IxLSsX2eAMBUOFmyHKDBrUSuoHsycQ5A==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", + "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.1", @@ -2476,15 +2421,6 @@ } } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2809,14 +2745,14 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.8.tgz", + "integrity": "sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -2838,7 +2774,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -2864,7 +2800,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -2894,16 +2830,16 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -2952,7 +2888,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -2972,12 +2908,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -3042,17 +2978,17 @@ "optional": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, "optional": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -3070,35 +3006,35 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -3115,13 +3051,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -3198,12 +3134,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -3233,16 +3169,16 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true, "optional": true @@ -3260,7 +3196,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -3313,17 +3249,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -3334,12 +3270,12 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -3349,7 +3285,7 @@ "optional": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true, "optional": true @@ -3363,9 +3299,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-func-name": { @@ -3562,9 +3498,9 @@ } }, "globby": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.0.tgz", - "integrity": "sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", "dev": true, "requires": { "@types/glob": "^7.1.1", @@ -3621,6 +3557,14 @@ "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" + }, + "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 + } } }, "has": { @@ -3632,15 +3576,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -3762,12 +3697,12 @@ } }, "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", "dev": true, "requires": { - "agent-base": "^4.1.0", + "agent-base": "^4.3.0", "debug": "^3.1.0" }, "dependencies": { @@ -3876,52 +3811,6 @@ "string-width": "^2.1.0", "strip-ansi": "^4.0.0", "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "interpret": { @@ -4205,21 +4094,21 @@ } }, "java-properties": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.1.tgz", - "integrity": "sha512-HbTaaXlIHoDVNXjmp4flOBWOfYBkrVN8dD1tp4m+95M/ADSDW/BxWbiwyVIhw/2+5d0cof4PHZCbE7+S1ukTQw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4282,6 +4171,12 @@ "invert-kv": "^2.0.0" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -4417,9 +4312,9 @@ } }, "lolex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.1.0.tgz", - "integrity": "sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.0.1.tgz", + "integrity": "sha512-UHuOBZ5jjsKuzbB/gRNNW8Vg8f00Emgskdq2kvZxgBJCS0aqquAuXai/SkWORlKeZEiNQWZjFZOqIUcH9LqKCw==", "dev": true }, "longest": { @@ -4504,6 +4399,19 @@ "cli-table": "^0.3.1", "node-emoji": "^1.4.1", "supports-hyperlinks": "^1.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "math-random": { @@ -4685,12 +4593,6 @@ "yargs-unparser": "1.5.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -4715,12 +4617,6 @@ "locate-path": "^3.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -4735,16 +4631,6 @@ "path-is-absolute": "^1.0.0" } }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -4785,49 +4671,13 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "has-flag": "^3.0.0" } }, "yargs-parser": { @@ -4861,9 +4711,9 @@ "dev": true }, "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true, "optional": true }, @@ -4997,9 +4847,9 @@ "dev": true }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -5023,9 +4873,9 @@ "dev": true }, "npm": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.9.2.tgz", - "integrity": "sha512-b0sEGRYrVdcV/DedLrqV4VMpdMHJbvpt9bopivh4K9RisHFMbj+G6RNbB6lRdr9rpYIoqHG9YP9CYmxdI9k81g==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.10.1.tgz", + "integrity": "sha512-ejR83c5aPTip5hPhziypqkJu06vb5tDIugCXx1c5+04RbMjtZeMA6BfsuGnV9EBdEwzKoaHkQ9sJWQAq+LjHYw==", "dev": true, "requires": { "JSONStream": "^1.3.5", @@ -5035,11 +4885,11 @@ "aproba": "^2.0.0", "archy": "~1.0.0", "bin-links": "^1.1.2", - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "byte-size": "^5.0.1", - "cacache": "^11.3.2", - "call-limit": "~1.1.0", - "chownr": "^1.1.1", + "cacache": "^11.3.3", + "call-limit": "^1.1.1", + "chownr": "^1.1.2", "ci-info": "^2.0.0", "cli-columns": "^3.1.2", "cli-table3": "^0.5.1", @@ -5056,25 +4906,25 @@ "fs-vacuum": "~1.2.10", "fs-write-stream-atomic": "~1.0.10", "gentle-fs": "^2.0.1", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", "has-unicode": "~2.0.1", "hosted-git-info": "^2.7.1", "iferr": "^1.0.2", "imurmurhash": "*", "inflight": "~1.0.6", - "inherits": "~2.0.3", + "inherits": "^2.0.4", "ini": "^1.3.5", "init-package-json": "^1.10.3", "is-cidr": "^3.0.0", "json-parse-better-errors": "^1.0.2", "lazy-property": "~1.0.0", - "libcipm": "^3.0.3", - "libnpm": "^2.0.1", + "libcipm": "^4.0.0", + "libnpm": "^3.0.0", "libnpmaccess": "*", "libnpmhook": "^5.0.2", "libnpmorg": "*", - "libnpmsearch": "*", + "libnpmsearch": "^2.0.1", "libnpmteam": "*", "libnpx": "^10.2.0", "lock-verify": "^2.1.0", @@ -5090,53 +4940,53 @@ "lodash.union": "~4.6.0", "lodash.uniq": "~4.5.0", "lodash.without": "~4.4.0", - "lru-cache": "^4.1.5", + "lru-cache": "^5.1.1", "meant": "~1.0.1", "mississippi": "^3.0.0", "mkdirp": "~0.5.1", "move-concurrently": "^1.0.1", - "node-gyp": "^3.8.0", + "node-gyp": "^5.0.2", "nopt": "~4.0.1", "normalize-package-data": "^2.5.0", "npm-audit-report": "^1.3.2", "npm-cache-filename": "~1.0.2", "npm-install-checks": "~3.0.0", - "npm-lifecycle": "^2.1.0", + "npm-lifecycle": "^3.0.0", "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.4.1", + "npm-packlist": "^1.4.4", "npm-pick-manifest": "^2.2.3", "npm-profile": "*", - "npm-registry-fetch": "^3.9.0", + "npm-registry-fetch": "^3.9.1", "npm-user-validate": "~1.0.0", "npmlog": "~4.1.2", "once": "~1.4.0", "opener": "^1.5.1", "osenv": "^0.1.5", - "pacote": "^9.5.0", + "pacote": "^9.5.1", "path-is-inside": "~1.0.2", "promise-inflight": "~1.0.1", "qrcode-terminal": "^0.12.0", - "query-string": "^6.4.0", + "query-string": "^6.8.1", "qw": "~1.0.1", "read": "~1.0.7", "read-cmd-shim": "~1.0.1", "read-installed": "~4.0.3", "read-package-json": "^2.0.13", - "read-package-tree": "^5.2.2", - "readable-stream": "^3.2.0", - "readdir-scoped-modules": "*", + "read-package-tree": "^5.3.1", + "readable-stream": "^3.4.0", + "readdir-scoped-modules": "^1.1.0", "request": "^2.88.0", "retry": "^0.12.0", "rimraf": "^2.6.3", "safe-buffer": "^5.1.2", - "semver": "^5.6.0", + "semver": "^5.7.0", "sha": "^3.0.0", "slide": "~1.1.6", "sorted-object": "~2.0.1", "sorted-union-stream": "~2.1.3", "ssri": "^6.0.1", "stringify-package": "^1.0.0", - "tar": "^4.4.8", + "tar": "^4.4.10", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "uid-number": "0.0.6", @@ -5148,8 +4998,8 @@ "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "~3.0.0", "which": "^1.3.1", - "worker-farm": "^1.6.0", - "write-file-atomic": "^2.4.2" + "worker-farm": "^1.7.0", + "write-file-atomic": "^2.4.3" }, "dependencies": { "JSONStream": { @@ -5326,16 +5176,8 @@ "write-file-atomic": "^2.3.0" } }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "bluebird": { - "version": "3.5.3", + "version": "3.5.5", "bundled": true, "dev": true }, @@ -5383,56 +5225,43 @@ "dev": true }, "cacache": { - "version": "11.3.2", + "version": "11.3.3", "bundled": true, "dev": true, "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "glob": "^7.1.4", "graceful-fs": "^4.1.15", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" }, "dependencies": { - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "5.1.1", + "glob": { + "version": "7.1.4", "bundled": true, "dev": true, "requires": { - "yallist": "^3.0.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } - }, - "unique-filename": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true } } }, "call-limit": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true }, @@ -5462,7 +5291,7 @@ } }, "chownr": { - "version": "1.1.1", + "version": "1.1.2", "bundled": true, "dev": true }, @@ -5701,6 +5530,22 @@ "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + } } }, "crypto-random-string": { @@ -5764,6 +5609,14 @@ "clone": "^1.0.2" } }, + "define-properties": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "delayed-stream": { "version": "1.0.0", "bundled": true, @@ -5877,6 +5730,11 @@ "once": "^1.4.0" } }, + "env-paths": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, "err-code": { "version": "1.1.2", "bundled": true, @@ -5890,6 +5748,28 @@ "prr": "~1.0.1" } }, + "es-abstract": { + "version": "1.12.0", + "bundled": true, + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-promise": { "version": "4.2.6", "bundled": true, @@ -6049,7 +5929,7 @@ } }, "fs-minipass": { - "version": "1.2.5", + "version": "1.2.6", "bundled": true, "dev": true, "requires": { @@ -6111,16 +5991,10 @@ "bundled": true, "dev": true }, - "fstream": { - "version": "1.0.11", + "function-bind": { + "version": "1.1.1", "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } + "dev": true }, "gauge": { "version": "2.7.4", @@ -6208,7 +6082,7 @@ } }, "glob": { - "version": "7.1.3", + "version": "7.1.4", "bundled": true, "dev": true, "requires": { @@ -6254,7 +6128,7 @@ } }, "graceful-fs": { - "version": "4.1.15", + "version": "4.2.0", "bundled": true, "dev": true }, @@ -6272,11 +6146,24 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "bundled": true, "dev": true }, + "has-symbols": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, "has-unicode": { "version": "2.0.1", "bundled": true, @@ -6369,7 +6256,7 @@ } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true, "dev": true }, @@ -6408,6 +6295,11 @@ "bundled": true, "dev": true }, + "is-callable": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, "is-ci": { "version": "1.1.0", "bundled": true, @@ -6431,6 +6323,11 @@ "cidr-regex": "^2.0.10" } }, + "is-date-object": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, @@ -6471,6 +6368,14 @@ "bundled": true, "dev": true }, + "is-regex": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-retry-allowed": { "version": "1.1.0", "bundled": true, @@ -6481,6 +6386,14 @@ "bundled": true, "dev": true }, + "is-symbol": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "bundled": true, @@ -6565,7 +6478,7 @@ } }, "libcipm": { - "version": "3.0.3", + "version": "4.0.0", "bundled": true, "dev": true, "requires": { @@ -6577,7 +6490,7 @@ "ini": "^1.3.5", "lock-verify": "^2.0.2", "mkdirp": "^0.5.1", - "npm-lifecycle": "^2.0.3", + "npm-lifecycle": "^3.0.0", "npm-logical-tree": "^1.2.1", "npm-package-arg": "^6.1.0", "pacote": "^9.1.0", @@ -6587,7 +6500,7 @@ } }, "libnpm": { - "version": "2.0.1", + "version": "3.0.0", "bundled": true, "dev": true, "requires": { @@ -6602,7 +6515,7 @@ "libnpmsearch": "^2.0.0", "libnpmteam": "^1.0.1", "lock-verify": "^2.0.2", - "npm-lifecycle": "^2.1.0", + "npm-lifecycle": "^3.0.0", "npm-logical-tree": "^1.2.1", "npm-package-arg": "^6.1.0", "npm-profile": "^4.0.1", @@ -6659,7 +6572,7 @@ } }, "p-limit": { - "version": "2.1.0", + "version": "2.2.0", "bundled": true, "dev": true, "requires": { @@ -6675,7 +6588,7 @@ } }, "p-try": { - "version": "2.0.0", + "version": "2.2.0", "bundled": true, "dev": true } @@ -6727,7 +6640,7 @@ } }, "libnpmsearch": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "dev": true, "requires": { @@ -6873,12 +6786,11 @@ "dev": true }, "lru-cache": { - "version": "4.1.5", + "version": "5.1.1", "bundled": true, "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^3.0.2" } }, "make-dir": { @@ -6890,16 +6802,16 @@ } }, "make-fetch-happen": { - "version": "4.0.1", + "version": "4.0.2", "bundled": true, "dev": true, "requires": { "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", + "cacache": "^11.3.3", "http-cache-semantics": "^3.8.1", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "node-fetch-npm": "^2.0.2", "promise-retry": "^1.1.1", @@ -6968,7 +6880,7 @@ } }, "minizlib": { - "version": "1.1.1", + "version": "1.2.1", "bundled": true, "dev": true, "requires": { @@ -7041,21 +6953,20 @@ } }, "node-gyp": { - "version": "3.8.0", + "version": "5.0.2", "bundled": true, "dev": true, "requires": { - "fstream": "^1.0.0", + "env-paths": "^1.0.0", "glob": "^7.0.3", "graceful-fs": "^4.1.2", "mkdirp": "^0.5.0", "nopt": "2 || 3", "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", "request": "^2.87.0", "rimraf": "2", "semver": "~5.3.0", - "tar": "^2.0.0", + "tar": "^4.4.8", "which": "1" }, "dependencies": { @@ -7071,16 +6982,6 @@ "version": "5.3.0", "bundled": true, "dev": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } } } }, @@ -7142,13 +7043,13 @@ } }, "npm-lifecycle": { - "version": "2.1.0", + "version": "3.0.0", "bundled": true, "dev": true, "requires": { "byline": "^5.0.0", - "graceful-fs": "^4.1.11", - "node-gyp": "^3.8.0", + "graceful-fs": "^4.1.15", + "node-gyp": "^5.0.2", "resolve-from": "^4.0.0", "slide": "^1.1.6", "uid-number": "0.0.6", @@ -7173,7 +7074,7 @@ } }, "npm-packlist": { - "version": "1.4.1", + "version": "1.4.4", "bundled": true, "dev": true, "requires": { @@ -7202,16 +7103,36 @@ } }, "npm-registry-fetch": { - "version": "3.9.0", + "version": "3.9.1", "bundled": true, "dev": true, "requires": { "JSONStream": "^1.3.4", "bluebird": "^3.5.1", "figgy-pudding": "^3.4.1", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.2", "npm-package-arg": "^6.1.0" + }, + "dependencies": { + "make-fetch-happen": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.3.3", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + } } }, "npm-run-path": { @@ -7253,6 +7174,20 @@ "bundled": true, "dev": true }, + "object-keys": { + "version": "1.0.12", + "bundled": true, + "dev": true + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "once": { "version": "1.4.0", "bundled": true, @@ -7333,7 +7268,7 @@ } }, "pacote": { - "version": "9.5.0", + "version": "9.5.1", "bundled": true, "dev": true, "requires": { @@ -7366,14 +7301,6 @@ "which": "^1.3.1" }, "dependencies": { - "lru-cache": { - "version": "5.1.1", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "minipass": { "version": "2.3.5", "bundled": true, @@ -7382,11 +7309,6 @@ "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true } } }, @@ -7572,11 +7494,12 @@ "dev": true }, "query-string": { - "version": "6.4.0", + "version": "6.8.1", "bundled": true, "dev": true, "requires": { "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" } }, @@ -7646,19 +7569,17 @@ } }, "read-package-tree": { - "version": "5.2.2", + "version": "5.3.1", "bundled": true, "dev": true, "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "once": "^1.3.0", "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0" + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" } }, "readable-stream": { - "version": "3.2.0", + "version": "3.4.0", "bundled": true, "dev": true, "requires": { @@ -7668,7 +7589,7 @@ } }, "readdir-scoped-modules": { - "version": "1.0.2", + "version": "1.1.0", "bundled": true, "dev": true, "requires": { @@ -7776,7 +7697,7 @@ "dev": true }, "semver": { - "version": "5.6.0", + "version": "5.7.0", "bundled": true, "dev": true }, @@ -7926,6 +7847,11 @@ "bundled": true, "dev": true }, + "split-on-first": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, "sshpk": { "version": "1.14.2", "bundled": true, @@ -8071,24 +7997,19 @@ } }, "tar": { - "version": "4.4.8", + "version": "4.4.10", "bundled": true, "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" }, "dependencies": { - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, "minipass": { "version": "2.3.5", "bundled": true, @@ -8273,6 +8194,14 @@ "bundled": true, "dev": true }, + "util-promisify": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, "uuid": { "version": "3.3.2", "bundled": true, @@ -8355,7 +8284,7 @@ } }, "worker-farm": { - "version": "1.6.0", + "version": "1.7.0", "bundled": true, "dev": true, "requires": { @@ -8389,7 +8318,7 @@ "dev": true }, "write-file-atomic": { - "version": "2.4.2", + "version": "2.4.3", "bundled": true, "dev": true, "requires": { @@ -8414,7 +8343,7 @@ "dev": true }, "yallist": { - "version": "2.1.2", + "version": "3.0.3", "bundled": true, "dev": true }, @@ -9085,9 +9014,9 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve": { @@ -9189,9 +9118,9 @@ "dev": true }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.1.tgz", + "integrity": "sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -9251,29 +9180,6 @@ "yargs": "^13.1.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -9286,6 +9192,15 @@ "parse-json": "^4.0.0" } }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "figures": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", @@ -9305,12 +9220,6 @@ "path-exists": "^4.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -9338,16 +9247,6 @@ } } }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -9357,6 +9256,12 @@ "p-locate": "^4.1.0" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -9398,21 +9303,33 @@ } }, "read-pkg": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", - "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", - "parse-json": "^4.0.0", - "type-fest": "^0.4.1" + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } @@ -9428,12 +9345,6 @@ "type-fest": "^0.5.0" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -9446,114 +9357,18 @@ "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, "type-fest": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, "semver-regex": { @@ -9650,32 +9465,34 @@ "chalk": "^2.3.2", "figures": "^2.0.0", "pkg-conf": "^2.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "sinon": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.1.tgz", - "integrity": "sha512-eQKMaeWovtOtYe2xThEvaHmmxf870Di+bim10c3ZPrL5bZhLGtu8cz+rOBTFz0CwBV4Q/7dYwZiqZbGVLZ+vjQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", + "integrity": "sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==", "dev": true, "requires": { "@sinonjs/commons": "^1.4.0", "@sinonjs/formatio": "^3.2.1", "@sinonjs/samsam": "^3.3.1", "diff": "^3.5.0", - "lolex": "^3.1.0", + "lolex": "^4.0.1", "nise": "^1.4.10", "supports-color": "^5.5.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "slash": { @@ -9700,15 +9517,6 @@ "use": "^3.1.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -9726,12 +9534,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, @@ -9808,9 +9610,9 @@ } }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { @@ -9834,6 +9636,14 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" + }, + "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 + } } }, "source-map-url": { @@ -9963,23 +9773,6 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "string_decoder": { @@ -9991,12 +9784,12 @@ } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -10033,9 +9826,9 @@ } }, "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -10056,23 +9849,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - } - } } } }, @@ -10197,9 +9973,9 @@ "dev": true }, "ts-node": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz", - "integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", + "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", "dev": true, "requires": { "arg": "^4.1.0", @@ -10210,18 +9986,18 @@ } }, "tslib": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", - "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, "tslint": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", - "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", + "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", @@ -10241,16 +10017,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } } } }, @@ -10270,9 +10036,9 @@ "dev": true }, "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true }, "typedarray": { @@ -10281,9 +10047,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.3.tgz", - "integrity": "sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", "dev": true }, "uglify-js": { @@ -10303,6 +10069,13 @@ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true, "optional": 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, + "optional": true } } }, @@ -10342,9 +10115,9 @@ } }, "universal-user-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz", - "integrity": "sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-3.0.0.tgz", + "integrity": "sha512-T3siHThqoj5X0benA5H0qcDnrKGXzU8TKoX15x/tQHw1hQBvIEBHjxQ2klizYsqBOO/Q+WuxoQUihadeeqDnoA==", "dev": true, "requires": { "os-name": "^3.0.0" @@ -10409,9 +10182,9 @@ "dev": true }, "url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, "url-template": { @@ -10496,6 +10269,12 @@ "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -10515,6 +10294,15 @@ "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } } } }, @@ -10535,25 +10323,30 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^1.2.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -10603,10 +10396,30 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -10633,6 +10446,99 @@ "flat": "^4.1.0", "lodash": "^4.17.11", "yargs": "^12.0.5" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "yn": { diff --git a/package.json b/package.json index f687da5..25c6de3 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,10 @@ "main": "index.js", "scripts": { "build": "rimraf dist && tsc", - "postbuild": "cpx package.json dist/ && cpx package-lock.json dist/", + "postbuild": "cpx package.json dist/ && cpx package-lock.json dist/ && cpx README.md dist/", "commit": "git-cz", "test": "mocha -r chai -r chai-as-promised -r ts-node/register src/**/*.spec.ts", + "e2e": "mocha -r chai -r chai-as-promised -r ts-node/register src/**/*.e2e.ts", "release": "semantic-release" }, "keywords": [ diff --git a/src/model/auth.ts b/src/model/auth.ts deleted file mode 100644 index 3207409..0000000 --- a/src/model/auth.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Auth { - username: string; - password: string; - serveraddress?: string; -} diff --git a/src/models/PluginSettings.ts b/src/models/PluginSettings.ts new file mode 100644 index 0000000..fb34060 --- /dev/null +++ b/src/models/PluginSettings.ts @@ -0,0 +1,6 @@ +import { DockerPluginConfig } from './dockerPluginConfig'; + +export interface PluginSettings { + path: '@iteratec/semantic-release-docker'; + defaultValues: DockerPluginConfig; +} diff --git a/src/models/authentication.ts b/src/models/authentication.ts new file mode 100644 index 0000000..f724072 --- /dev/null +++ b/src/models/authentication.ts @@ -0,0 +1,9 @@ +import { Credentials } from './credentials'; + +/** + * Authentication + * From: https://docs.docker.com/engine/api/v1.37/#section/Authentication + */ +export interface Authentication extends Credentials { + serveraddress: string; +} diff --git a/src/models/credentials.ts b/src/models/credentials.ts new file mode 100644 index 0000000..279aabe --- /dev/null +++ b/src/models/credentials.ts @@ -0,0 +1,4 @@ +export interface Credentials { + username: string; + password: string; +} diff --git a/src/models/dockerPluginConfig.ts b/src/models/dockerPluginConfig.ts new file mode 100644 index 0000000..824b52a --- /dev/null +++ b/src/models/dockerPluginConfig.ts @@ -0,0 +1,7 @@ +import { SemanticReleasePlugin } from "semantic-release"; +export interface DockerPluginConfig extends SemanticReleasePlugin { + additionalTags?: string[]; + imageName: string; + registryUrl?: string; + repositoryName?: string; +} diff --git a/src/models/index.ts b/src/models/index.ts new file mode 100644 index 0000000..2b9fb18 --- /dev/null +++ b/src/models/index.ts @@ -0,0 +1,3 @@ +export { Authentication } from './authentication'; +export { DockerPluginConfig } from './dockerPluginConfig'; +export { Credentials } from './credentials'; diff --git a/src/plugin-settings.ts b/src/plugin-settings.ts new file mode 100644 index 0000000..c3a0301 --- /dev/null +++ b/src/plugin-settings.ts @@ -0,0 +1,12 @@ +import { PluginSettings } from "./models/PluginSettings"; + +export const pluginSettings: PluginSettings = { + path: "@iteratec/semantic-release-docker", + defaultValues: { + additionalTags: [], + imageName: "", + path: "@iteratec/semantic-release-docker", + registryUrl: "", + repositoryName: "" + } +}; diff --git a/src/prepare/index.e2e.ts b/src/prepare/index.e2e.ts new file mode 100644 index 0000000..f239d68 --- /dev/null +++ b/src/prepare/index.e2e.ts @@ -0,0 +1,230 @@ +import { expect, use } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import Dockerode from 'dockerode'; + +import { SemanticReleaseConfig, SemanticReleaseContext } from 'semantic-release'; +import { DockerPluginConfig } from '../models'; +import { prepare } from './index'; +import { setVerified } from '../verifyConditions'; +import { buildImage } from '../test/test-helpers'; +import { afterEach } from 'mocha'; + +describe('@iteratec/semantic-release-docker', function() { + describe('prepare', function() { + const config: SemanticReleaseConfig = { + branch: '', + noCi: true, + repositoryUrl: '', + tagFormat: '' + }; + + const testImage1 = 'test1'; + const testImage2 = 'test2'; + + const docker = new Dockerode(); + + before(async function() { + use(chaiAsPromised); + setVerified(); + + process.env.DOCKER_REGISTRY_USER = 'username'; + process.env.DOCKER_REGISTRY_PASSWORD = 'password'; + }); + + beforeEach(async function() { + this.timeout(20000); + await buildImage(testImage1); + await buildImage(testImage2); + }); + + it('should tag image with next version', async function() { + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next' + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + path: '@iteratec/semantic-release-docker' + } as DockerPluginConfig + ], + repositoryUrl: '', + tagFormat: '' + } + } as SemanticReleaseContext; + let prepareResult = await prepare(config, context); + + expect(prepareResult).to.deep.equal([[testImage1]]); + + let imagelist2 = await docker.listImages({ filters: { reference: [`${testImage1}:next`] } }); + expect(imagelist2.length).to.equal(1); + }); + + it('should tag image with next version and repositoryName', async function() { + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next' + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + repositoryName: 'repository', + path: '@iteratec/semantic-release-docker' + } as DockerPluginConfig + ], + repositoryUrl: '', + tagFormat: '' + } + } as SemanticReleaseContext; + let prepareResult = await prepare(config, context); + + expect(prepareResult).to.deep.equal([[testImage1]]); + + let imagelist2 = await docker.listImages({ filters: { reference: [`repository/${testImage1}:next`] } }); + expect(imagelist2.length).to.equal(1); + }); + + it('should tag image with next version and repositoryName and url', async function() { + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next' + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + repositoryName: 'repository', + registryUrl: 'repositoryurl', + path: '@iteratec/semantic-release-docker' + } as DockerPluginConfig + ], + repositoryUrl: '', + tagFormat: '' + } + } as SemanticReleaseContext; + let prepareResult = await prepare(config, context); + + expect(prepareResult).to.deep.equal([[testImage1]]); + + let imagelist2 = await docker.listImages({ + filters: { reference: [`repositoryurl/repository/${testImage1}:next`] } + }); + expect(imagelist2.length).to.equal(1); + }); + + it('should add multiple tags to an image (with next version)', async function() { + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next' + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + path: '@iteratec/semantic-release-docker', + additionalTags: ['tag1', 'tag2'] + } as DockerPluginConfig + ], + repositoryUrl: '', + tagFormat: '' + } + } as SemanticReleaseContext; + + let prepareResult = await prepare(config, context).then(data => data[0]); + + expect(prepareResult).to.have.length(3); + + let imagelist = await docker.listImages({ filters: { reference: [`${testImage1}:next`] } }); + expect(imagelist.length).to.equal(1); + + let imagelist1 = await docker.listImages({ filters: { reference: [`${testImage1}:tag1`] } }); + expect(imagelist1.length).to.equal(1); + + let imagelist2 = await docker.listImages({ filters: { reference: [`${testImage1}:tag2`] } }); + expect(imagelist2.length).to.equal(1); + }); + + it('should add multiple images', async function() { + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next' + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + path: '@iteratec/semantic-release-docker' + } as DockerPluginConfig, + { + imageName: testImage2, + path: '@iteratec/semantic-release-docker' + } as DockerPluginConfig + ], + repositoryUrl: '', + tagFormat: '' + } + } as SemanticReleaseContext; + let prepareResult = await prepare(config, context); + + expect(prepareResult).to.have.length(2); + + let imagelist1 = await docker.listImages({ filters: { reference: [`${testImage1}:next`] } }); + expect(imagelist1.length).to.equal(1); + + let imagelist2 = await docker.listImages({ filters: { reference: [`${testImage2}:next`] } }); + expect(imagelist2.length).to.equal(1); + }); + + afterEach(async function() { + this.timeout(5000); + const imagelist1 = await docker.listImages({ filters: { reference: [testImage1] } }); + await Promise.all( + imagelist1.map(image => { + return docker.getImage(image.Id).remove({ + force: true + }); + }) + ); + const imagelist2 = await docker.listImages({ filters: { reference: [testImage2] } }); + await Promise.all( + imagelist2.map(image => { + return docker.getImage(image.Id).remove({ + force: true + }); + }) + ); + }); + }); +}); diff --git a/src/prepare/index.spec.ts b/src/prepare/index.spec.ts index 6da5952..566f7ae 100644 --- a/src/prepare/index.spec.ts +++ b/src/prepare/index.spec.ts @@ -1,17 +1,13 @@ import { expect, use } from 'chai'; import chaiAsPromised from 'chai-as-promised'; import Dockerode from 'dockerode'; -import { - SemanticReleaseConfig, - SemanticReleaseContext, -} from 'semantic-release'; +import { SemanticReleaseConfig, SemanticReleaseContext } from 'semantic-release'; import { createStubInstance, mock, stub } from 'sinon'; - -import { DockerPluginConfig } from '../dockerPluginConfig'; +import { DockerPluginConfig } from '../models'; +import { constructImageName } from '../shared-logic'; +import { setVerified } from '../verifyConditions'; import { prepare } from './index'; -// declare var docker: any; - describe('@iteratec/semantic-release-docker', function() { describe('prepare', function() { const config: SemanticReleaseConfig = { @@ -20,145 +16,263 @@ describe('@iteratec/semantic-release-docker', function() { repositoryUrl: '', tagFormat: '', }; - const context: SemanticReleaseContext = { - // tslint:disable-next-line:no-empty - logger: { log: (message: string) => {} }, - nextRelease: { - gitTag: '', - notes: '', - version: 'next', - }, - options: { - branch: '', - noCi: true, - prepare: [ - { - imageName: '', - path: '@iteratec/semantic-release-docker', - } as DockerPluginConfig, - ], - repositoryUrl: '', - tagFormat: '', - }, - }; - const rs = {} as NodeJS.ReadableStream; - const iii = {} as Dockerode.ImageInspectInfo; - const fakeImage = { - get( - callback?: (error?: any, result?: NodeJS.ReadableStream) => void, - ): any { - if (callback) { - return; - } - return new Promise(() => rs); - }, - history(callback?: (error?: any, result?: any) => void): any { - if (callback) { - return; - } - return new Promise(() => ''); - }, - inspect( - callback?: (error?: any, result?: Dockerode.ImageInspectInfo) => void, - ): any { - if (callback) { - return; - } - return new Promise(() => iii); - }, - modem: '', - push( - options?: {}, - callback?: (error?: any, result?: NodeJS.ReadableStream) => void, - ): any { - if (callback) { - return; - } - return new Promise(() => rs); - }, - remove( - options?: {}, - callback?: (error?: any, result?: Dockerode.ImageRemoveInfo) => void, - ): any { - if (callback) { - return; - } - return new Promise(() => ''); - }, - tag(options?: {}, callback?: () => void): any { - if (callback) { - return; - } - return new Promise((resolve) => { - resolve({}); - }); - }, - } as Dockerode.Image; - let dockerStub: any; - - before(function() { + + const testImage1 = 'test1'; + const testImage2 = 'test2'; + + before(async function() { use(chaiAsPromised); - }); + setVerified(); - before(function() { - dockerStub = createStubInstance(Dockerode); - dockerStub.getImage.returns(fakeImage); + process.env.DOCKER_REGISTRY_USER = 'username'; + process.env.DOCKER_REGISTRY_PASSWORD = 'password'; }); - it('should throw if no imagename is provided', function() { - return expect(prepare(config, context)).to.eventually.be.rejectedWith( - '\'imageName\' is not set in plugin configuration', - ); + it('should tag image with next version', async function() { + const image = new Dockerode.Image('', testImage1); + const imageMock = mock(image); + const dockerStub = createStubInstance(Dockerode); + dockerStub.getImage.returns(image); + + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + + // setup the mock with expectations + imageMock + .expects('tag') + .once() + .withExactArgs({ + repo: constructImageName(context.options.prepare![0] as DockerPluginConfig), + tag: 'next', + }) + .resolves({ name: testImage1 }); + + const prepareResult = await prepare(config, context, (dockerStub as unknown) as Dockerode); + // tslint:disable-next-line: no-unused-expression + expect(imageMock.verify()).to.not.throw; + expect(prepareResult).to.deep.equal([[testImage1]]); }); - it('should tag an image', async function() { - const imageMock = mock(fakeImage); - const fakeImageName = 'fakeTestImage'; - const expected = { - repo: fakeImageName, - tag: context.nextRelease!.version, - }; - (context.options - .prepare![0] as DockerPluginConfig).imageName = fakeImageName; + it('should tag image with next version and repositoryName', async function() { + const image = new Dockerode.Image('', testImage1); + const imageMock = mock(image); + const dockerStub = createStubInstance(Dockerode); + dockerStub.getImage.returns(image); + + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + repositoryName: 'repository', + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + // setup the mock with expectations imageMock .expects('tag') .once() - .withExactArgs(expected) - .resolves({ name: fakeImageName }); - await prepare(config, context, dockerStub); + .withExactArgs({ + repo: constructImageName(context.options.prepare![0] as DockerPluginConfig), + tag: 'next', + }) + .resolves({ name: testImage1 }); + + const prepareResult = await prepare(config, context, (dockerStub as unknown) as Dockerode); // tslint:disable-next-line: no-unused-expression expect(imageMock.verify()).to.not.throw; + expect(prepareResult).to.deep.equal([[testImage1]]); }); - it('should add multiple tags to an image', async function() { - const imageStub = stub(fakeImage); - const fakeImageName = 'fakeTestImage'; - const expected = [context.nextRelease!.version!, 'tag1', 'tag2']; - (context.options - .prepare![0] as DockerPluginConfig).imageName = fakeImageName; - (context.options.prepare![0] as DockerPluginConfig).additionalTags = [ - expected[1], - expected[2], - ]; + it('should tag image with next version and repositoryName and url', async function() { + const image = new Dockerode.Image('', testImage1); + const imageMock = mock(image); + const dockerStub = createStubInstance(Dockerode); + dockerStub.getImage.returns(image); + + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + repositoryName: 'repository', + registryUrl: 'repositoryurl', + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + // setup the mock with expectations - imageStub.tag.resolves({ name: fakeImageName }); + imageMock + .expects('tag') + .once() + .withExactArgs({ + repo: constructImageName(context.options.prepare![0] as DockerPluginConfig), + tag: 'next', + }) + .resolves({ name: testImage1 }); + + const prepareResult = await prepare(config, context, (dockerStub as unknown) as Dockerode); + expect(imageMock.verify()).to.not.throw; + + expect(prepareResult).to.deep.equal([[testImage1]]); + }); + + it('should add multiple tags to an image (with next version)', async function() { + const image = new Dockerode.Image('', testImage1); + const imageStub = stub(image); + const dockerStub = createStubInstance(Dockerode); + dockerStub.getImage.returns(image); + + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + path: '@iteratec/semantic-release-docker', + additionalTags: ['tag1', 'tag2'], + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + + imageStub.tag.resolves({ name: testImage1 }); + + const prepareResult = await prepare(config, context, (dockerStub as unknown) as Dockerode).then((data) => data[0]); - await prepare(config, context, dockerStub); // tslint:disable-next-line: no-unused-expression expect(imageStub.tag.calledThrice).to.be.true; + expect(prepareResult).to.have.length(3); + expect(imageStub.tag.firstCall.args[0]).to.deep.equal({ - repo: fakeImageName, - tag: expected[0], + repo: testImage1, + tag: 'next', }); expect(imageStub.tag.secondCall.args[0]).to.deep.equal({ - repo: fakeImageName, - tag: expected[1], + repo: testImage1, + tag: 'tag1', }); expect(imageStub.tag.thirdCall.args[0]).to.deep.equal({ - repo: fakeImageName, - tag: expected[2], + repo: testImage1, + tag: 'tag2', }); }); + + it('should add multiple images', async function() { + const image1 = new Dockerode.Image('', testImage1); + const image1Mock = mock(image1); + const image2 = new Dockerode.Image('', testImage2); + const image2Mock = mock(image2); + // const imageMock = mock(image); + const dockerStub = createStubInstance(Dockerode); + dockerStub.getImage.onCall(0).returns(image1); + dockerStub.getImage.onCall(1).returns(image2); + + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName: testImage1, + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + { + imageName: testImage2, + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + + image1Mock + .expects('tag') + .once() + .withExactArgs({ + repo: constructImageName(context.options.prepare![0] as DockerPluginConfig), + tag: 'next', + }) + .resolves({ name: testImage1 }); + + image2Mock + .expects('tag') + .once() + .withExactArgs({ + repo: constructImageName(context.options.prepare![1] as DockerPluginConfig), + tag: 'next', + }) + .resolves({ name: testImage2 }); + + const prepareResult = await prepare(config, context, (dockerStub as unknown) as Dockerode); + + expect(prepareResult).to.deep.equal([[testImage1], [testImage2]]); + expect(image1Mock.verify()).to.not.throw; + expect(image2Mock.verify()).to.not.throw; + }); }); }); diff --git a/src/prepare/index.ts b/src/prepare/index.ts index 21ea645..8cd32ff 100644 --- a/src/prepare/index.ts +++ b/src/prepare/index.ts @@ -1,56 +1,46 @@ import Dockerode from 'dockerode'; - -import { - SemanticReleaseConfig, - SemanticReleaseContext, -} from 'semantic-release'; -import { DockerPluginConfig } from '../dockerPluginConfig'; +import { SemanticReleaseConfig, SemanticReleaseContext } from 'semantic-release'; +import { DockerPluginConfig } from '../models'; +import { pluginSettings } from '../plugin-settings'; +import { constructImageName, getImageTagsFromConfig } from '../shared-logic'; +import { verified, verifyConditions } from '../verifyConditions'; export var prepared = false; export async function prepare( pluginConfig: SemanticReleaseConfig, context: SemanticReleaseContext, - docker?: Dockerode, -): Promise { - const preparePlugin = context.options.prepare!.find( - (p) => p.path === '@iteratec/semantic-release-docker', - ) as DockerPluginConfig; - if (!preparePlugin.imageName) { - throw new Error('\'imageName\' is not set in plugin configuration'); - } - if (!docker) { - docker = new Dockerode(); - } - const image = docker.getImage(preparePlugin.imageName); - let tags = [context.nextRelease!.version!]; - if (preparePlugin.additionalTags && preparePlugin.additionalTags.length > 0) { - tags = tags.concat(preparePlugin.additionalTags); + dockerode?: Dockerode, +): Promise { + if (!verified) { + await verifyConditions(pluginConfig, context).then( + () => {}, + (reject) => { + return Promise.reject(reject); + }, + ); } + + const preparePlugins = context.options.prepare!.filter((p) => p.path === pluginSettings.path) as DockerPluginConfig[]; + const docker = dockerode ? dockerode : new Dockerode(); + return Promise.all( - tags.map((imagetag) => { - return image.tag({ - repo: - `${ - preparePlugin.registryUrl ? `${preparePlugin.registryUrl}/` : '' - }` + - `${ - preparePlugin.repositoryName - ? `${preparePlugin.repositoryName}/` - : '' - }` + - `${preparePlugin.imageName}`, - tag: imagetag, + preparePlugins.map((preparePlugin) => { + const image = docker.getImage(preparePlugin.imageName); + const tags = getImageTagsFromConfig(preparePlugin, context); + return Promise.all( + tags.map((imagetag) => { + return image.tag({ + repo: constructImageName(preparePlugin), + tag: imagetag, + }); + }), + ).then((data) => { + return data.map((result) => result.name); }); }), - ) - .then((data) => { - if (!prepared) { - prepared = true; - } - return data.map((result) => result.name); - }) - .catch((error) => { - throw new Error(error); - }); + ).then((data) => { + prepared = true; + return data.map((result) => result); + }); } diff --git a/src/publish/index.ts b/src/publish/index.ts index 40c5384..184d995 100644 --- a/src/publish/index.ts +++ b/src/publish/index.ts @@ -1,11 +1,11 @@ import Dockerode from 'dockerode'; - import { SemanticReleaseConfig, SemanticReleaseContext } from 'semantic-release'; -import { DockerPluginConfig } from '../dockerPluginConfig'; -import { Auth } from '../model/auth'; +import { Authentication, DockerPluginConfig } from '../models'; +import { pluginSettings } from '../plugin-settings'; import { prepare, prepared } from '../prepare'; +import { constructImageName, getCredentials, getImageTagsFromConfig, getRegistryUrlFromConfig } from '../shared-logic'; -interface PushOptions extends Auth { +interface PushOptions extends Authentication { tag: string; } @@ -15,42 +15,61 @@ export interface PublishedRelease { export async function publish(pluginConfig: SemanticReleaseConfig, context: SemanticReleaseContext) { if (!prepared) { - prepare(pluginConfig, context); + await prepare(pluginConfig, context).then( + () => {}, + (reject) => { + return Promise.reject(reject); + }, + ); } + const docker = new Dockerode(); - let tags = [context.nextRelease!.version!]; - const preparePlugin = context.options.prepare! - .find((p) => p.path === '@iteratec/semantic-release-docker')! as DockerPluginConfig; - if (preparePlugin.additionalTags && preparePlugin.additionalTags.length > 0) { - tags = tags.concat(preparePlugin.additionalTags); - } - const imageName = `${preparePlugin.registryUrl ? `${preparePlugin.registryUrl}/` : ''}` + - `${preparePlugin.repositoryName ? `${preparePlugin.repositoryName}/` : ''}` + - `${preparePlugin.imageName}`; - const image = docker.getImage(imageName); - const options: PushOptions = { - password: process.env.DOCKER_REGISTRY_PASSWORD!, - serveraddress: process.env.DOCKER_REGISTRY_URL ? - process.env.DOCKER_REGISTRY_URL : preparePlugin.registryUrl ? preparePlugin.registryUrl : '', - tag: '', - username: process.env.DOCKER_REGISTRY_USER!, - }; - return Promise.all(tags.map((imageTag: string) => { - options.tag = imageTag; - context.logger.log(`pushing image ${imageName}:${imageTag}`); - return image.push(options); - })) - .then((streams) => Promise.all(streams.map((stream) => new Promise((resolve, reject) => { - stream.on('data', (chunk) => context.logger.log(chunk.toString())); - stream.on('end', () => resolve()); - stream.on('error', (error) => reject(error)); - })))) - .then(() => { - return { - completeImageName: tags.map((tag: string) => `${imageName}:${tag}`), - } as PublishedRelease; - }) - .catch((error) => { - throw new Error(error); - }); + + const preparePlugins = context.options.prepare!.filter((p) => p.path === pluginSettings.path) as DockerPluginConfig[]; + + return Promise.all( + preparePlugins.map((preparePlugin) => { + const tags = getImageTagsFromConfig(preparePlugin, context); + const imageName = constructImageName(preparePlugin); + const image = docker.getImage(imageName); + const cred = getCredentials(); + + const options: PushOptions = { + password: cred.password, + serveraddress: getRegistryUrlFromConfig(preparePlugin), + tag: '', + username: cred.username, + }; + return Promise.all( + tags.map((imageTag: string) => { + options.tag = imageTag; + context.logger.log(`pushing image ${imageName}:${imageTag}`); + return image.push(options); + }), + ) + .then((streams) => + Promise.all( + streams.map( + (stream) => + new Promise((resolve, reject) => { + stream.on('data', (chunk) => context.logger.log(chunk.toString())); + stream.on('end', () => resolve()); + stream.on('error', (error) => { + reject(error); + }); + }), + ), + ), + ) + .then(() => { + return { + completeImageName: tags.map((tag: string) => `${imageName}:${tag}`), + } as PublishedRelease; + }); + }), + ).then((publishedImages) => { + return { + publishedImages, + }; + }); } diff --git a/src/shared-logic.spec.ts b/src/shared-logic.spec.ts new file mode 100644 index 0000000..e1bbd32 --- /dev/null +++ b/src/shared-logic.spec.ts @@ -0,0 +1,73 @@ +import { expect } from 'chai'; +import { Credentials, DockerPluginConfig } from './models'; +import { constructImageName, getCredentials, getRegistryUrlFromConfig } from './shared-logic'; + +describe('@iteratec/semantic-release-docker', function() { + describe('shared-logic', function() { + afterEach(function() { + process.env.DOCKER_REGISTRY_USER = ''; + process.env.DOCKER_REGISTRY_PASSWORD = ''; + process.env.DOCKER_REGISTRY_URL = ''; + }); + + it('should use only image name', function() { + const config: DockerPluginConfig = { + path: '@iteratec/semantic-release-docker', + imageName: 'test' + }; + expect(constructImageName(config)).to.be.equal('test'); + }); + + it('should use image name and repository', function() { + const config: DockerPluginConfig = { + path: '@iteratec/semantic-release-docker', + imageName: 'test', + repositoryName: 'repo' + }; + expect(constructImageName(config)).to.be.equal('repo/test'); + }); + + it('should use image name, repository and registry', function() { + const config: DockerPluginConfig = { + path: '@iteratec/semantic-release-docker', + imageName: 'test', + repositoryName: 'repo', + registryUrl: 'registry' + }; + expect(constructImageName(config)).to.be.equal('registry/repo/test'); + }); + + it('should use the registry from the config', function() { + const config: DockerPluginConfig = { + path: '@iteratec/semantic-release-docker', + imageName: 'test', + registryUrl: 'registry' + }; + expect(getRegistryUrlFromConfig(config)).to.be.equal('registry'); + }); + + it('should prefer the registry from the environment variable over the one from the config', function() { + process.env.DOCKER_REGISTRY_URL = 'my_other_private_registry'; + const config: DockerPluginConfig = { + path: '@iteratec/semantic-release-docker', + imageName: 'test', + registryUrl: 'registry' + }; + expect(getRegistryUrlFromConfig(config)).to.be.equal('my_other_private_registry'); + }); + + it('should default to empty string if no registry is specified', function() { + const config: DockerPluginConfig = { + path: '@iteratec/semantic-release-docker', + imageName: 'test' + }; + expect(getRegistryUrlFromConfig(config)).to.be.equal(''); + }); + + it('should get Credentials', function() { + process.env.DOCKER_REGISTRY_USER = 'username'; + process.env.DOCKER_REGISTRY_PASSWORD = 'password'; + expect(getCredentials()).to.eql({ password: 'password', username: 'username' } as Credentials); + }); + }); +}); diff --git a/src/shared-logic.ts b/src/shared-logic.ts new file mode 100644 index 0000000..a19b8b2 --- /dev/null +++ b/src/shared-logic.ts @@ -0,0 +1,48 @@ +import { Credentials, DockerPluginConfig } from './models'; +import { SemanticReleaseContext } from 'semantic-release'; + +export function constructImageName(config: DockerPluginConfig): string { + return ( + `${config.registryUrl ? `${config.registryUrl}/` : ''}` + + `${config.repositoryName ? `${config.repositoryName}/` : ''}` + + `${config.imageName}` + ); +} + +export function getRegistryUrlFromConfig(config: DockerPluginConfig): string { + return process.env.DOCKER_REGISTRY_URL + ? process.env.DOCKER_REGISTRY_URL + : config.registryUrl + ? config.registryUrl + : ''; +} + +export function getImageTagsFromConfig(config: DockerPluginConfig, context: SemanticReleaseContext): string[] { + let tags = []; + tags.push(context.nextRelease!.version!); + if (config.additionalTags && config.additionalTags.length > 0) { + tags = tags.concat(config.additionalTags); + } + return tags; +} + +/** + * Get Authentication object from Environment Variables + * Throws Error if Variables are not set. + */ +export function getCredentials(): Credentials { + // Check DOCKER_REGISTRY_USER Environment Variable + if (!process.env.DOCKER_REGISTRY_USER) { + throw new Error('Environment variable DOCKER_REGISTRY_USER must be set in order to login to the registry.'); + } + + // Check DOCKER_REGISTRY_PASSWORD Environment Variable + if (!process.env.DOCKER_REGISTRY_PASSWORD) { + throw new Error('Environment variable DOCKER_REGISTRY_PASSWORD must be set in order to login to the registry.'); + } + + return { + username: process.env.DOCKER_REGISTRY_USER, + password: process.env.DOCKER_REGISTRY_PASSWORD + }; +} diff --git a/src/test/test-helpers.ts b/src/test/test-helpers.ts new file mode 100644 index 0000000..bef986b --- /dev/null +++ b/src/test/test-helpers.ts @@ -0,0 +1,27 @@ +import Dockerode from 'dockerode'; + +export function buildImage(imageName: string): Promise { + const docker = new Dockerode(); + return new Promise((resolve, reject) => { + docker.buildImage( + { + context: './', + src: ['Dockerfile'] + }, + { + t: imageName + }, + function(error, stream) { + if (error) { + reject(error); + } + if (stream) { + stream.resume(); + stream.on('end', function() { + resolve(); + }); + } + } + ); + }); +} diff --git a/src/verifyConditions/index.e2e.ts b/src/verifyConditions/index.e2e.ts new file mode 100644 index 0000000..6842b40 --- /dev/null +++ b/src/verifyConditions/index.e2e.ts @@ -0,0 +1,90 @@ +import { expect, use } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import Docker from 'dockerode'; +import { SemanticReleaseConfig, SemanticReleaseContext } from 'semantic-release'; +import { DockerPluginConfig } from '../models'; +import { buildImage } from '../test/test-helpers'; +import { verifyConditions } from './index'; + +describe('@iteratec/semantic-release-docker', function() { + describe('verifyConditions', function() { + const imageName = 'abcdefghijklmnopqrstuvwxyz'; + const config: SemanticReleaseConfig = { + branch: '', + noCi: true, + repositoryUrl: '', + tagFormat: '', + }; + + before(function() { + use(chaiAsPromised); + }); + + it('should throw if image with imagename does not exist', async function() { + const docker = new Docker(); + try { + await docker.getImage(imageName).remove(); + } catch (e) {} + + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName, + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + return expect(verifyConditions(config, context)).to.eventually.be.rejectedWith( + `Image with name '${imageName}' does not exist on this machine.`, + ); + }); + + it('should NOT throw if image with imagename does exist', async function() { + this.timeout(5000); + await buildImage(imageName); + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName, + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + + return expect(verifyConditions(config, context)).to.not.eventually.be.rejectedWith( + `Image with name '${imageName}' does not exist on this machine.`, + ); + }); + + after(async function() { + const docker = new Docker(); + await docker.getImage(imageName).remove(); + }); + }); +}); diff --git a/src/verifyConditions/index.spec.ts b/src/verifyConditions/index.spec.ts index 4d03cfb..1e92b77 100644 --- a/src/verifyConditions/index.spec.ts +++ b/src/verifyConditions/index.spec.ts @@ -1,18 +1,14 @@ import { expect, use } from 'chai'; import chaiAsPromised from 'chai-as-promised'; import Dockerode from 'dockerode'; -import { createStubInstance } from 'sinon'; - -import { - SemanticReleaseConfig, - SemanticReleaseContext, -} from 'semantic-release'; -import { DockerPluginConfig } from '../dockerPluginConfig'; -import { Auth } from '../model/auth'; +import { SemanticReleaseConfig, SemanticReleaseContext } from 'semantic-release'; +import { createStubInstance, SinonStubbedInstance } from 'sinon'; +import { Authentication, DockerPluginConfig } from '../models'; import { verifyConditions } from './index'; describe('@iteratec/semantic-release-docker', function() { describe('verifyConditions', function() { + const imageName = 'abcdefghijklmnopqrstuvwxyz'; const config: SemanticReleaseConfig = { branch: '', noCi: true, @@ -29,7 +25,7 @@ describe('@iteratec/semantic-release-docker', function() { noCi: true, prepare: [ { - imageName: '', + imageName, path: '@iteratec/semantic-release-docker', } as DockerPluginConfig, ], @@ -37,48 +33,157 @@ describe('@iteratec/semantic-release-docker', function() { tagFormat: '', }, }; - let dockerStub: any; + let dockerStub: SinonStubbedInstance; before(function() { use(chaiAsPromised); dockerStub = createStubInstance(Dockerode); - dockerStub.checkAuth.resolves(true); }); - afterEach(function() { - process.env.DOCKER_REGISTRY_USER = ''; - process.env.DOCKER_REGISTRY_PASSWORD = ''; - process.env.DOCKER_REGISTRY_URL = ''; + beforeEach(function() { + dockerStub.checkAuth.resolves(true); + dockerStub.listImages.resolves([ + { + Id: '', + ParentId: '', + RepoTags: [], + Created: 0, + Size: 0, + VirtualSize: 0, + Labels: {}, + }, + ]); }); it('should throw when the username is not set', function() { + delete process.env.DOCKER_REGISTRY_USER; return expect( - verifyConditions(config, context), + verifyConditions(config, context, (dockerStub as unknown) as Dockerode), ).to.eventually.be.rejectedWith( 'Environment variable DOCKER_REGISTRY_USER must be set in order to login to the registry.', ); }); + it('should NOT throw when the username is set', function() { + process.env.DOCKER_REGISTRY_USER = 'username'; + return expect( + verifyConditions(config, context, (dockerStub as unknown) as Dockerode), + ).to.not.eventually.be.rejectedWith( + 'Environment variable DOCKER_REGISTRY_USER must be set in order to login to the registry.', + ); + }); + it('should throw when the password is not set', function() { process.env.DOCKER_REGISTRY_USER = 'username'; + delete process.env.DOCKER_REGISTRY_PASSWORD; return expect( - verifyConditions(config, context), + verifyConditions(config, context, (dockerStub as unknown) as Dockerode), ).to.eventually.be.rejectedWith( 'Environment variable DOCKER_REGISTRY_PASSWORD must be set in order to login to the registry.', ); }); + it('should NOT throw when the password is set', function() { + process.env.DOCKER_REGISTRY_PASSWORD = 'password'; + return expect( + verifyConditions(config, context, (dockerStub as unknown) as Dockerode), + ).to.not.eventually.be.rejectedWith( + 'Environment variable DOCKER_REGISTRY_PASSWORD must be set in order to login to the registry.', + ); + }); + + it('should throw if no imagename is provided', function() { + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + return expect( + verifyConditions(config, context, (dockerStub as unknown) as Dockerode), + ).to.eventually.be.rejectedWith('\'imageName\' is not set in plugin configuration'); + }); + + it('should throw if image with imagename does not exist', async function() { + dockerStub.listImages.resolves([]); + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName, + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + return expect( + verifyConditions(config, context, (dockerStub as unknown) as Dockerode), + ).to.eventually.be.rejectedWith(`Image with name '${imageName}' does not exist on this machine.`); + }); + + it('should NOT throw if image with imagename does exist', async function() { + const context = { + // tslint:disable-next-line:no-empty + logger: { log: (message: string) => {} }, + nextRelease: { + gitTag: '', + notes: '', + version: 'next', + }, + options: { + branch: '', + noCi: true, + prepare: [ + { + imageName, + path: '@iteratec/semantic-release-docker', + } as DockerPluginConfig, + ], + repositoryUrl: '', + tagFormat: '', + }, + } as SemanticReleaseContext; + + return expect( + verifyConditions(config, context, (dockerStub as unknown) as Dockerode), + ).to.not.eventually.be.rejectedWith(`Image with name '${imageName}' does not exist on this machine.`); + }); + it('should use the registry from the config', async function() { const expected = { password: 'password', serveraddress: 'my_private_registry', username: 'username', - } as Auth; + } as Authentication; process.env.DOCKER_REGISTRY_USER = expected.username; process.env.DOCKER_REGISTRY_PASSWORD = expected.password; - (context.options.prepare![0] as DockerPluginConfig).registryUrl = - expected.serveraddress; - await verifyConditions(config, context, dockerStub); + (context.options.prepare![0] as DockerPluginConfig).registryUrl = expected.serveraddress; + await verifyConditions(config, context, (dockerStub as unknown) as Dockerode); // tslint:disable-next-line: no-unused-expression expect(dockerStub.checkAuth.calledOnce).to.be.true; expect(dockerStub.checkAuth.firstCall.args[0]).to.deep.equal(expected); @@ -89,29 +194,30 @@ describe('@iteratec/semantic-release-docker', function() { password: 'topsecret', serveraddress: 'registry_from_env', username: 'me', - } as Auth; + } as Authentication; process.env.DOCKER_REGISTRY_USER = expected.username; process.env.DOCKER_REGISTRY_PASSWORD = expected.password; process.env.DOCKER_REGISTRY_URL = expected.serveraddress; - (context.options.prepare![0] as DockerPluginConfig).registryUrl = - 'registry_from_config'; - await verifyConditions(config, context, dockerStub); + (context.options.prepare![0] as DockerPluginConfig).registryUrl = 'registry_from_config'; + await verifyConditions(config, context, (dockerStub as unknown) as Dockerode); // tslint:disable-next-line: no-unused-expression expect(dockerStub.checkAuth.calledOnce).to.be.true; expect(dockerStub.checkAuth.firstCall.args[0]).to.deep.equal(expected); }); - it('should let docker decide which registry to use if none is specified', async function() { + it('should default to empty string if no registry is specified', async function() { const expected = { password: 'topsecret', serveraddress: '', username: 'me', - } as Auth; - (context.options.prepare![0] as DockerPluginConfig).registryUrl = ''; - (context.options.prepare![0] as DockerPluginConfig).imageName = ''; + } as Authentication; process.env.DOCKER_REGISTRY_USER = expected.username; process.env.DOCKER_REGISTRY_PASSWORD = expected.password; - await verifyConditions(config, context, dockerStub); + delete process.env.DOCKER_REGISTRY_URL; + (context.options.prepare![0] as DockerPluginConfig).registryUrl = ''; + (context.options.prepare![0] as DockerPluginConfig).imageName = 'test'; + + await verifyConditions(config, context, (dockerStub as unknown) as Dockerode); // tslint:disable-next-line: no-unused-expression expect(dockerStub.checkAuth.calledOnce).to.be.true; expect(dockerStub.checkAuth.firstCall.args[0]).to.deep.equal(expected); diff --git a/src/verifyConditions/index.ts b/src/verifyConditions/index.ts index 7d012e8..95d6f5b 100644 --- a/src/verifyConditions/index.ts +++ b/src/verifyConditions/index.ts @@ -1,61 +1,60 @@ import Dockerode from 'dockerode'; -import { - SemanticReleaseConfig, - SemanticReleaseContext, -} from 'semantic-release'; - -import { DockerPluginConfig } from '../dockerPluginConfig'; -import { Auth } from '../model/auth'; +import { SemanticReleaseConfig, SemanticReleaseContext } from 'semantic-release'; +import { Authentication, DockerPluginConfig } from '../models'; +import { pluginSettings } from '../plugin-settings'; +import { getCredentials, getRegistryUrlFromConfig } from '../shared-logic'; export var verified = false; +/** + * Just for test purposes. + * @param val + */ +export function setVerified() { + verified = true; +} +/** + * First Step + * Verify all conditions in order to proceed with the release + */ export async function verifyConditions( pluginConfig: SemanticReleaseConfig, context: SemanticReleaseContext, - docker?: Dockerode, -) { - if (!process.env.DOCKER_REGISTRY_USER) { - throw new Error( - 'Environment variable DOCKER_REGISTRY_USER must be set in order to login to the registry.', - ); - } - if (!process.env.DOCKER_REGISTRY_PASSWORD) { - throw new Error( - 'Environment variable DOCKER_REGISTRY_PASSWORD must be set in order to login to the registry.', - ); - } - let preparePlugin: DockerPluginConfig; - if ( - !context.options.prepare || - !context.options.prepare!.find( - (p) => p.path === '@iteratec/semantic-release-docker', - ) - ) { + dockerode?: Dockerode, +): Promise { + // Check if Username and Password are set if not reject Promise with Error Message + const cred = getCredentials(); + + // Check if plugin is configured in prepare step + if (!context.options.prepare || !context.options.prepare!.find((p) => p.path === pluginSettings.path)) { throw new Error('\'prepare\' is not configured'); } - preparePlugin = context.options.prepare.find( - (p) => p.path === '@iteratec/semantic-release-docker', - ) as DockerPluginConfig; - let registryUrl: string; - if (process.env.DOCKER_REGISTRY_URL || preparePlugin.registryUrl) { - registryUrl = process.env.DOCKER_REGISTRY_URL - ? process.env.DOCKER_REGISTRY_URL - : preparePlugin.registryUrl!; - } else { - registryUrl = ''; - } - if (!docker) { - docker = new Dockerode(); - } - const auth = { - password: process.env.DOCKER_REGISTRY_PASSWORD, - serveraddress: registryUrl, - username: process.env.DOCKER_REGISTRY_USER, - } as Auth; - return docker.checkAuth(auth).then((result) => { - if (!verified) { - verified = true; - } - }); + const preparePlugins = context.options.prepare!.filter((p) => p.path === pluginSettings.path) as DockerPluginConfig[]; + const docker = dockerode ? dockerode : new Dockerode(); + + return Promise.all( + preparePlugins.map(async (preparePlugin) => { + // Check if imagename is set + if (preparePlugin.imageName == null || preparePlugin.imageName.length === 0) { + throw new Error('\'imageName\' is not set in plugin configuration'); + } + + // Check if image exists on machine + const imagelist = await docker.listImages({ filters: { reference: [preparePlugin.imageName] } }); + if (imagelist.length === 0) { + throw new Error(`Image with name '${preparePlugin.imageName}' does not exist on this machine.`); + } + + // Check Authentication + const auth: Authentication = { + ...cred, + serveraddress: getRegistryUrlFromConfig(preparePlugin), + }; + + return docker.checkAuth(auth).then((data) => { + verified = true; + }); + }), + ); }