From 02bce8d204d11f20c8db1decb610c218fcace263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BChler?= Date: Wed, 2 Dec 2020 09:44:12 +0100 Subject: [PATCH] feat: rewrite kuby. (#26) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #7. Closes #5. This essentially is a complete rewrite of kuby in F# instead of typescript. F# provides faster runtime and nicer language features and it was a nice project to try the F# language. Also, the direct need of `kubectl` is removed. For the one part of the package that needs kubectl (`deploy`) a bundled version of kubectl is used. BREAKING CHANGE: The command `cleanup` is removed. It was a highly destructive action and therefore was removed. BREAKING CHANGE: The command `kubectl` is removed. The `kubectl` executable is included in the compiled project and will be used from there when necessary. To manage your local `kubectl` versions, you can use https://github.com/buehler/kubectl-version-manager BREAKING CHANGE: The command `preview-deploy` is removed. This was a command that was highly opinionated and created more problems than it solved It is removed in favor to CI-themed preview deployments. BREAKING CHANGE: The commands `deploy`, `apply`, and `prepare` are restructured. Instead of creating three different commands, kuby now only knows `deploy`. To create the same behaviour as in earlier versions, deploy can be used with flags to output the prepared yaml to a folder and use a dry-run flag to prevent effective action on the cluster. Signed-off-by: Christoph Bühler --- .dockerignore | 11 - .editorconfig | 13 - .github/workflows/dotnet-release.yml | 22 + .github/workflows/dotnet-test.yml | 24 + .github/workflows/execute-node-tests.yml | 26 - .gitignore | 37 +- .gitlab-ci.yml | 63 - .kubyrc.json | 3 - .npmignore | 27 - .nuke | 1 + .nvmrc | 1 - .releaserc.json | 40 + Dockerfile | 36 - Kuby.sln | 28 + LICENSE | 21 - README.md | 32 +- build.cmd | 7 + build.ps1 | 69 + build.sh | 62 + build/.editorconfig | 11 + build/Build.cs | 90 + build/Configuration.cs | 16 + build/_build.csproj | 28 + build/_build.csproj.DotSettings | 27 + config/tsconfig.base.json | 20 - config/tsconfig.build.json | 7 - docker-build.sh | 27 - jest.json | 7 - package-lock.json | 13292 ---------------- package.json | 83 - src/Kuby/.gitignore | 1 + src/Kuby/Clipboard.fs | 105 + src/Kuby/Clipboard/Linux/xsel | Bin 0 -> 129416 bytes src/Kuby/Clipboard/Windows/clipboard.exe | Bin 0 -> 331438 bytes src/Kuby/Commands/Base64.fs | 72 + src/Kuby/Commands/BaseCommand.fs | 12 + src/Kuby/Commands/CompletionTemplate.fs | 83 + src/Kuby/Commands/Context.fs | 35 + src/Kuby/Commands/Deployment.fs | 162 + src/Kuby/Commands/KubeConfig.fs | 160 + src/Kuby/Commands/Kuby.fs | 96 + src/Kuby/Commands/Namespace.fs | 38 + src/Kuby/Commands/ReturnValues.fs | 5 + src/Kuby/Commands/Secret.fs | 140 + src/Kuby/Commands/Version.fs | 37 + src/Kuby/ConsoleWriter.fs | 26 + src/Kuby/Kubectl.fs | 69 + src/Kuby/Kubernetes/Cluster.fs | 15 + src/Kuby/Kubernetes/Context.fs | 22 + src/Kuby/Kubernetes/KubeConfig.fs | 70 + src/Kuby/Kubernetes/Namespace.fs | 25 + src/Kuby/Kuby.fsproj | 61 + src/Kuby/Program.fs | 8 + src/Kuby/Strings.fs | 24 + src/commands/apply/index.ts | 72 - src/commands/base64/decode/index.ts | 39 - src/commands/base64/encode/index.ts | 39 - src/commands/base64/index.ts | 18 - src/commands/cleanup/index.ts | 146 - src/commands/context/index.ts | 85 - src/commands/context/utils/kubectx.ts | 15 - src/commands/delete/index.ts | 76 - src/commands/deploy/index.ts | 62 - src/commands/index.ts | 30 - src/commands/kube-config/index.ts | 91 - src/commands/kubectl/index.ts | 26 - src/commands/kubectl/install/index.ts | 76 - src/commands/kubectl/list/index.ts | 33 - src/commands/kubectl/refresh/index.ts | 26 - src/commands/kubectl/remove/index.ts | 74 - src/commands/kubectl/use/index.ts | 77 - src/commands/kubectl/utils/kubectl.ts | 130 - src/commands/namespace/create/index.ts | 213 - src/commands/namespace/index.ts | 94 - src/commands/namespace/kube-config/index.ts | 173 - src/commands/namespace/utils/kubens.ts | 31 - src/commands/prepare/index.ts | 84 - src/commands/preview-deploy/index.ts | 123 - src/commands/secret/basic-auth/index.ts | 84 - src/commands/secret/create/index.ts | 104 - .../secret/docker-registry/create/index.ts | 243 - src/commands/secret/docker-registry/index.ts | 16 - src/commands/secret/index.ts | 18 - src/commands/version/index.ts | 72 - src/commands/version/version-info.ts | 14 - src/extensions.d.ts | 5 - src/kubernetes-helpers.ts | 114 - src/root-arguments.ts | 10 - src/typings.d.ts | 1 - src/utils/crypto.ts | 46 - src/utils/env-trim-prefix.ts | 6 - src/utils/envsubst.ts | 24 - src/utils/exec.ts | 13 - src/utils/exit-code.ts | 3 - src/utils/extensions.ts | 15 - src/utils/filepathes.ts | 36 - src/utils/kubernetes-api.ts | 70 - src/utils/logger.ts | 123 - src/utils/rc-file.ts | 39 - src/utils/simple-confirm.ts | 14 - src/utils/spawn.ts | 18 - test/__mocks__/fs.js | 1 - test/commands/apply/apply.spec.ts | 62 - test/commands/base64/base64.decode.spec.ts | 40 - test/commands/base64/base64.encode.spec.ts | 40 - test/commands/cleanup/cleanup.spec.ts | 138 - test/commands/context/context.spec.ts | 65 - .../context/context.utils.kubectx.spec.ts | 51 - test/commands/delete/delete.spec.ts | 55 - test/commands/deploy/deploy.spec.ts | 42 - test/commands/kube-config/kube-config.spec.ts | 125 - test/commands/kubectl/kubectl.install.spec.ts | 120 - test/commands/kubectl/kubectl.list.spec.ts | 53 - test/commands/kubectl/kubectl.refresh.spec.ts | 37 - test/commands/kubectl/kubectl.remove.spec.ts | 61 - test/commands/kubectl/kubectl.use.spec.ts | 59 - .../kubectl/kubectl.utils.kubectl.spec.ts | 200 - .../namespace/namespace.create.spec.ts | 136 - .../namespace/namespace.kube-config.spec.ts | 144 - test/commands/namespace/namespace.spec.ts | 61 - .../namespace/namespace.utils.kubens.spec.ts | 76 - test/commands/prepare/prepare.spec.ts | 69 - .../__snapshots__/preview-deploy.spec.ts.snap | 11 - .../preview-deploy/preview-deploy.spec.ts | 109 - .../secret/__snapshots__/create.spec.ts.snap | 18 - test/commands/secret/basic-auth.spec.ts | 46 - test/commands/secret/create.spec.ts | 41 - .../secret.docker-registry.create.spec.ts | 131 - test/helpers.ts | 20 - test/setup.ts | 76 - test/utils/env-trim-prefix.spec.ts | 43 - test/utils/envsubst.spec.ts | 58 - test/utils/extensions.spec.ts | 27 - test/utils/logger.spec.ts | 66 - test/utils/rc-file.spec.ts | 21 - tsconfig.json | 7 - tslint.json | 3 - 137 files changed, 1719 insertions(+), 18911 deletions(-) delete mode 100644 .dockerignore delete mode 100644 .editorconfig create mode 100644 .github/workflows/dotnet-release.yml create mode 100644 .github/workflows/dotnet-test.yml delete mode 100644 .github/workflows/execute-node-tests.yml delete mode 100644 .gitlab-ci.yml delete mode 100644 .kubyrc.json delete mode 100644 .npmignore create mode 100755 .nuke delete mode 100644 .nvmrc create mode 100644 .releaserc.json delete mode 100644 Dockerfile create mode 100755 Kuby.sln delete mode 100644 LICENSE create mode 100755 build.cmd create mode 100755 build.ps1 create mode 100755 build.sh create mode 100755 build/.editorconfig create mode 100755 build/Build.cs create mode 100755 build/Configuration.cs create mode 100755 build/_build.csproj create mode 100755 build/_build.csproj.DotSettings delete mode 100644 config/tsconfig.base.json delete mode 100644 config/tsconfig.build.json delete mode 100755 docker-build.sh delete mode 100644 jest.json delete mode 100644 package-lock.json delete mode 100644 package.json create mode 100644 src/Kuby/.gitignore create mode 100755 src/Kuby/Clipboard.fs create mode 100755 src/Kuby/Clipboard/Linux/xsel create mode 100644 src/Kuby/Clipboard/Windows/clipboard.exe create mode 100755 src/Kuby/Commands/Base64.fs create mode 100755 src/Kuby/Commands/BaseCommand.fs create mode 100755 src/Kuby/Commands/CompletionTemplate.fs create mode 100755 src/Kuby/Commands/Context.fs create mode 100755 src/Kuby/Commands/Deployment.fs create mode 100755 src/Kuby/Commands/KubeConfig.fs create mode 100755 src/Kuby/Commands/Kuby.fs create mode 100755 src/Kuby/Commands/Namespace.fs create mode 100755 src/Kuby/Commands/ReturnValues.fs create mode 100755 src/Kuby/Commands/Secret.fs create mode 100644 src/Kuby/Commands/Version.fs create mode 100755 src/Kuby/ConsoleWriter.fs create mode 100755 src/Kuby/Kubectl.fs create mode 100755 src/Kuby/Kubernetes/Cluster.fs create mode 100755 src/Kuby/Kubernetes/Context.fs create mode 100755 src/Kuby/Kubernetes/KubeConfig.fs create mode 100755 src/Kuby/Kubernetes/Namespace.fs create mode 100755 src/Kuby/Kuby.fsproj create mode 100755 src/Kuby/Program.fs create mode 100755 src/Kuby/Strings.fs delete mode 100644 src/commands/apply/index.ts delete mode 100644 src/commands/base64/decode/index.ts delete mode 100644 src/commands/base64/encode/index.ts delete mode 100644 src/commands/base64/index.ts delete mode 100644 src/commands/cleanup/index.ts delete mode 100644 src/commands/context/index.ts delete mode 100644 src/commands/context/utils/kubectx.ts delete mode 100644 src/commands/delete/index.ts delete mode 100644 src/commands/deploy/index.ts delete mode 100644 src/commands/index.ts delete mode 100644 src/commands/kube-config/index.ts delete mode 100644 src/commands/kubectl/index.ts delete mode 100644 src/commands/kubectl/install/index.ts delete mode 100644 src/commands/kubectl/list/index.ts delete mode 100644 src/commands/kubectl/refresh/index.ts delete mode 100644 src/commands/kubectl/remove/index.ts delete mode 100644 src/commands/kubectl/use/index.ts delete mode 100644 src/commands/kubectl/utils/kubectl.ts delete mode 100644 src/commands/namespace/create/index.ts delete mode 100644 src/commands/namespace/index.ts delete mode 100644 src/commands/namespace/kube-config/index.ts delete mode 100644 src/commands/namespace/utils/kubens.ts delete mode 100644 src/commands/prepare/index.ts delete mode 100644 src/commands/preview-deploy/index.ts delete mode 100644 src/commands/secret/basic-auth/index.ts delete mode 100644 src/commands/secret/create/index.ts delete mode 100644 src/commands/secret/docker-registry/create/index.ts delete mode 100644 src/commands/secret/docker-registry/index.ts delete mode 100644 src/commands/secret/index.ts delete mode 100644 src/commands/version/index.ts delete mode 100644 src/commands/version/version-info.ts delete mode 100644 src/extensions.d.ts delete mode 100644 src/kubernetes-helpers.ts delete mode 100644 src/root-arguments.ts delete mode 100644 src/typings.d.ts delete mode 100644 src/utils/crypto.ts delete mode 100644 src/utils/env-trim-prefix.ts delete mode 100644 src/utils/envsubst.ts delete mode 100644 src/utils/exec.ts delete mode 100644 src/utils/exit-code.ts delete mode 100644 src/utils/extensions.ts delete mode 100644 src/utils/filepathes.ts delete mode 100644 src/utils/kubernetes-api.ts delete mode 100644 src/utils/logger.ts delete mode 100644 src/utils/rc-file.ts delete mode 100644 src/utils/simple-confirm.ts delete mode 100644 src/utils/spawn.ts delete mode 100644 test/__mocks__/fs.js delete mode 100644 test/commands/apply/apply.spec.ts delete mode 100644 test/commands/base64/base64.decode.spec.ts delete mode 100644 test/commands/base64/base64.encode.spec.ts delete mode 100644 test/commands/cleanup/cleanup.spec.ts delete mode 100644 test/commands/context/context.spec.ts delete mode 100644 test/commands/context/context.utils.kubectx.spec.ts delete mode 100644 test/commands/delete/delete.spec.ts delete mode 100644 test/commands/deploy/deploy.spec.ts delete mode 100644 test/commands/kube-config/kube-config.spec.ts delete mode 100644 test/commands/kubectl/kubectl.install.spec.ts delete mode 100644 test/commands/kubectl/kubectl.list.spec.ts delete mode 100644 test/commands/kubectl/kubectl.refresh.spec.ts delete mode 100644 test/commands/kubectl/kubectl.remove.spec.ts delete mode 100644 test/commands/kubectl/kubectl.use.spec.ts delete mode 100644 test/commands/kubectl/kubectl.utils.kubectl.spec.ts delete mode 100644 test/commands/namespace/namespace.create.spec.ts delete mode 100644 test/commands/namespace/namespace.kube-config.spec.ts delete mode 100644 test/commands/namespace/namespace.spec.ts delete mode 100644 test/commands/namespace/namespace.utils.kubens.spec.ts delete mode 100644 test/commands/prepare/prepare.spec.ts delete mode 100644 test/commands/preview-deploy/__snapshots__/preview-deploy.spec.ts.snap delete mode 100644 test/commands/preview-deploy/preview-deploy.spec.ts delete mode 100644 test/commands/secret/__snapshots__/create.spec.ts.snap delete mode 100644 test/commands/secret/basic-auth.spec.ts delete mode 100644 test/commands/secret/create.spec.ts delete mode 100644 test/commands/secret/secret.docker-registry.create.spec.ts delete mode 100644 test/helpers.ts delete mode 100644 test/setup.ts delete mode 100644 test/utils/env-trim-prefix.spec.ts delete mode 100644 test/utils/envsubst.spec.ts delete mode 100644 test/utils/extensions.spec.ts delete mode 100644 test/utils/logger.spec.ts delete mode 100644 test/utils/rc-file.spec.ts delete mode 100644 tsconfig.json delete mode 100644 tslint.json diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 055cd7f..0000000 --- a/.dockerignore +++ /dev/null @@ -1,11 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* - -# Dependency directory -node_modules - -# Typescript stuff -build -coverage diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 968ff41..0000000 --- a/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -max_line_length = 125 - -[*.md] -trim_trailing_whitespace = false diff --git a/.github/workflows/dotnet-release.yml b/.github/workflows/dotnet-release.yml new file mode 100644 index 0000000..c2f9ced --- /dev/null +++ b/.github/workflows/dotnet-release.yml @@ -0,0 +1,22 @@ +name: .Net Release + +on: [workflow_dispatch] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup .Net + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.100 + - name: Create Executables + run: ./build.sh --target Publish --no-logo + - name: Semantic Release + uses: cycjimmy/semantic-release-action@v2 + with: + extra_plugins: | + @semantic-release/exec + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/dotnet-test.yml b/.github/workflows/dotnet-test.yml new file mode 100644 index 0000000..f4e0b5e --- /dev/null +++ b/.github/workflows/dotnet-test.yml @@ -0,0 +1,24 @@ +name: .Net Testing + +on: + push: + branches: + - '**' + - '!master' + + pull_request: + branches: + - '**' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup .Net + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.100 + - name: Test + run: ./build.sh --target Compile --no-logo diff --git a/.github/workflows/execute-node-tests.yml b/.github/workflows/execute-node-tests.yml deleted file mode 100644 index a788272..0000000 --- a/.github/workflows/execute-node-tests.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Node.js Testing - -on: - push: - branches: - - '*' - - '!master' - - pull_request: - branches: - - '*' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js - uses: actions/setup-node@v1 - with: - node-version: '12.x' - - run: npm ci - - run: npm run test:ci - env: - CI: true diff --git a/.gitignore b/.gitignore index a8dd49b..7afb26c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,29 @@ -# Logs -logs -*.log -npm-debug.log* +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates -# Dependency directory -node_modules +# Ci things +node_modules/ +tools/ +nuget/ +artifacts/ +coverage/ +.tmp/ -# Typescript stuff -build -coverage -out +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ + +# Testing results +coverage.json +coverage.info diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 293f8f0..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,63 +0,0 @@ -stages: - - test - - release - - deploy - -.base: - tags: - - smartive - -test: - extends: .base - stage: test - image: node:12 - script: - - npm ci - - npm run test:ci - coverage: /All files\s*\|\s*([\d\.]+)/ - except: - - tags - -create release: - extends: .base - stage: release - image: node:12 - when: manual - script: - - npm ci - - npm run build - - npx semantic-release - only: - - master - -deploy docker images: - extends: .base - stage: deploy - image: docker:latest - variables: - DOCKER_DRIVER: overlay2 - DOCKER_HOST: tcp://localhost:2375 - DOCKER_BUILDKIT: "1" - services: - - docker:18.09-dind - before_script: - - apk add --no-cache bash - - docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD - script: - - ./docker-build.sh - only: - - tags - -deploy binaries: - extends: .base - stage: deploy - image: node:12 - before_script: - - npm ci - script: - - npm run package - artifacts: - paths: - - out/* - only: - - tags diff --git a/.kubyrc.json b/.kubyrc.json deleted file mode 100644 index 0565d4f..0000000 --- a/.kubyrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "logLevel": "debug" -} diff --git a/.npmignore b/.npmignore deleted file mode 100644 index df48b8b..0000000 --- a/.npmignore +++ /dev/null @@ -1,27 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* - -# Dependency directory -node_modules - -# Typescript stuff -coverage/ -config/ -tsconfig.json -tslint.json - -# Typescript files (but not the definitions) -src/ - -# Testfiles -jest.json -test/ - -# Package -out/ -Dockerfile - -# Dotfiles -.* diff --git a/.nuke b/.nuke new file mode 100755 index 0000000..b2f1080 --- /dev/null +++ b/.nuke @@ -0,0 +1 @@ +Kuby.sln \ No newline at end of file diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 48082f7..0000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/.releaserc.json b/.releaserc.json new file mode 100644 index 0000000..76d6cc7 --- /dev/null +++ b/.releaserc.json @@ -0,0 +1,40 @@ +{ + "verifyConditions": [ + "@semantic-release/github" + ], + "addChannel": [ + "@semantic-release/github" + ], + "prepare": [ + [ + "@semantic-release/exec", + { + "prepareCmd": "./build.sh --no-logo --version ${nextRelease.version} --target Publish" + } + ] + ], + "publish": [ + [ + "@semantic-release/github", + { + "assets": [ + { + "path": "artifacts/linux-x64/kuby", + "name": "kuby-linux-x64", + "label": "Kuby for linux x64 (${nextRelease.gitTag})" + }, + { + "path": "artifacts/osx-x64/kuby", + "name": "kuby-osx-x64", + "label": "Kuby for macOS / OSX x64 (${nextRelease.gitTag})" + }, + { + "path": "artifacts/win-x64/kuby.exe", + "name": "kuby-win-x64.exe", + "label": "Kuby for windows x64 (${nextRelease.gitTag})" + } + ] + } + ] + ] +} diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 22d972f..0000000 --- a/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -FROM node:12-alpine as build - -WORKDIR /app - -COPY ./package.json ./ -COPY ./package-lock.json ./ - -RUN npm ci - -COPY ./config ./config -COPY ./src ./src - -RUN npm run build -RUN npx pkg -t node12-alpine-x64 -o out/kuby . - -FROM alpine:3.7 as kuby-releases - -WORKDIR /root - -ARG BUILD_DEPS="gettext" -ARG RUNTIME_DEPS="libintl libstdc++" - -COPY --from=build /app/out/kuby /usr/local/bin/ - -RUN set -x && \ - apk add --update $RUNTIME_DEPS && \ - apk add --virtual build_deps $BUILD_DEPS && \ - apk add --no-cache curl ca-certificates git - -RUN kuby kubectl refresh - -FROM kuby-releases - -ARG KUBECTL_VERSION="1" - -RUN kuby kubectl install -n ${KUBECTL_VERSION} diff --git a/Kuby.sln b/Kuby.sln new file mode 100755 index 0000000..de8fed8 --- /dev/null +++ b/Kuby.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5F749BCF-7099-4989-8C5D-B42A288A9401}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Kuby", "src\Kuby\Kuby.fsproj", "{7D166352-7A64-4F57-8FF0-1010443F3A90}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_build", "build\_build.csproj", "{6096BE1B-F368-4338-AD7D-1C6098BF41AF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F4315FC3-2F26-41B4-92A6-DFECBB23C345}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6096BE1B-F368-4338-AD7D-1C6098BF41AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6096BE1B-F368-4338-AD7D-1C6098BF41AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D166352-7A64-4F57-8FF0-1010443F3A90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D166352-7A64-4F57-8FF0-1010443F3A90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D166352-7A64-4F57-8FF0-1010443F3A90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D166352-7A64-4F57-8FF0-1010443F3A90}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {7D166352-7A64-4F57-8FF0-1010443F3A90} = {5F749BCF-7099-4989-8C5D-B42A288A9401} + {6096BE1B-F368-4338-AD7D-1C6098BF41AF} = {F4315FC3-2F26-41B4-92A6-DFECBB23C345} + EndGlobalSection +EndGlobal diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 6d5b35a..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 smartive AG - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md index 3315728..d469524 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # kubernetes-helpers [kuby] -This is a command line helper for kubernetes (`kubectl`). +This is a command line helper for kubernetes. It does provide some helping commands and eases up deployments. ### Install @@ -21,33 +21,3 @@ with the `package` npm script. Please read the usage help to get along with the tool :) Each command can be inspected by adding `--help` to the command. - -### Configuration - -All global settings and flags (like `context` and `namespace`) can -be configured via a `.kubyrc` or `.kubyrc.json` file. Please ensure, it is a valid -json. - -Example: - -```json -{ - "context": "my-kubernetes-ctx", - "namespace": "kube-system" -} -``` - -This rc file can ensure, that you only execute certain commands in a certain context. - -### Security - -All information that are saved locally (if the user decides to do so) are stored in the -users `.kube` folder. The information is encrypted with the `aes-256-cbc` algorithm and the -unique machine key. They cannot be moved and are useless -on another machine (even a new installation). - -### Development - -- `check out source` -- `npm install` -- `npm run develop` diff --git a/build.cmd b/build.cmd new file mode 100755 index 0000000..4a72f9b --- /dev/null +++ b/build.cmd @@ -0,0 +1,7 @@ +:; set -eo pipefail +:; SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) +:; ${SCRIPT_DIR}/build.sh "$@" +:; exit $? + +@ECHO OFF +powershell -ExecutionPolicy ByPass -NoProfile %0\..\build.ps1 %* diff --git a/build.ps1 b/build.ps1 new file mode 100755 index 0000000..e5c8a44 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,69 @@ +[CmdletBinding()] +Param( + [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] + [string[]]$BuildArguments +) + +Write-Output "PowerShell $($PSVersionTable.PSEdition) version $($PSVersionTable.PSVersion)" + +Set-StrictMode -Version 2.0; $ErrorActionPreference = "Stop"; $ConfirmPreference = "None"; trap { Write-Error $_ -ErrorAction Continue; exit 1 } +$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent + +########################################################################### +# CONFIGURATION +########################################################################### + +$BuildProjectFile = "$PSScriptRoot\build\_build.csproj" +$TempDirectory = "$PSScriptRoot\\.tmp" + +$DotNetGlobalFile = "$PSScriptRoot\\global.json" +$DotNetInstallUrl = "https://dot.net/v1/dotnet-install.ps1" +$DotNetChannel = "Current" + +$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1 +$env:DOTNET_CLI_TELEMETRY_OPTOUT = 1 +$env:DOTNET_MULTILEVEL_LOOKUP = 0 + +########################################################################### +# EXECUTION +########################################################################### + +function ExecSafe([scriptblock] $cmd) { + & $cmd + if ($LASTEXITCODE) { exit $LASTEXITCODE } +} + +# If dotnet CLI is installed globally and it matches requested version, use for execution +if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue) -and ` + $(dotnet --version) -and $LASTEXITCODE -eq 0) { + $env:DOTNET_EXE = (Get-Command "dotnet").Path +} +else { + # Download install script + $DotNetInstallFile = "$TempDirectory\dotnet-install.ps1" + New-Item -ItemType Directory -Path $TempDirectory -Force | Out-Null + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + (New-Object System.Net.WebClient).DownloadFile($DotNetInstallUrl, $DotNetInstallFile) + + # If global.json exists, load expected version + if (Test-Path $DotNetGlobalFile) { + $DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json) + if ($DotNetGlobal.PSObject.Properties["sdk"] -and $DotNetGlobal.sdk.PSObject.Properties["version"]) { + $DotNetVersion = $DotNetGlobal.sdk.version + } + } + + # Install by channel or version + $DotNetDirectory = "$TempDirectory\dotnet-win" + if (!(Test-Path variable:DotNetVersion)) { + ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath } + } else { + ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath } + } + $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe" +} + +Write-Output "Microsoft (R) .NET Core SDK version $(& $env:DOTNET_EXE --version)" + +ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet } +ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments } diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..3d52643 --- /dev/null +++ b/build.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +bash --version 2>&1 | head -n 1 + +set -eo pipefail +SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) + +########################################################################### +# CONFIGURATION +########################################################################### + +BUILD_PROJECT_FILE="$SCRIPT_DIR/build/_build.csproj" +TEMP_DIRECTORY="$SCRIPT_DIR//.tmp" + +DOTNET_GLOBAL_FILE="$SCRIPT_DIR//global.json" +DOTNET_INSTALL_URL="https://dot.net/v1/dotnet-install.sh" +DOTNET_CHANNEL="Current" + +export DOTNET_CLI_TELEMETRY_OPTOUT=1 +export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 +export DOTNET_MULTILEVEL_LOOKUP=0 + +########################################################################### +# EXECUTION +########################################################################### + +function FirstJsonValue { + perl -nle 'print $1 if m{"'"$1"'": "([^"]+)",?}' <<< "${@:2}" +} + +# If dotnet CLI is installed globally and it matches requested version, use for execution +if [ -x "$(command -v dotnet)" ] && dotnet --version &>/dev/null; then + export DOTNET_EXE="$(command -v dotnet)" +else + # Download install script + DOTNET_INSTALL_FILE="$TEMP_DIRECTORY/dotnet-install.sh" + mkdir -p "$TEMP_DIRECTORY" + curl -Lsfo "$DOTNET_INSTALL_FILE" "$DOTNET_INSTALL_URL" + chmod +x "$DOTNET_INSTALL_FILE" + + # If global.json exists, load expected version + if [[ -f "$DOTNET_GLOBAL_FILE" ]]; then + DOTNET_VERSION=$(FirstJsonValue "version" "$(cat "$DOTNET_GLOBAL_FILE")") + if [[ "$DOTNET_VERSION" == "" ]]; then + unset DOTNET_VERSION + fi + fi + + # Install by channel or version + DOTNET_DIRECTORY="$TEMP_DIRECTORY/dotnet-unix" + if [[ -z ${DOTNET_VERSION+x} ]]; then + "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --channel "$DOTNET_CHANNEL" --no-path + else + "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --version "$DOTNET_VERSION" --no-path + fi + export DOTNET_EXE="$DOTNET_DIRECTORY/dotnet" +fi + +echo "Microsoft (R) .NET Core SDK version $("$DOTNET_EXE" --version)" + +"$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet +"$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" --no-build -- "$@" diff --git a/build/.editorconfig b/build/.editorconfig new file mode 100755 index 0000000..31e43dc --- /dev/null +++ b/build/.editorconfig @@ -0,0 +1,11 @@ +[*.cs] +dotnet_style_qualification_for_field = false:warning +dotnet_style_qualification_for_property = false:warning +dotnet_style_qualification_for_method = false:warning +dotnet_style_qualification_for_event = false:warning +dotnet_style_require_accessibility_modifiers = never:warning + +csharp_style_expression_bodied_methods = true:silent +csharp_style_expression_bodied_properties = true:warning +csharp_style_expression_bodied_indexers = true:warning +csharp_style_expression_bodied_accessors = true:warning diff --git a/build/Build.cs b/build/Build.cs new file mode 100755 index 0000000..dfa674d --- /dev/null +++ b/build/Build.cs @@ -0,0 +1,90 @@ +using System.Collections.Generic; +using JetBrains.Annotations; +using Nuke.Common; +using Nuke.Common.CI; +using Nuke.Common.Execution; +using Nuke.Common.IO; +using Nuke.Common.ProjectModel; +using Nuke.Common.Tooling; +using Nuke.Common.Tools.DotNet; +using Nuke.Common.Utilities.Collections; +using static Nuke.Common.IO.FileSystemTasks; +using static Nuke.Common.Tools.DotNet.DotNetTasks; + +[CheckBuildProjectConfigurations] +[ShutdownDotNetAfterServerBuild] +class Build : NukeBuild +{ + public static int Main() => Execute(x => x.Compile); + + [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")] + readonly Configuration Configuration = IsLocalBuild ? Configuration.Debug : Configuration.Release; + + [Parameter("Version number that is built.")] readonly string Version = "0.0.0"; + + [Parameter("Single Runtime that should be built.")] [CanBeNull] readonly string Runtime; + + [Solution] readonly Solution Solution; + + AbsolutePath SourceDirectory => RootDirectory / "src"; + AbsolutePath TestsDirectory => RootDirectory / "tests"; + AbsolutePath ArtifactsDirectory => RootDirectory / "artifacts"; + + IEnumerable Runtimes = new[] {"linux-x64", "osx-x64", "win-x64"}; + + Target Clean => _ => _ + .Before(Restore) + .Executes(() => + { + SourceDirectory.GlobDirectories("**/bin", "**/obj").ForEach(DeleteDirectory); + TestsDirectory.GlobDirectories("**/bin", "**/obj").ForEach(DeleteDirectory); + EnsureCleanDirectory(ArtifactsDirectory); + }); + + Target Restore => _ => _ + .Executes(() => DotNetRestore(s => s.SetProjectFile(Solution))); + + Target Compile => _ => _ + .DependsOn(Restore) + .Executes(() => DotNetBuild(s => s + .SetProjectFile(Solution) + .SetConfiguration(Configuration) + .EnableNoRestore())); + + Target Publish => _ => _ + .DependsOn(Clean) + .Executes(() => DotNetPublish(s => s + .SetProject(Solution) + .SetConfiguration(Configuration) + .SetVersion(Version) + .SetAssemblyVersion(Version) + .SetFileVersion(Version) + .SetInformationalVersion(Version) + .AddProperty("SelfContained", true) + .AddProperty("PublishSingleFile", true) + .AddProperty("IncludeNativeLibrariesForSelfExtract", true) + .AddProperty("PublishTrimmed", Equals(Configuration, Configuration.Release)) + .CombineWith( + Runtimes, + (settings, runtime) => settings + .SetRuntime(runtime) + .SetOutput(ArtifactsDirectory / runtime)))); + + Target PublishSingle => _ => _ + .DependsOn(Clean) + .Requires(() => !string.IsNullOrWhiteSpace(Runtime)) + .Executes(() => DotNetPublish(s => s + .SetProject(Solution) + .SetConfiguration(Configuration) + .SetVersion(Version) + .SetAssemblyVersion(Version) + .SetFileVersion(Version) + .SetInformationalVersion(Version) + .AddProperty("SelfContained", true) + .AddProperty("IncludeNativeLibrariesForSelfExtract", true) + .AddProperty("PublishSingleFile", true) + .AddProperty("PublishTrimmed", Equals(Configuration, Configuration.Release)) + .SetRuntime(Runtime) + .SetOutput(ArtifactsDirectory / Runtime) + )); +} diff --git a/build/Configuration.cs b/build/Configuration.cs new file mode 100755 index 0000000..9c08b1a --- /dev/null +++ b/build/Configuration.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel; +using System.Linq; +using Nuke.Common.Tooling; + +[TypeConverter(typeof(TypeConverter))] +public class Configuration : Enumeration +{ + public static Configuration Debug = new Configuration { Value = nameof(Debug) }; + public static Configuration Release = new Configuration { Value = nameof(Release) }; + + public static implicit operator string(Configuration configuration) + { + return configuration.Value; + } +} diff --git a/build/_build.csproj b/build/_build.csproj new file mode 100755 index 0000000..30cdea6 --- /dev/null +++ b/build/_build.csproj @@ -0,0 +1,28 @@ + + + + Exe + net5.0 + + CS0649;CS0169 + .. + .. + + + + + + + + + ci\dotnet-release.yml + + + + + + config\.releaserc.json + + + + diff --git a/build/_build.csproj.DotSettings b/build/_build.csproj.DotSettings new file mode 100755 index 0000000..7bc2848 --- /dev/null +++ b/build/_build.csproj.DotSettings @@ -0,0 +1,27 @@ + + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + Implicit + Implicit + ExpressionBody + 0 + NEXT_LINE + True + False + 120 + IF_OWNER_IS_SINGLE_LINE + WRAP_IF_LONG + False + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + True + True + True + True + True + True + True + True + True diff --git a/config/tsconfig.base.json b/config/tsconfig.base.json deleted file mode 100644 index 9d74d08..0000000 --- a/config/tsconfig.base.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "es2018", - "module": "commonjs", - "moduleResolution": "node", - "removeComments": true, - "outDir": "../build", - "rootDir": "../src", - "declaration": false, - "sourceMap": false, - "importHelpers": true, - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "lib": ["es2018"], - "skipLibCheck": true - }, - "include": ["../src/**/*.ts"], - "exclude": [] -} diff --git a/config/tsconfig.build.json b/config/tsconfig.build.json deleted file mode 100644 index 8685ec0..0000000 --- a/config/tsconfig.build.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "outDir": "../build" - }, - "include": ["../src/**/*.ts"] -} diff --git a/docker-build.sh b/docker-build.sh deleted file mode 100755 index c0283c7..0000000 --- a/docker-build.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -set -e - -echo "Create and deploy the various versions for kuby docker image" - -kubectl_versions=("1" "1.14" "1.15" "1.13" "1.12" "1.11" "1.10" "1.9" "1.8") -image="smartive/kuby" - -echo "Build latest docker image" -docker build --build-arg KUBECTL_VERSION="1" -t $image:latest . -docker push $image:latest - -for version in ${kubectl_versions[@]}; do - echo "Build docker image with kubectl version v$version" - - version_tag="kubectl-v$version-kuby-$CI_COMMIT_TAG" - latest_tag="kubectl-v$version-kuby-latest" - - echo "Use tag: $version_tag" - echo "And latest tag: $latest_tag" - - docker build --build-arg KUBECTL_VERSION=$version -t $image:$version_tag . - docker tag $image:$version_tag $image:$latest_tag - docker push $image:$version_tag - docker push $image:$latest_tag - -done diff --git a/jest.json b/jest.json deleted file mode 100644 index 9188f1a..0000000 --- a/jest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "preset": "ts-jest", - "setupFiles": ["/test/setup.ts"], - "testMatch": ["**/test/**/*.spec.ts"], - "roots": ["", "/test"], - "collectCoverageFrom": ["/src/**/*.ts"] -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 452c8dc..0000000 --- a/package-lock.json +++ /dev/null @@ -1,13292 +0,0 @@ -{ - "name": "@smartive/kuby", - "version": "0.0.0-development", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", - "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", - "dev": true, - "requires": { - "@babel/types": "^7.10.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", - "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", - "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.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.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" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "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" - } - } - } - }, - "@babel/parser": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/runtime": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", - "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", - "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@fimbul/bifrost": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.21.0.tgz", - "integrity": "sha512-ou8VU+nTmOW1jeg+FT+sn+an/M0Xb9G16RucrfhjXGWv1Q97kCoM5CG9Qj7GYOSdu7km72k7nY83Eyr53Bkakg==", - "dev": true, - "requires": { - "@fimbul/ymir": "^0.21.0", - "get-caller-file": "^2.0.0", - "tslib": "^1.8.1", - "tsutils": "^3.5.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } - } - }, - "@fimbul/ymir": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.21.0.tgz", - "integrity": "sha512-T/y7WqPsm4n3zhT08EpB5sfdm2Kvw3gurAxr2Lr5dQeLi8ZsMlNT/Jby+ZmuuAAd1PnXYzKp+2SXgIkQIIMCUg==", - "dev": true, - "requires": { - "inversify": "^5.0.0", - "reflect-metadata": "^0.1.12", - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jest/console": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", - "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "jest-message-util": "^26.1.0", - "jest-util": "^26.1.0", - "slash": "^3.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.1.0.tgz", - "integrity": "sha512-zyizYmDJOOVke4OO/De//aiv8b07OwZzL2cfsvWF3q9YssfpcKfcnZAwDY8f+A76xXSMMYe8i/f/LPocLlByfw==", - "dev": true, - "requires": { - "@jest/console": "^26.1.0", - "@jest/reporters": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.1.0", - "jest-config": "^26.1.0", - "jest-haste-map": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.1.0", - "jest-resolve-dependencies": "^26.1.0", - "jest-runner": "^26.1.0", - "jest-runtime": "^26.1.0", - "jest-snapshot": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", - "jest-watcher": "^26.1.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.1.0.tgz", - "integrity": "sha512-86+DNcGongbX7ai/KE/S3/NcUVZfrwvFzOOWX/W+OOTvTds7j07LtC+MgGydH5c8Ri3uIrvdmVgd1xFD5zt/xA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/fake-timers": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.1.0.tgz", - "integrity": "sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "@sinonjs/fake-timers": "^6.0.1", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/globals": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.1.0.tgz", - "integrity": "sha512-MKiHPNaT+ZoG85oMaYUmGHEqu98y3WO2yeIDJrs2sJqHhYOy3Z6F7F/luzFomRQ8SQ1wEkmahFAz2291Iv8EAw==", - "dev": true, - "requires": { - "@jest/environment": "^26.1.0", - "@jest/types": "^26.1.0", - "expect": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.1.0.tgz", - "integrity": "sha512-SVAysur9FOIojJbF4wLP0TybmqwDkdnFxHSPzHMMIYyBtldCW9gG+Q5xWjpMFyErDiwlRuPyMSJSU64A67Pazg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.1.0", - "jest-resolve": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", - "node-notifier": "^7.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.1.0.tgz", - "integrity": "sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", - "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", - "dev": true, - "requires": { - "@jest/console": "^26.1.0", - "@jest/types": "^26.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/test-sequencer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.1.0.tgz", - "integrity": "sha512-Z/hcK+rTq56E6sBwMoQhSRDVjqrGtj1y14e2bIgcowARaIE1SgOanwx6gvY4Q9gTKMoZQXbXvptji+q5GYxa6Q==", - "dev": true, - "requires": { - "@jest/test-result": "^26.1.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.1.0", - "jest-runner": "^26.1.0", - "jest-runtime": "^26.1.0" - } - }, - "@jest/transform": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.1.0.tgz", - "integrity": "sha512-ICPm6sUXmZJieq45ix28k0s+d/z2E8CHDsq+WwtWI6kW8m7I8kPqarSEcUN86entHQ570ZBRci5OWaKL0wlAWw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@kubernetes/client-node": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.10.3.tgz", - "integrity": "sha512-mw+1zdKfMW4QN2ns82SKFhAvqC4SVUAiItto4oFg3Me+a510h3h9N5O7ad6m4efAmlQBlMc6Y5FHz70dAwuiMg==", - "requires": { - "@types/js-yaml": "^3.12.1", - "@types/node": "^10.12.0", - "@types/request": "^2.47.1", - "@types/underscore": "^1.8.9", - "@types/ws": "^6.0.1", - "byline": "^5.0.0", - "execa": "1.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^3.13.1", - "jsonpath-plus": "^0.19.0", - "openid-client": "2.5.0", - "request": "^2.88.0", - "shelljs": "^0.8.2", - "tslib": "^1.9.3", - "underscore": "^1.9.1", - "ws": "^6.1.0" - }, - "dependencies": { - "@types/node": { - "version": "10.17.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", - "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==" - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.3.tgz", - "integrity": "sha512-fdGoOQ3kQJh+hrilc0Plg50xSfaCKOeYN9t6dpJKXN9BxhhfquL0OzoQXg3spLYymL5rm29uPeI3KEXRaZQ9zg==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.0" - } - }, - "@octokit/core": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.2.1.tgz", - "integrity": "sha512-XfFSDDwv6tclUenS0EmB6iA7u+4aOHBT1Lz4PtQNQQg3hBbNaR/+Uv5URU+egeIuuGAiMRiDyY92G4GBOWOqDA==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/graphql": "^4.3.1", - "@octokit/request": "^5.4.0", - "@octokit/types": "^5.0.0", - "before-after-hook": "^2.1.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.9.tgz", - "integrity": "sha512-3VPLbcCuqji4IFTclNUtGdp9v7g+nspWdiCUbK3+iPMjJCZ6LEhn1ts626bWLOn0GiDb6j+uqGvPpqLnY7pBgw==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - } - } - }, - "@octokit/graphql": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.7.tgz", - "integrity": "sha512-Gk0AR+DcwIK/lK/GX+OQ99UqtenQhcbrhHHfOYlrCQe17ADnX3EKAOKRsAZ9qZvpi5MuwWm/Nm+9aO2kTDSdyA==", - "dev": true, - "requires": { - "@octokit/request": "^5.3.0", - "@octokit/types": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/plugin-paginate-rest": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.6.0.tgz", - "integrity": "sha512-o+O8c1PqsC5++BHXfMZabRRsBIVb34tXPWyQLyp2IXq5MmkxdipS7TXM4Y9ldL1PzY9CTrCsn/lzFFJGM3oRRA==", - "dev": true, - "requires": { - "@octokit/types": "^5.5.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz", - "integrity": "sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg==", - "dev": true - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.2.1.tgz", - "integrity": "sha512-QyFr4Bv807Pt1DXZOC5a7L5aFdrwz71UHTYoHVajYV5hsqffWm8FUl9+O7nxRu5PDMtB/IKrhFqTmdBTK5cx+A==", - "dev": true, - "requires": { - "@octokit/types": "^5.5.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.10.tgz", - "integrity": "sha512-egA49HkqEORVGDZGav1mh+VD+7uLgOxtn5oODj6guJk0HCy+YBSYapFkSLFgeYj3Fr18ZULKGURkjyhkAChylw==", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^5.0.0", - "deprecation": "^2.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "once": "^1.4.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - } - } - }, - "@octokit/request-error": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.3.tgz", - "integrity": "sha512-GgD5z8Btm301i2zfvJLk/mkhvGCdjQ7wT8xF9ov5noQY8WbKZDH9cOBqXzoeKd1mLr1xH2FwbtGso135zGBgTA==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.1", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.0.9.tgz", - "integrity": "sha512-CC5+cIx974Ygx9lQNfUn7/oXDQ9kqGiKUC6j1A9bAVZZ7aoTF8K6yxu0pQhQrLBwSl92J6Z3iVDhGhGFgISCZg==", - "dev": true, - "requires": { - "@octokit/core": "^3.0.0", - "@octokit/plugin-paginate-rest": "^2.2.0", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "4.2.1" - } - }, - "@octokit/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", - "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - }, - "@semantic-release/commit-analyzer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz", - "integrity": "sha512-5bJma/oB7B4MtwUkZC2Bf7O1MHfi4gWe4mA+MIQ3lsEV0b422Bvl1z5HRpplDnMLHH3EXMoRdEng6Ds5wUqA3A==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.7", - "debug": "^4.0.0", - "import-from": "^3.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - } - }, - "@semantic-release/error": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", - "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", - "dev": true - }, - "@semantic-release/github": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.2.0.tgz", - "integrity": "sha512-tMRnWiiWb43whRHvbDGXq4DGEbKRi56glDpXDJZit4PIiwDPX7Kx3QzmwRtDOcG+8lcpGjpdPabYZ9NBxoI2mw==", - "dev": true, - "requires": { - "@octokit/rest": "^18.0.0", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^9.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^2.4.3", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - }, - "dependencies": { - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - } - } - }, - "@semantic-release/gitlab": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-6.0.4.tgz", - "integrity": "sha512-osEXfW8p1G6dhD//5s0DccfjyST/VETSIIndR/WKuDNFU5uv1NKJ/3TJhdXqioqZQe9oo4T9EkKkx+7+Yptzxg==", - "dev": true, - "requires": { - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "escape-string-regexp": "^3.0.0", - "form-data": "^3.0.0", - "fs-extra": "^9.0.0", - "globby": "^11.0.0", - "got": "^10.5.2", - "lodash": "^4.17.11", - "parse-path": "^4.0.0", - "url-join": "^4.0.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", - "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", - "dev": true - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "cacheable-lookup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", - "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", - "dev": true, - "requires": { - "@types/keyv": "^3.1.1", - "keyv": "^4.0.0" - } - }, - "cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^2.0.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "decompress-response": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", - "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-3.0.0.tgz", - "integrity": "sha512-11dXIUC3umvzEViLP117d0KN6LJzZxh5+9F4E/7WLAAw7GrHk8NpUR+g9iJi/pe9C0py4F8rs0hreyRCwlAuZg==", - "dev": true - }, - "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", - "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", - "dev": true, - "requires": { - "@sindresorhus/is": "^2.0.0", - "@szmarczak/http-timer": "^4.0.0", - "@types/cacheable-request": "^6.0.1", - "cacheable-lookup": "^2.0.0", - "cacheable-request": "^7.0.1", - "decompress-response": "^5.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^5.0.0", - "lowercase-keys": "^2.0.0", - "mimic-response": "^2.1.0", - "p-cancelable": "^2.0.0", - "p-event": "^4.0.0", - "responselike": "^2.0.0", - "to-readable-stream": "^2.0.0", - "type-fest": "^0.10.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "keyv": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.1.tgz", - "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - }, - "p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", - "dev": true - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "type-fest": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", - "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", - "dev": true - } - } - }, - "@semantic-release/npm": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.5.tgz", - "integrity": "sha512-D+oEmsx9aHE1q806NFQwSC9KdBO8ri/VO99eEz0wWbX2jyLqVyWr7t0IjKC8aSnkkQswg/4KN/ZjfF6iz1XOpw==", - "dev": true, - "requires": { - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "execa": "^4.0.0", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^5.0.0", - "npm": "^6.10.3", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^4.0.0", - "semver": "^7.1.2", - "tempy": "^0.5.0" - }, - "dependencies": { - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "normalize-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.0.0.tgz", - "integrity": "sha512-bAEm2fx8Dq/a35Z6PIRkkBBJvR56BbEJvhpNtvCZ4W9FyORSna77fn+xtYFjqk5JpBS+fMnAOG/wFgkQBmB7hw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@semantic-release/release-notes-generator": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.1.tgz", - "integrity": "sha512-bOoTiH6SiiR0x2uywSNR7uZcRDl22IpZhj+Q5Bn0v+98MFtOMhCxFhbrKQjhbYoZw7vps1mvMRmFkp/g6R9cvQ==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^4.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "debug": "^4.0.0", - "get-stream": "^5.0.0", - "import-from": "^3.0.0", - "into-stream": "^5.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "into-stream": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", - "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - } - } - }, - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" - }, - "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@smartive/tslint-config": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@smartive/tslint-config/-/tslint-config-7.0.1.tgz", - "integrity": "sha512-BT+6nPY0USUjBqUufjS4jZ983C8jCpvi/VMmymT/S6BMMq1J9Mh8V8rqcIWwgTrFzaRO4vJmynTOeH8t0SXSUA==", - "dev": true, - "requires": { - "tslint-config-airbnb": "~5.11.1", - "tslint-react": "^3.6.0" - } - }, - "@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", - "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" - }, - "@types/inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==", - "dev": true, - "requires": { - "@types/through": "*", - "rxjs": "^6.4.0" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.5.tgz", - "integrity": "sha512-heU+7w8snfwfjtcj2H458aTx3m5unIToOJhx75ebHilBiiQ39OIdA18WkG4LP08YKeAoWAGvWg8s+22w/PeJ6w==", - "dev": true, - "requires": { - "jest-diff": "^25.2.1", - "pretty-format": "^25.2.1" - } - }, - "@types/js-yaml": { - "version": "3.12.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.5.tgz", - "integrity": "sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww==" - }, - "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "requires": { - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", - "dev": true - }, - "@types/node": { - "version": "12.12.50", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.50.tgz", - "integrity": "sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w==" - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prettier": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.2.tgz", - "integrity": "sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA==", - "dev": true - }, - "@types/request": { - "version": "2.48.5", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", - "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/semver": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.1.tgz", - "integrity": "sha512-ooD/FJ8EuwlDKOI6D9HWxgIgJjMg2cuziXm/42npDC8y4NjxplBUn9loewZiBNCt44450lHAU0OSb51/UqXeag==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==" - }, - "@types/underscore": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.11.tgz", - "integrity": "sha512-BXMlP0qTcdR9I8cATvOwocEHbNOkMiWKO0qJAxl0ijRpuGmfZ6Et3AkudPcgjg4OTWk4Z+XcNR1RZRiAkG27gQ==" - }, - "@types/ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true - }, - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", - "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", - "requires": { - "clean-stack": "^1.0.0", - "indent-string": "^3.0.0" - } - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "apache-md5": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.5.tgz", - "integrity": "sha512-sbLEIMQrkV7RkIruqTPXxeCMkAAycv4yzTkBzRgOR1BrR5UB7qZtupqxkersTJSf0HZ3sbaNRrNV80TnnM7cUw==" - }, - "arch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", - "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" - }, - "babel-jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.1.0.tgz", - "integrity": "sha512-Nkqgtfe7j6PxLO6TnCQQlkMm8wdTdnIF8xrdpooHCuD5hXRzVEPbPneTJKknH5Dsv3L8ip9unHDAp48YQ54Dkg==", - "dev": true, - "requires": { - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.1.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.1.0.tgz", - "integrity": "sha512-qhqLVkkSlqmC83bdMhM8WW4Z9tB+JkjqAqlbbohS9sJLT5Ha2vfzuKqg5yenXrAjOPG2YC0WiXdH3a9PvB+YYw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.1.0.tgz", - "integrity": "sha512-na9qCqFksknlEj5iSdw1ehMVR06LCCTkZLGKeEtxDDdhg8xpUF09m29Kvh1pRbZ07h7AQ5ttLYUwpXL4tO6w7w==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.1.0", - "babel-preset-current-node-syntax": "^0.1.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "before-after-hook": { - "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 - }, - "bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-lookup": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz", - "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==" - }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - } - } - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-stack": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", - "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", - "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==" - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "conventional-changelog-angular": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", - "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-writer": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.18.tgz", - "integrity": "sha512-mAQDCKyB9HsE8Ko5cCM1Jn1AWxXPYV0v8dFPabZRkvsiWUul2YyAqbIaoMKF88Zf2ffnOPSvKhboLf3fnjo5/A==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "meow": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", - "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", - "dev": true, - "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", - "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^2.0.0", - "through2": "^4.0.0", - "trim-off-newlines": "^1.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "meow": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", - "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", - "dev": true, - "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", - "validate-npm-package-license": "^3.0.1" - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "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" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decimal.js": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", - "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", - "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - } - } - }, - "del-cli": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-3.0.1.tgz", - "integrity": "sha512-BLHItGr82rUbHhjMu41d+vw9Md49i81jmZSV00HdTq4t+RTHywmEht/23mNFpUl2YeLYJZJyGz4rdlMAyOxNeg==", - "dev": true, - "requires": { - "del": "^5.1.0", - "meow": "^6.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", - "dev": true, - "requires": { - "esutils": "^1.1.6", - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "env-ci": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.0.2.tgz", - "integrity": "sha512-Xc41mKvjouTXD3Oy9AqySz1IeyvJvHZ20Twf5ZLYbNpPPIuCnL/qHCmNlD01LoNy0JTunw9HPYVptD19Ac7Mbw==", - "dev": true, - "requires": { - "execa": "^4.0.0", - "java-properties": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", - "dev": true - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "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", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, - "expect": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.1.0.tgz", - "integrity": "sha512-QbH4LZXDsno9AACrN9eM0zfnby9G+OsdNgZUohjg/P0mLy1O+/bzTAJGT6VSIjVCe8yKM6SzEl/ckEOFBT7Vnw==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.0.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-regex-util": "^26.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "figlet": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.0.tgz", - "integrity": "sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", - "dev": true, - "requires": { - "semver-regex": "^2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "fs-monkey": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.1.tgz", - "integrity": "sha512-fcSa+wyTqZa46iWweI7/ZiUfegOZl0SG8+dltIwFXo7+zYU9J9kpS3NB6pZcSlJdhvIwp81Adx2XhZorncxiaA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "fuzzy": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", - "integrity": "sha1-THbsL/CsGjap3M+aAN+GIweNTtg=" - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", - "dev": true, - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "got": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/got/-/got-11.5.1.tgz", - "integrity": "sha512-reQEZcEBMTGnujmQ+Wm97mJs/OK6INtO6HmLI+xt3+9CvnRwWjXutUvb2mqr+Ao4Lu05Rx6+udx9sOQAmExMxA==", - "requires": { - "@sindresorhus/is": "^3.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.0", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.0.0.tgz", - "integrity": "sha512-kqA5I6Yun7PBHk8WN9BBP1c7FfN2SrD05GuVSEYPqDb4nerv7HqYfgBfMIKmT/EuejURkJKLZuLyGKGs6WEG9w==" - }, - "cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^2.0.0" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "keyv": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.1.tgz", - "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" - }, - "p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http2-wrapper": { - "version": "1.0.0-beta.5.2", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz", - "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "import-fresh": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", - "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.2.tgz", - "integrity": "sha512-DF4osh1FM6l0RJc5YWYhSDB6TawiBRlbV9Cox8MWlidU218Tb7fm3lQTULyUJDfJ0tjbzl0W4q651mrCCEM55w==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.16", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "inquirer-autocomplete-prompt": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.0.2.tgz", - "integrity": "sha512-vNmAhhrOQwPnUm4B9kz1UB7P98rVF1z8txnjp53r40N0PBCuqoRWqjg3Tl0yz0UkDg7rEUtZ2OZpNc7jnOU9Zw==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "figures": "^2.0.0", - "run-async": "^2.3.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "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==", - "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==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } - }, - "inversify": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", - "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-ssh": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", - "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", - "dev": true, - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - } - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "java-properties": { - "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 - }, - "jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.1.0.tgz", - "integrity": "sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw==", - "dev": true, - "requires": { - "@jest/core": "^26.1.0", - "import-local": "^3.0.2", - "jest-cli": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "jest-cli": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.1.0.tgz", - "integrity": "sha512-Imumvjgi3rU7stq6SJ1JUEMaV5aAgJYXIs0jPqdUnF47N/Tk83EXfmtvNKQ+SnFVI6t6mDOvfM3aA9Sg6kQPSw==", - "dev": true, - "requires": { - "@jest/core": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", - "prompts": "^2.0.1", - "yargs": "^15.3.1" - } - } - } - }, - "jest-changed-files": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.1.0.tgz", - "integrity": "sha512-HS5MIJp3B8t0NRKGMCZkcDUZo36mVRvrDETl81aqljT1S9tqiHRSpyoOvWg9ZilzZG9TDisDNaN1IXm54fLRZw==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.1.0.tgz", - "integrity": "sha512-ONTGeoMbAwGCdq4WuKkMcdMoyfs5CLzHEkzFOlVvcDXufZSaIWh/OXMLa2fwKXiOaFcqEw8qFr4VOKJQfn4CVw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.1.0", - "@jest/types": "^26.1.0", - "babel-jest": "^26.1.0", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.1.0", - "jest-environment-node": "^26.1.0", - "jest-get-type": "^26.0.0", - "jest-jasmine2": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", - "micromatch": "^4.0.2", - "pretty-format": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - }, - "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - } - } - }, - "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.1.0.tgz", - "integrity": "sha512-lYiSo4Igr81q6QRsVQq9LIkJW0hZcKxkIkHzNeTMPENYYDw/W/Raq28iJ0sLlNFYz2qxxeLnc5K2gQoFYlu2bA==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", - "jest-util": "^26.1.0", - "pretty-format": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - }, - "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.1.0.tgz", - "integrity": "sha512-dWfiJ+spunVAwzXbdVqPH1LbuJW/kDL+FyqgA5YzquisHqTi0g9hquKif9xKm7c1bKBj6wbmJuDkeMCnxZEpUw==", - "dev": true, - "requires": { - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0", - "jsdom": "^16.2.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.1.0.tgz", - "integrity": "sha512-DNm5x1aQH0iRAe9UYAkZenuzuJ69VKzDCAYISFHQ5i9e+2Tbeu2ONGY7YStubCLH8a1wdKBgqScYw85+ySxqxg==", - "dev": true, - "requires": { - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.1.0.tgz", - "integrity": "sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "@types/graceful-fs": "^4.1.2", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-serializer": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-jasmine2": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.1.0.tgz", - "integrity": "sha512-1IPtoDKOAG+MeBrKvvuxxGPJb35MTTRSDglNdWWCndCB3TIVzbLThRBkwH9P081vXLgiJHZY8Bz3yzFS803xqQ==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.1.0", - "@jest/source-map": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.1.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.1.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-runtime": "^26.1.0", - "jest-snapshot": "^26.1.0", - "jest-util": "^26.1.0", - "pretty-format": "^26.1.0", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - } - } - }, - "jest-leak-detector": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.1.0.tgz", - "integrity": "sha512-dsMnKF+4BVOZwvQDlgn3MG+Ns4JuLv8jNvXH56bgqrrboyCbI1rQg6EI5rs+8IYagVcfVP2yZFKfWNZy0rK0Hw==", - "dev": true, - "requires": { - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - }, - "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - } - } - }, - "jest-matcher-utils": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.1.0.tgz", - "integrity": "sha512-PW9JtItbYvES/xLn5mYxjMd+Rk+/kIt88EfH3N7w9KeOrHWaHrdYPnVHndGbsFGRJ2d5gKtwggCvkqbFDoouQA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.1.0", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "diff-sequences": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", - "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", - "dev": true - }, - "jest-diff": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.1.0.tgz", - "integrity": "sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.0.0", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" - } - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - }, - "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - } - } - }, - "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.1.0.tgz", - "integrity": "sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.1.0.tgz", - "integrity": "sha512-KsY1JV9FeVgEmwIISbZZN83RNGJ1CC+XUCikf/ZWJBX/tO4a4NvA21YixokhdR9UnmPKKAC4LafVixJBrwlmfg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.1", - "jest-util": "^26.1.0", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", - "slash": "^3.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.1.0.tgz", - "integrity": "sha512-fQVEPHHQ1JjHRDxzlLU/buuQ9om+hqW6Vo928aa4b4yvq4ZHBtRSDsLdKQLuCqn5CkTVpYZ7ARh2fbA8WkRE6g==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-runner": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.1.0.tgz", - "integrity": "sha512-elvP7y0fVDREnfqit0zAxiXkDRSw6dgCkzPCf1XvIMnSDZ8yogmSKJf192dpOgnUVykmQXwYYJnCx641uLTgcw==", - "dev": true, - "requires": { - "@jest/console": "^26.1.0", - "@jest/environment": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.1.0", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.1.0", - "jest-jasmine2": "^26.1.0", - "jest-leak-detector": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-resolve": "^26.1.0", - "jest-runtime": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.1.0.tgz", - "integrity": "sha512-1qiYN+EZLmG1QV2wdEBRf+Ci8i3VSfIYLF02U18PiUDrMbhfpN/EAMMkJtT02jgJUoaEOpHAIXG6zS3QRMzRmA==", - "dev": true, - "requires": { - "@jest/console": "^26.1.0", - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/globals": "^26.1.0", - "@jest/source-map": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.1.0", - "jest-haste-map": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.1.0", - "jest-snapshot": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-serializer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.1.0.tgz", - "integrity": "sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.1.0.tgz", - "integrity": "sha512-YhSbU7eMTVQO/iRbNs8j0mKRxGp4plo7sJ3GzOQ0IYjvsBiwg0T1o0zGQAYepza7lYHuPTrG5J2yDd0CE2YxSw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.1.0", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.1.0", - "jest-get-type": "^26.0.0", - "jest-haste-map": "^26.1.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-resolve": "^26.1.0", - "natural-compare": "^1.4.0", - "pretty-format": "^26.1.0", - "semver": "^7.3.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "diff-sequences": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", - "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", - "dev": true - }, - "jest-diff": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.1.0.tgz", - "integrity": "sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.0.0", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" - } - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - }, - "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - } - } - }, - "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.1.0.tgz", - "integrity": "sha512-WPApOOnXsiwhZtmkDsxnpye+XLb/tUISP+H6cHjfUIXvlG+eKwP+isnivsxlHCPaO9Q5wvbhloIBkdF3qUn+Nw==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", - "leven": "^3.1.0", - "pretty-format": "^26.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - }, - "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - } - } - }, - "jest-watcher": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.1.0.tgz", - "integrity": "sha512-ffEOhJl2EvAIki613oPsSG11usqnGUzIiK7MMX6hE4422aXOcVEG3ySCTDFLn1+LZNXGPE8tuJxhp8OBJ1pgzQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.1.0", - "string-length": "^4.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.1.0.tgz", - "integrity": "sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.3.0.tgz", - "integrity": "sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsonpath-plus": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", - "integrity": "sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "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", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", - "dev": true - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "requires": { - "chalk": "^2.4.2" - }, - "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==", - "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==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marked": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.4.tgz", - "integrity": "sha512-6x5TFGCTKSQBLTZtOburGxCxFEBJEGYVLwCMTBCxzvyuisGcC20UNzDSJhCr/cJ/Kmh6ulfJm10g6WWEAJ3kvg==", - "dev": true - }, - "marked-terminal": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.0.tgz", - "integrity": "sha512-5KllfAOW02WS6hLRQ7cNvGOxvKW1BKuXELH4EtbWfyWgxQhROoMxEvuQ/3fTgkNjledR0J48F4HbapvYp1zWkQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.1", - "cardinal": "^2.1.1", - "chalk": "^4.0.0", - "cli-table": "^0.3.1", - "node-emoji": "^1.10.0", - "supports-hyperlinks": "^2.1.0" - } - }, - "memfs": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.0.tgz", - "integrity": "sha512-f/xxz2TpdKv6uDn6GtHee8ivFyxwxmPuXatBb1FBwxYNuVpbM3k/Y1Z+vC0mH/dIXXrukYfe3qe5J32Dfjg93A==", - "dev": true, - "requires": { - "fs-monkey": "1.0.1" - } - }, - "meow": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", - "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "^4.0.2", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "dependencies": { - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mock-fs": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.12.0.tgz", - "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==", - "dev": true - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "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 - }, - "multistream": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", - "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5" - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-emoji": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", - "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", - "dev": true, - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "node-forge": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", - "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-jose": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-1.1.4.tgz", - "integrity": "sha512-L31IFwL3pWWcMHxxidCY51ezqrDXMkvlT/5pLTfNw5sXmmOLJuN6ug7txzF/iuZN55cRpyOmoJrotwBQIoo5Lw==", - "requires": { - "base64url": "^3.0.1", - "browserify-zlib": "^0.2.0", - "buffer": "^5.5.0", - "es6-promise": "^4.2.8", - "lodash": "^4.17.15", - "long": "^4.0.0", - "node-forge": "^0.8.5", - "process": "^0.11.10", - "react-zlib-js": "^1.0.4", - "uuid": "^3.3.3" - } - }, - "node-machine-id": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", - "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.1.tgz", - "integrity": "sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^7.2.1", - "shellwords": "^0.1.1", - "uuid": "^7.0.3", - "which": "^2.0.2" - }, - "dependencies": { - "uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "optional": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } - }, - "npm": { - "version": "6.14.6", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.6.tgz", - "integrity": "sha512-axnz6iHFK6WPE0js/+mRp+4IOwpHn5tJEw5KB6FiCU764zmffrhsYHbSHi2kKqNkRBt53XasXjngZfBD3FQzrQ==", - "dev": true, - "requires": { - "JSONStream": "^1.3.5", - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "^2.0.0", - "archy": "~1.0.0", - "bin-links": "^1.1.7", - "bluebird": "^3.5.5", - "byte-size": "^5.0.1", - "cacache": "^12.0.3", - "call-limit": "^1.1.1", - "chownr": "^1.1.4", - "ci-info": "^2.0.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.5.1", - "cmd-shim": "^3.0.3", - "columnify": "~1.5.4", - "config-chain": "^1.1.12", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "~1.0.3", - "editor": "~1.0.0", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.3.0", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.8.8", - "iferr": "^1.0.2", - "imurmurhash": "*", - "infer-owner": "^1.0.4", - "inflight": "~1.0.6", - "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": "^4.0.7", - "libnpm": "^3.0.1", - "libnpmaccess": "^3.0.2", - "libnpmhook": "^5.0.3", - "libnpmorg": "^1.0.1", - "libnpmsearch": "^2.0.2", - "libnpmteam": "^1.0.2", - "libnpx": "^10.2.2", - "lock-verify": "^2.1.0", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^5.1.1", - "meant": "~1.0.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.5", - "move-concurrently": "^1.0.1", - "node-gyp": "^5.1.0", - "nopt": "^4.0.3", - "normalize-package-data": "^2.5.0", - "npm-audit-report": "^1.3.2", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "^3.0.2", - "npm-lifecycle": "^3.1.4", - "npm-package-arg": "^6.1.1", - "npm-packlist": "^1.4.8", - "npm-pick-manifest": "^3.0.2", - "npm-profile": "^4.0.4", - "npm-registry-fetch": "^4.0.5", - "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.12", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", - "qrcode-terminal": "^0.12.0", - "query-string": "^6.8.2", - "qw": "~1.0.1", - "read": "~1.0.7", - "read-cmd-shim": "^1.0.5", - "read-installed": "~4.0.3", - "read-package-json": "^2.1.1", - "read-package-tree": "^5.3.1", - "readable-stream": "^3.6.0", - "readdir-scoped-modules": "^1.1.0", - "request": "^2.88.0", - "retry": "^0.12.0", - "rimraf": "^2.7.1", - "safe-buffer": "^5.1.2", - "semver": "^5.7.1", - "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.1", - "tar": "^4.4.13", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "^1.1.1", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.3", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^1.3.1", - "worker-farm": "^1.7.0", - "write-file-atomic": "^2.4.3" - }, - "dependencies": { - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "^2.0.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "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" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, - "ansistyles": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz", - "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=", - "dev": true - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bin-links": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-1.1.7.tgz", - "integrity": "sha512-/eaLaTu7G7/o7PV04QPy1HRT65zf+1tFkPGv0sPTV0tRwufooYBQO3zrcyGgm+ja+ZtBf2GEuKjDRJ2pPG+yqA==", - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "cmd-shim": "^3.0.0", - "gentle-fs": "^2.3.0", - "graceful-fs": "^4.1.15", - "npm-normalize-package-bin": "^1.0.0", - "write-file-atomic": "^2.3.0" - } - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "dev": true - }, - "byte-size": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", - "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "call-limit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/call-limit/-/call-limit-1.1.1.tgz", - "integrity": "sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ==", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cidr-regex": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.10.tgz", - "integrity": "sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0" - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-columns": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-3.1.2.tgz", - "integrity": "sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=", - "dev": true, - "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - } - }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "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" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "cmd-shim": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-3.0.3.tgz", - "integrity": "sha512-DtGg+0xiFhQIntSBRzL2fRQBnmtAVwXIDo4Qq46HPpObYquxMaZS4sb82U9nH91qJrlosC1wa9gwr0QyL/HypA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true, - "optional": true - }, - "columnify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", - "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", - "dev": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", - "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "editor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", - "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "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", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "find-npm-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz", - "integrity": "sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "fs-vacuum": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.10.tgz", - "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true - }, - "gentle-fs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gentle-fs/-/gentle-fs-2.3.0.tgz", - "integrity": "sha512-3k2CgAmPxuz7S6nKK+AqFE2AdM1QuwqKLPKzIET3VRwK++3q96MsNFobScDjlCrq97ZJ8y5R725MOlm6ffUCjg==", - "dev": true, - "requires": { - "aproba": "^1.1.2", - "chownr": "^1.1.2", - "cmd-shim": "^3.0.3", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "infer-owner": "^1.0.4", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "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==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "iferr": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-1.0.2.tgz", - "integrity": "sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "init-package-json": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - }, - "dependencies": { - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - } - } - }, - "is-cidr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-3.0.0.tgz", - "integrity": "sha512-8Xnnbjsb0x462VoYiGlhEi+drY8SFwrHiSYuzc/CEwco55vkehTaxAyIjEdpi3EMvLPPJAJi9FlzP+h+03gp0Q==", - "dev": true, - "requires": { - "cidr-regex": "^2.0.10" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "lazy-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazy-property/-/lazy-property-1.0.0.tgz", - "integrity": "sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "libcipm": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/libcipm/-/libcipm-4.0.7.tgz", - "integrity": "sha512-fTq33otU3PNXxxCTCYCYe7V96o59v/o7bvtspmbORXpgFk+wcWrGf5x6tBgui5gCed/45/wtPomBsZBYm5KbIw==", - "dev": true, - "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "ini": "^1.3.5", - "lock-verify": "^2.0.2", - "mkdirp": "^0.5.1", - "npm-lifecycle": "^3.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "pacote": "^9.1.0", - "read-package-json": "^2.0.13", - "rimraf": "^2.6.2", - "worker-farm": "^1.6.0" - } - }, - "libnpm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/libnpm/-/libnpm-3.0.1.tgz", - "integrity": "sha512-d7jU5ZcMiTfBqTUJVZ3xid44fE5ERBm9vBnmhp2ECD2Ls+FNXWxHSkO7gtvrnbLO78gwPdNPz1HpsF3W4rjkBQ==", - "dev": true, - "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.3", - "find-npm-prefix": "^1.0.2", - "libnpmaccess": "^3.0.2", - "libnpmconfig": "^1.2.1", - "libnpmhook": "^5.0.3", - "libnpmorg": "^1.0.1", - "libnpmpublish": "^1.1.2", - "libnpmsearch": "^2.0.2", - "libnpmteam": "^1.0.2", - "lock-verify": "^2.0.2", - "npm-lifecycle": "^3.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "npm-profile": "^4.0.2", - "npm-registry-fetch": "^4.0.0", - "npmlog": "^4.1.2", - "pacote": "^9.5.3", - "read-package-json": "^2.0.13", - "stringify-package": "^1.0.0" - } - }, - "libnpmaccess": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.2.tgz", - "integrity": "sha512-01512AK7MqByrI2mfC7h5j8N9V4I7MHJuk9buo8Gv+5QgThpOgpjB7sQBDDkeZqRteFb1QM/6YNdHfG7cDvfAQ==", - "dev": true, - "requires": { - "aproba": "^2.0.0", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "libnpmconfig": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", - "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "find-up": "^3.0.0", - "ini": "^1.3.5" - }, - "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-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 - } - } - }, - "libnpmhook": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-5.0.3.tgz", - "integrity": "sha512-UdNLMuefVZra/wbnBXECZPefHMGsVDTq5zaM/LgKNE9Keyl5YXQTnGAzEo+nFOpdRqTWI9LYi4ApqF9uVCCtuA==", - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "libnpmorg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/libnpmorg/-/libnpmorg-1.0.1.tgz", - "integrity": "sha512-0sRUXLh+PLBgZmARvthhYXQAWn0fOsa6T5l3JSe2n9vKG/lCVK4nuG7pDsa7uMq+uTt2epdPK+a2g6btcY11Ww==", - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "libnpmpublish": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-1.1.2.tgz", - "integrity": "sha512-2yIwaXrhTTcF7bkJKIKmaCV9wZOALf/gsTDxVSu/Gu/6wiG3fA8ce8YKstiWKTxSFNC0R7isPUb6tXTVFZHt2g==", - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^4.0.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - } - }, - "libnpmsearch": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-2.0.2.tgz", - "integrity": "sha512-VTBbV55Q6fRzTdzziYCr64+f8AopQ1YZ+BdPOv16UegIEaE8C0Kch01wo4s3kRTFV64P121WZJwgmBwrq68zYg==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "libnpmteam": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/libnpmteam/-/libnpmteam-1.0.2.tgz", - "integrity": "sha512-p420vM28Us04NAcg1rzgGW63LMM6rwe+6rtZpfDxCcXxM0zUTLl7nPFEnRF3JfFBF5skF/yuZDUthTsHgde8QA==", - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "libnpx": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/libnpx/-/libnpx-10.2.2.tgz", - "integrity": "sha512-ujaYToga1SAX5r7FU5ShMFi88CWpY75meNZtr6RtEyv4l2ZK3+Wgvxq2IqlwWBiDZOqhumdeiocPS1aKrCMe3A==", - "dev": true, - "requires": { - "dotenv": "^5.0.1", - "npm-package-arg": "^6.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.0", - "update-notifier": "^2.3.0", - "which": "^1.3.0", - "y18n": "^4.0.0", - "yargs": "^11.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lock-verify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lock-verify/-/lock-verify-2.1.0.tgz", - "integrity": "sha512-vcLpxnGvrqisKvLQ2C2v0/u7LVly17ak2YSgoK4PrdsYBXQIax19vhKiLfvKNFx7FRrpTnitrpzF/uuCMuorIg==", - "dev": true, - "requires": { - "npm-package-arg": "^6.1.0", - "semver": "^5.4.1" - } - }, - "lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "dev": true, - "requires": { - "signal-exit": "^3.0.2" - } - }, - "lodash._baseindexof": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz", - "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=", - "dev": true - }, - "lodash._baseuniq": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", - "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", - "dev": true, - "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz", - "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=", - "dev": true - }, - "lodash._createcache": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", - "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0" - } - }, - "lodash._createset": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz", - "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "lodash.without": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", - "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "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" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "meant": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.1.tgz", - "integrity": "sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg==", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "mime-db": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", - "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", - "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", - "dev": true, - "requires": { - "mime-db": "~1.35.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch-npm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node-gyp": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.0.tgz", - "integrity": "sha512-OUTryc5bt/P8zVgNUmC6xdXiDJxLMAW8cF5tLQOT9E5sOQj+UeQxnnPy74K3CLCa/SOjjBlbuzDLR8ANwA+wmw==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - } - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "npm-audit-report": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-1.3.2.tgz", - "integrity": "sha512-abeqS5ONyXNaZJPGAf6TOUMNdSe1Y6cpc9MLBRn+CuUoYbfdca6AxOyXVlfIv9OgKX+cacblbG5w7A6ccwoTPw==", - "dev": true, - "requires": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-cache-filename": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz", - "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=", - "dev": true - }, - "npm-install-checks": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-3.0.2.tgz", - "integrity": "sha512-E4kzkyZDIWoin6uT5howP8VDvkM+E8IQDcHAycaAxMbwkqhIg5eEYALnXOl3Hq9MrkdQB/2/g1xwBINXdKSRkg==", - "dev": true, - "requires": { - "semver": "^2.3.0 || 3.x || 4 || 5" - } - }, - "npm-lifecycle": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.4.tgz", - "integrity": "sha512-tgs1PaucZwkxECGKhC/stbEgFyc3TGh2TJcg2CDr6jbvQRdteHNhmMeljRzpe4wgFAXQADoy1cSqqi7mtiAa5A==", - "dev": true, - "requires": { - "byline": "^5.0.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", - "umask": "^1.1.0", - "which": "^1.3.1" - } - }, - "npm-logical-tree": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz", - "integrity": "sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==", - "dev": true - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "npm-profile": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-4.0.4.tgz", - "integrity": "sha512-Ta8xq8TLMpqssF0H60BXS1A90iMoM6GeKwsmravJ6wYjWwSzcYBTdyWa3DZCYqPutacBMEm7cxiOkiIeCUAHDQ==", - "dev": true, - "requires": { - "aproba": "^1.1.2 || 2", - "figgy-pudding": "^3.4.1", - "npm-registry-fetch": "^4.0.0" - } - }, - "npm-registry-fetch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz", - "integrity": "sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q==", - "dev": true, - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npm-user-validate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-1.0.0.tgz", - "integrity": "sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE=", - "dev": true - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "pacote": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", - "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.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 - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - }, - "dependencies": { - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - } - } - }, - "promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", - "dev": true, - "requires": { - "read": "1" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qrcode-terminal": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.8.2.tgz", - "integrity": "sha512-J3Qi8XZJXh93t2FiKyd/7Ec6GNifsjKXUsVFkSBj/kjLsDylWhnCz4NT1bkPcKotttPW+QbKGqqPH8OoI2pdqw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, - "qw": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/qw/-/qw-1.0.1.tgz", - "integrity": "sha1-77/cdA+a0FQwRCassYNBLMi5ltQ=", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", - "integrity": "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "read-installed": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", - "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - } - }, - "read-package-json": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", - "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "read-package-tree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "dev": true, - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "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 - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "sha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz", - "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "sorted-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz", - "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=", - "dev": true - }, - "sorted-union-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz", - "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", - "dev": true, - "requires": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" - }, - "dependencies": { - "from2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-1.3.0.tgz", - "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "dev": true - }, - "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-iterate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stream-iterate/-/stream-iterate-1.2.0.tgz", - "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "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": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "stringify-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", - "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", - "dev": true - }, - "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" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz", - "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true - }, - "umask": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", - "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util-extend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", - "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=", - "dev": true - }, - "util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "requires": { - "string-width": "^1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.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", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "oidc-token-hash": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-3.0.2.tgz", - "integrity": "sha512-dTzp80/y/da+um+i+sOucNqiPpwRL7M/xPwj7pH1TFA2/bqQ+OK2sJahSXbemEoLtPkHcFLyhLhLWZa9yW5+RA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "openid-client": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-2.5.0.tgz", - "integrity": "sha512-t3hFD7xEoW1U25RyBcRFaL19fGGs6hNVTysq9pgmiltH0IVUPzH/bQV9w24pM5Q7MunnGv2/5XjIru6BQcWdxg==", - "requires": { - "base64url": "^3.0.0", - "got": "^8.3.2", - "lodash": "^4.17.11", - "lru-cache": "^5.1.1", - "node-jose": "^1.1.0", - "object-hash": "^1.3.1", - "oidc-token-hash": "^3.0.1", - "p-any": "^1.1.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", - "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - } - } - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ora": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.5.tgz", - "integrity": "sha512-jCDgm9DqvRcNIAEv2wZPrh7E5PcQiDUnbnWbAfu4NGAE2ZNqPFbDixmWldy1YG2QfLeQhuiu6/h5VRrk6cG50w==", - "requires": { - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.2.0", - "is-interactive": "^1.0.0", - "log-symbols": "^3.0.0", - "mute-stream": "0.0.8", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-any": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-any/-/p-any-1.1.0.tgz", - "integrity": "sha512-Ef0tVa4CZ5pTAmKn+Cg3w8ABBXh+hHO1aV8281dKOoUHfX+3tjG2EaFcC+aZyagg9b4EYGsHEjz21DnEE8Og2g==", - "requires": { - "p-some": "^2.0.0" - } - }, - "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true - }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "requires": { - "p-timeout": "^3.1.0" - }, - "dependencies": { - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - } - } - }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "requires": { - "p-map": "^2.0.0" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - }, - "dependencies": { - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - } - } - }, - "p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true - }, - "p-retry": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.2.0.tgz", - "integrity": "sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==", - "dev": true, - "requires": { - "@types/retry": "^0.12.0", - "retry": "^0.12.0" - } - }, - "p-some": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-some/-/p-some-2.0.1.tgz", - "integrity": "sha1-Zdh8ixVO289SIdFnd4ttLhUPbwY=", - "requires": { - "aggregate-error": "^1.0.0" - } - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "requires": { - "p-finally": "^1.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==" - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parent-require": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", - "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=" - }, - "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" - } - }, - "parse-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", - "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-4.4.9.tgz", - "integrity": "sha512-FK4GqHtcCY2PPPVaKViU0NyRzpo6gCS7tPKN5b7AkElqjAOCH1bsRKgohEnxThr6DWfTGByGqba2YHGR/BqbmA==", - "dev": true, - "requires": { - "@babel/parser": "^7.9.4", - "@babel/runtime": "^7.9.2", - "chalk": "^3.0.0", - "escodegen": "^1.14.1", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "into-stream": "^5.1.1", - "minimist": "^1.2.5", - "multistream": "^2.1.1", - "pkg-fetch": "^2.6.9", - "progress": "^2.0.3", - "resolve": "^1.15.1", - "stream-meter": "^1.0.4" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "into-stream": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", - "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "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 - } - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pkg-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-2.6.9.tgz", - "integrity": "sha512-EnVR8LRILXBvaNP+wJOSY02c3+qDDfyEyR+aqAHLhcc9PBnbxFT9UZ1+If49goPQzQPn26TzF//fc6KXZ0aXEg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.9.2", - "byline": "^5.0.0", - "chalk": "^3.0.0", - "expand-template": "^2.0.3", - "fs-extra": "^8.1.0", - "minimist": "^1.2.5", - "progress": "^2.0.3", - "request": "^2.88.0", - "request-progress": "^3.0.0", - "semver": "^6.3.0", - "unique-temp-dir": "^1.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.4" - } - }, - "protocols": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", - "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "react-zlib-js": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/react-zlib-js/-/react-zlib-js-1.0.4.tgz", - "integrity": "sha512-ynXD9DFxpE7vtGoa3ZwBtPmZrkZYw2plzHGbanUjBOSN4RtuXdektSfABykHtTiWEHMh7WdYj45LHtp228ZF1A==" - }, - "read-pkg": { - "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": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "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 - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "dependencies": { - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - } - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "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==" - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-alpn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz", - "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==" - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" - }, - "rxjs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", - "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semantic-release": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.2.3.tgz", - "integrity": "sha512-MY1MlowGQrkOR7+leOD8ICkVOC6i1szbwDODdbJ0UdshtMx8Ms0bhpRQmEEliqYKEb5PLv/dqs6zKKuHT7UxTg==", - "dev": true, - "requires": { - "@semantic-release/commit-analyzer": "^8.0.0", - "@semantic-release/error": "^2.2.0", - "@semantic-release/github": "^7.0.0", - "@semantic-release/npm": "^7.0.0", - "@semantic-release/release-notes-generator": "^9.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^6.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^4.0.0", - "figures": "^3.0.0", - "find-versions": "^3.0.0", - "get-stream": "^5.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^3.0.0", - "lodash": "^4.17.15", - "marked": "^1.0.0", - "marked-terminal": "^4.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^15.0.1" - }, - "dependencies": { - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.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.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" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "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" - } - } - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "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", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "^2.0.2" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=", - "dev": true, - "requires": { - "readable-stream": "^2.1.4" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "tempy": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.5.0.tgz", - "integrity": "sha512-VEY96x7gbIRfsxqsafy2l5yVxxp3PhwAGoWMyC2D2Zt5DmEv+2tGiPOrquNRpf21hhGnKLVEsuqleqiZmKG/qw==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.12.0", - "unique-string": "^2.0.0" - }, - "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "type-fest": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", - "dev": true - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", - "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", - "dev": true - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "ts-jest": { - "version": "26.1.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.3.tgz", - "integrity": "sha512-beUTSvuqR9SmKQEylewqJdnXWMVGJRFqSz2M8wKJe7GBMmLZ5zw6XXKSJckbHNMxn+zdB3guN2eOucSw2gBMnw==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "26.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "18.x" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "tslib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", - "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" - }, - "tslint": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", - "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.10.0", - "tsutils": "^2.29.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.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" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "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" - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-config-airbnb": { - "version": "5.11.2", - "resolved": "https://registry.npmjs.org/tslint-config-airbnb/-/tslint-config-airbnb-5.11.2.tgz", - "integrity": "sha512-mUpHPTeeCFx8XARGG/kzYP4dPSOgoCqNiYbGHh09qTH8q+Y1ghsOgaeZKYYQT7IyxMos523z/QBaiv2zKNBcow==", - "dev": true, - "requires": { - "tslint-consistent-codestyle": "^1.14.1", - "tslint-eslint-rules": "^5.4.0", - "tslint-microsoft-contrib": "~5.2.1" - } - }, - "tslint-consistent-codestyle": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.16.0.tgz", - "integrity": "sha512-ebR/xHyMEuU36hGNOgCfjGBNYxBPixf0yU1Yoo6s3BrpBRFccjPOmIVaVvQsWAUAMdmfzHOCihVkcaMfimqvHw==", - "dev": true, - "requires": { - "@fimbul/bifrost": "^0.21.0", - "tslib": "^1.7.1", - "tsutils": "^2.29.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", - "dev": true, - "requires": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - } - } - }, - "tslint-microsoft-contrib": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", - "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", - "dev": true, - "requires": { - "tsutils": "^2.27.2 <2.29.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.6.0.tgz", - "integrity": "sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==", - "dev": true, - "requires": { - "tsutils": "^2.13.1" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - }, - "uglify-js": { - "version": "3.11.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.6.tgz", - "integrity": "sha512-oASI1FOJ7BBFkSCNDZ446EgkSuHkOZBuqRFrwXIKWCoXw8ZXQETooTQjkAcBS03Acab7ubCKsXnwuV2svy061g==", - "dev": true, - "optional": true - }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", - "dev": true - }, - "underscore": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", - "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unique-temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", - "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1", - "os-tmpdir": "^1.0.1", - "uid2": "0.0.3" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-join": { - "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-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-to-istanbul": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", - "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", - "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "yargonaut": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", - "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", - "requires": { - "chalk": "^1.1.1", - "figlet": "^1.1.1", - "parent-require": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^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=" - } - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 713ebd1..0000000 --- a/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "@smartive/kuby", - "version": "0.0.0-development", - "description": "commandline tool that helps with kubernetes deployments", - "main": "./build/kubernetes-helpers.js", - "scripts": { - "clean": "del-cli ./build ./out ./coverage", - "build": "npm run clean && tsc -p ./config/tsconfig.build.json", - "develop": "npm run clean && tsc -p .", - "lint": "tslint -c ./tslint.json -p ./config/tsconfig.build.json", - "test": "jest -c jest.json --watch", - "test:ci": "jest -c jest.json --coverage --runInBand", - "semantic-release": "semantic-release", - "package": "npm run build && pkg --out-path out .", - "link": "npm run build && npm link" - }, - "bin": { - "kuby": "./build/kubernetes-helpers.js" - }, - "keywords": [ - "kubernetes", - "k8s", - "cli", - "helper", - "kubectl" - ], - "repository": { - "type": "git", - "url": "git@github.com:smartive/kuby.git" - }, - "bugs": { - "url": "https://github.com/smartive/kuby/issues" - }, - "homepage": "https://github.com/smartive/kuby", - "author": "Christoph Bühler ", - "license": "MIT", - "publishConfig": { - "access": "public" - }, - "engines": { - "node": "^12" - }, - "dependencies": { - "@kubernetes/client-node": "^0.10.2", - "apache-md5": "^1.1.5", - "chalk": "^4.1.0", - "clipboardy": "^2.3.0", - "fast-glob": "^3.2.4", - "find-up": "^4.1.0", - "fs-extra": "^9.0.1", - "fuzzy": "^0.1.3", - "got": "^11.5.1", - "inquirer": "^7.3.2", - "inquirer-autocomplete-prompt": "^1.0.2", - "node-machine-id": "^1.1.12", - "ora": "^4.0.5", - "semver": "^7.3.2", - "tslib": "^2.0.0", - "yargonaut": "^1.1.4", - "yargs": "^15.4.1" - }, - "devDependencies": { - "@semantic-release/gitlab": "^6.0.4", - "@semantic-release/npm": "^7.0.5", - "@smartive/tslint-config": "^7.0.1", - "@types/fs-extra": "^9.0.1", - "@types/inquirer": "^6.5.0", - "@types/jest": "^26.0.5", - "@types/node": "^12", - "@types/semver": "^7.3.1", - "@types/yargs": "^15.0.5", - "del-cli": "^3.0.1", - "jest": "^26.1.0", - "memfs": "^3.2.0", - "mock-fs": "^4.12.0", - "pkg": "^4.4.9", - "semantic-release": "^17.1.1", - "ts-jest": "^26.1.3", - "tslint": "^6.1.2", - "tsutils": "^3.17.1", - "typescript": "^3.9.7" - } -} diff --git a/src/Kuby/.gitignore b/src/Kuby/.gitignore new file mode 100644 index 0000000..2ee5026 --- /dev/null +++ b/src/Kuby/.gitignore @@ -0,0 +1 @@ +[Kk]ubectl/ diff --git a/src/Kuby/Clipboard.fs b/src/Kuby/Clipboard.fs new file mode 100755 index 0000000..89091ae --- /dev/null +++ b/src/Kuby/Clipboard.fs @@ -0,0 +1,105 @@ +module Kuby.Clipboard + +open System +open System.Diagnostics +open System.IO +open System.Reflection +open System.Runtime.InteropServices +open Kuby.ConsoleWriter +open McMaster.Extensions.CommandLineUtils + +let private basePath = + Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "kuby", "clipboard") + +let private isWsl = + if not (RuntimeInformation.IsOSPlatform OSPlatform.Linux) then + false + else + use proc = new Process() + + try + proc.StartInfo.FileName <- "which" + proc.StartInfo.Arguments <- ArgumentEscaper.EscapeAndConcatenate [ "explorer.exe" ] + proc.StartInfo.RedirectStandardOutput <- true + proc.StartInfo.RedirectStandardError <- true + proc.StartInfo.CreateNoWindow <- true + proc.Start() |> ignore + proc.WaitForExit() + + proc.ExitCode = 0 + with _ -> false + +let private targetExecutable = + if RuntimeInformation.IsOSPlatform OSPlatform.Windows + || isWsl then + Path.Join(basePath, "clipboard.exe") + else if RuntimeInformation.IsOSPlatform OSPlatform.Linux then + Path.Join(basePath, "xsel") + else + "pbcopy" + +let private executable = + let assembly = Assembly.GetExecutingAssembly() + + if RuntimeInformation.IsOSPlatform OSPlatform.Windows + || isWsl then + assembly.GetManifestResourceStream("Kuby.Clipboard.Windows.clipboard.exe") + else + assembly.GetManifestResourceStream("Kuby.Clipboard.Linux.xsel") + +let private prepare () = + async { + if RuntimeInformation.IsOSPlatform OSPlatform.OSX + then return () + + if not (File.Exists targetExecutable) then + use memStream = new MemoryStream() + executable.CopyTo memStream + Directory.CreateDirectory(basePath) |> ignore + + do! File.WriteAllBytesAsync(targetExecutable, memStream.ToArray()) + |> Async.AwaitTask + + if RuntimeInformation.IsOSPlatform OSPlatform.Linux then + use chmod = new Process() + chmod.StartInfo.FileName <- "chmod" + chmod.StartInfo.Arguments <- ArgumentEscaper.EscapeAndConcatenate([ "+x"; targetExecutable ]) + chmod.StartInfo.CreateNoWindow <- true + chmod.Start() |> ignore + do! chmod.WaitForExitAsync() |> Async.AwaitTask + + writeLine [ Color($@"Installed clipboard helper at ""{targetExecutable}""", Color.Cyan) ] + } + +let copy (content: string) = + async { + do! prepare () + + use proc = new Process() + + proc.StartInfo.FileName <- targetExecutable + proc.StartInfo.RedirectStandardOutput <- true + proc.StartInfo.RedirectStandardError <- true + + proc.StartInfo.Arguments <- + ArgumentEscaper.EscapeAndConcatenate + (seq { + if RuntimeInformation.IsOSPlatform OSPlatform.Windows + || isWsl then + "--copy" + + if RuntimeInformation.IsOSPlatform OSPlatform.Linux + && not isWsl then + "--clipboard" + "--input" + }) + + proc.StartInfo.RedirectStandardInput <- true + proc.StartInfo.CreateNoWindow <- true + proc.Start() |> ignore + proc.StandardInput.Write content + proc.StandardInput.Flush() + proc.StandardInput.Close() + + do! proc.WaitForExitAsync() |> Async.AwaitTask + } diff --git a/src/Kuby/Clipboard/Linux/xsel b/src/Kuby/Clipboard/Linux/xsel new file mode 100755 index 0000000000000000000000000000000000000000..a6b2fd3d5937e605e3f3fdb3c9634bad8aa5816f GIT binary patch literal 129416 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 Q`Y-&Qm48BXz%u>+1%L4+cmMzZ literal 0 HcmV?d00001 diff --git a/src/Kuby/Clipboard/Windows/clipboard.exe b/src/Kuby/Clipboard/Windows/clipboard.exe new file mode 100644 index 0000000000000000000000000000000000000000..e69bcc2f1dc0be5c8a3fdfdf545bf002cef0c7db GIT binary patch literal 331438 zcmdSC3wV=77C)S{q_jYJ16lF{#Q$G{u28nEum_lb zUz2UCC8H1XZ+PI^`T+8(W}zJY60iiJ-8}qyg-`MtJeO@A)D_-iD{dY>_L51&QOiGd$Y+&>-QhgV!viKemaSx4E60xw(J6?g zB9~=Gj?0XE)0$P8kq!>y2GDMC>vu)GSKdemk(MI3#KgmaM)F0}`)Eos)n>kHSdCXFHjw8_8J zEYYvgN9p#B^Gm5%w1yz6(N^h$YUc0jYY$ZLlchCWiPUft8{A*J=MqGsjU9-TY-`x0 z-SyIp{90DO5gSG;s&mTd`|S-MUe8bVbz?_}?!$y29X zs?Yyw8LMtyosW+mn}lMCyA+WnrxXt!a1~Outr-_ByGUV9_B@x1b%n^=MtL zKYG&GOS5gs0eV@B7C8xUs|DoI+xeDmh<06j_AI@jIk;1gp4}+RM03I&b}e!Q0HZl* zZ{#Y3S{*N(pDm@t%+5n%!)`6&#ux2)ZG-GRU<&lBC~01UR9nfW&aL7zc6}`WraoD= z&VuJILCd2BHq-+-5Vb&pysHjCL_S1)VpSHgIF=BZ;V2nTXvd=_>Zpy_XOwJ87HC6l zk!^ut;T`tCDN-!-aI;-o=?v|6-Tj5v*ys(n+e7z)&I2I** z2I?*U2(3Kw6WxgG;dOTLEnvK5AI^K-7v7zFVQcy6paCp4PQL_*Meu-~Jh^*48C7r& zlA`%u)(GwxPJh(lmXU&!2s~&wx-h>Ff`%g(e<3H4H9!_E*n1vg+k$a>kWcc&B@>SOFqNvvUatQlV0Kss1+MDB{l&k$az^4GC`V>6vQ9Tz_2>kr z7?=wj;T9K#@QWOZ);=-(db>^Q3ze4Qmuf$NRQp*D6-d(V2i6q9enr|K@f14lFr?L{ z3y?GyNjuUcjS=WP+mxwbcdc%`u1Ck^a-dJuW22x-`!%q$^k{!QR_;c3l)DS{R`8dy z-Wf-(ecG1D-TlMH^r~lLl{A1R*^-YY>}V4=^wbdVe`mTgIPguPFJ!ADii} z_O0c>g*ZXy>BiSf^rDYL^G>h@PLbS_#f*SkM-i0&L2GyyNeK>ibH1yLR@i*@?Q6cr z)ao~O_#mA3FJ;B$?mF3v?9^&@s!I>gb-V1r^N}@7kGEl{h32{oIo5nyMT?#n_m}Mp z4((bm$7rFL3Kc>Ml9w!zf$#m*PVk3e-^EhQW! zLZzD4Fo`i>)rB2cllgiS%|p`yBXs+>dRbBnUjzs;lWfu=n`P-@obfiDfWPACS?v3WdpRPcwN7(JWIoBQ7S8XLBoC6=ak23` zN<$0z8^M6Km^aSJCRS?$a>U1gpzK>Ee$Nt|?16zx(7yy|=c??{?Q1x+4nB zX6Tr&>T)qrx6KEIhVGP5es_%t=6BDOaDI2Slo6n^wM5(@e6j#q)415Z5Me^ktT7h5 zIigXZ8o~Jp>PE!f$Zx|3L09sk6bf=)*PJ$OfWk$siD3f{7JaNO_!~>Kj%Pz`fur>3 z#9ZC}s&2fGDOEfPV?#Fp2-Zo=V4YM7^=bLB1^OtN7>gM|56^P~i!U0qi5I>li{xNz z7dIoa1T!Ot$1ktAat3Ec?+ovi>%ff#f58m(_+7I1sF6sCR_OR07HQf5swqwjViJ}E z7>Tj`@B;w9Re?k6ym$=@CQnNiQ3w59#fGr=P|PDLfeaQKvVNzsvXZiEky$UcB9q#? zUS^>TEs&_0c#TYieEXb*Oo~t+d}B zbR=^2AxqBBiC<#9lQ|ziJ!9nE4&8N(9xV||f!bmdmEDZQ7^EzbL8;HX!OuJdeqa~) z4Emnk4@|X@9wgrwBCm&M!tvwmF!M^LcJtI@?k@HKboL?@`8#=YfL*!S~G5xGV z=JY*tIS`>Q%sIVe93j!8JxOzw1uB1H7)1>&mA#3Pv) zzI%`q-n*TmJTvphc9~gf3mga4Uo1{ZXHxZ-V*Y#!Amlc}YG%j0!4}0ZQ#(2KLCUnN zq;Sf4zgUk>DHSbJNcM>fWKNg)-sHD<0f@VH?Dee5J4MZKg+AkTUv!+4Gp5%UJsvh| zE|hS#9vk7w#HWYPlTEv`L$G{`8OI@lGJ{}&h~WFa@ZAuo<9*SQVr&|UZ7hUc;GL1! z{f%m-imuDBPrArQPS?Va#^=p~E?O6m4<%1&`F#udU7NWevjpJhe??8K8<^vDW0Jen zOI-xL>%t(P@EApewg6O%M~^vflAusnOm)e51*w0?M`HmoP3miEwmQJck{+tP5F@Qh zNhyP(;30__+EF}Er+QCn1ebX5M@|`gMEFW3V|?5FQEx8HXx(@vaqxCK25Tn&t??t0 zUw3cl{YY720xyp#c*JW`Ej@gx%c(Q(Qkk!gv^Na|7_x&!N9uanJ% zuC*&oD^+00rKDJrm+rrA_6HYBu&$nW7b8IX3Y@Wtd8ma;UN9>z{>jKSP>$qS8}so` z$0Q=;H{x#R7d6)Dv856~oH7VSFfZ51DUnmbx7w_L8%~ReEQJAmn!=@P6E{LRLMLvZ zPSmxriPdV7gmtz=p`q2#8N6IK9&#@y6`+t)My?E- zt>N6w%)}Ri6$F>lgs9QJX@+$gapxjIk1m!C5wCt_wC(BCh*HxjGy zv|COCsA)UmfJ0G}2av30#L-sOI50NiUO@;5r%u5u1ibfU7V^I2!e5$jb^h3k5-K?e z_V|Uy^fNlX9iz<~afYw6#TVW%NH@NRVdjUmz4a)vbvoJlffga#6UNNQZoh&vFCIzD4mI-YI>8aATgIt0WpNvzeaaq(FK^wMIzgQLhOM&-8~#1t2+ zhuCe#y3T?}B<9u#WU~Y)+V#%f+ONk0TzrDUnM=PvSjbM7$Y35grlW9Tzk?(?9=KVy zP>Z|_<&26JA?|I$V#+2a!$(Of{w#AGUla0h-FNo(hnX8t=5a>%>0{BB*!i1eVJtm* z==&Z@4V0xEPyL4~dnonc7}n)@=6@^ogevuy|E*LVOBw%lgS@H|a`$jN?4dz@RjG&m zw^DC=|0mL(Ab8Ai-Tzie9ZMZLECb#yLsCwNDSu1G_$>P}V|;$~1#n4wiQ|)sgR_J! zFi;FkgSCqd0MiQ9^ojKfHAt8Big@T`JKT*M{FpbWib^(#_dmBw5q|s#n{83KdrV`w z`vPqhR8S2Bd6aZFie5OS(UTnnL!C?)x$f<=e7fF~6 zlxa`K_=k4$8@u#3_Umu#QcImzeqpou!k-_kw0~Z*`-KD8o77{F9XJ+}$ENKC9V+T+4$#OLp@f!z7~Y*5p|0&Ues1V6OdX5XP;k~z?q@ite*fV6<0! zJO5w^&71>+9~9{4p)p#+)wCC2ZC`#OC}(=23Mumsa&AZC>rlX^h3De0cSZBFL;XhQ z8uH@>@XeNZk(snlCB0~gtwLKhLeg7q>;auW+ms7dQK&WS00^4&dc3UxESc}-LIVhMmwQL_X{C%OA31S8Unu13x5cZ+2sv8od7(MU; z*(J{V4BEXl5$`K7Igk;e>a^SRLpzSyvl+RBQ~NV7kxX1Isw+E$6O`$ zEmeehdRQg?=+3qUE&{F}5Wwse9D&*7Z=63f5NtjN2&4xJ8fP~)Id$$lz+8*Ncl;6y z#`6C@3EL=JVVKAAA45=lK`{Ccc5y&UMZ z`;?`N^g2M^+8A;FgUJ96)S!o+K?Lx12>um8Kl-K}-xojvXn5Y;hA%9GA1aOSXj8e+ z)se2zFy5s{r&jx;vugciyMlf6vRTu#dwz{mCTyi8oq-m zYTw4%Ph~oLw{eoYUR$|THVJ0B`}W2uS=y?lvRyUCQK)0?YQUl+%Ku&OM|JfOHox(D z;7r<+A>>%-71Yyeg@C?jMqXkI{$LPet%kiGzcH&8&b?}+agiP!Kh0ORL0kATMys#r zZ9RKxm9K2KUmLsI7d~JQ9w{BtuOd@hndNQlo$QbGi{HQ!K#0es_k4V{-!3o`YW1>> zx;8$p8{?}jYFG#7uO@se;n{BZE%uud_ajCPLv}PSm6`0{*>upZX4=JQ{3Lf>jWGaa zsm0|8@*9!2hzLy&=-NuP3K|6`vMLqm7ikV$sz=pgAylRX$BoL;7W@J=5~LX=#hU?e zV*vNWxEyBv)LJR(zJt3GgGG-%BnOMH=);oT$szvepA|d7YGQebJhouCNTKxkjX$e3 zBihA&XZyCxbTud|jdowrc5T5ya1s-}Fa8aN#!@x0V`x$AL@)+vlS(QuYf;4gCW>Ro z{~jN0RmA-Uz8v*%+=B(X12>j8&UAYKM*t|1u>@i!^@z6|3agyLp@@O5OG83%(~xzE z?@-37uAEYB)dj)y8{a10V}-GT*1M=u7fY^rn@&Wccxx($hvEtw973X8kdd=$)({&% zQpo}5@2JTQ*I{JK}qI_-*hYHV=*oY_JDycwtkEJ(45Md4#g>* z>7KMR{dd2jxob5ZPIYC1p>3SbIO4p|XT2o*5nhFMl7^No$5*VtAryem21ljE1}TKa z#!=8P5yz_Z)@IE3(y!Z_iYA!PlFL}~ZeE8I3(H{Le(g?9|~ggV=1AEB4MADE}DJX7y{CHw{RlDEcp4T@y7Zv2IkdAmv_GUZ+zzuxk4--4FWaj{Zb3v_Ir)I`X6V!A&`-#| zMrL1ez+d()Y-5>y)6e10d&fV|NlZYL2Ic$lww%0n(A2JIItNW5O4?HyO{@93- z;>q{T1qn2SxCRj^p=}14?Ar`(^J1oUq!^lN(e|?n>segI@#x%4Mf|Q=NK57Y6o0 zrzX!Xfl)3Q-2ph0(Ou!dx_-(0ZcK#4!@O=S2On{e<+J2D)_EMo&+;@wy^5n=lcg2L z&tPk-b>71lySr0AZ?3yOc&)`|9c)g3&GdqGW%EYezC~Mb9R;uKN3i{%&p1$N->s5- z;e+;IvG~P%sZJ2$zAt|^hzkf%zEN}#df?IA)i~Yz)2PF$cy9%-7zYvt! zBwH?BX%r8X>DKmus0EO?=qONx{GHkv~#q!a$DZ6_|BZr4g@#ly&8OLIoJK9IKFc^I); z1QVvs+c;_@2fqoCpw@MdF4;C8oeWz4@CuY^_WVw+XJ6ughI4k8Ui7s}u}V>0A`+$t#V`3g2z+_^zDLPA#;#4JM@rWD~#}+7wy~{bZ91(PT+{ zSHIBC-l5Iygh7*7WOQhA2vM(DWDJWyZf$Zk+E{7hD)mT+83i9A@T((0Dom{qK=jxM zh>zlcTqOGKd*sG~&*%{I;b|uzyI(ARTh6U>(2+Y)P{V9|3wyB*k?34^K&NF}@_`t2 zq_ju~lhNmdvih9P@rKXAhVn*b$3a9W8vuU}ABqS?gW%8Ni}~+)d}ypuu1IY&zcBPD za%&2zy63=b}aGAVe+WOYMp45ReN5t}^3XWhN#eNw!NIKY(T~H)_nqd*V9U z#NfqtwjJNCk_Y*x-+@(c@eH*yc1Z4Dre)dI0F_M)!G;*N-MKDf4LTH&9coC~GRe!a ze!epWyQf~l#`3q~1crF?3dU$FFK3mQ)1Jf^vTsYC;5YVQohh8Mel8j^LBK~CPSm0v ztx#3Oa{zKl=n)@&hO?$Xo8YqX-b+*+JH!TA8_4-;szv(M7CG0$<0cnj;u8rkO5x8+ z8)TN{(d!cJsTykUYV@rHad4Ox~7YeUo$XZquY zfY7r*)tX-*L#)1ytq@nA3_Lh%^tC15rh%@6o5q1@kEX;ZcwI__?t2esXQn}%{hSG^ zfWllVbX@=_0d;N55YRW@=s`f0sk@QXod?Y2jhJ1~Tw2Oldw>?X@Q~{cgJUC>zkUi2 z?1EowPGTv?PIeQH=J;_mr*JwODA^_3Bzcw5ARL@f2KKcn1AD`}XwMWq7Li8nB0cQ{ zkc=c{XybpFDGtX(%(|)RgC{V|sUsg;NKGBhTQTMvXZFoy>H+$@0h%TQtudWM)5r!p3(j4Mgz zqcRr;+M#yI4Uj})yi|fG@05(j)F}22QA|A7#3=dCDMsjQiPafTnaw&P1qNg}W+X0t zhUv)G#>HM4O7xK&GkG$+m#X6(6RIUy&+|*I$-ar5lH}G(;|o^Rh8Tz1YxH8l9(&v> zU}bXE=K^Z+l!Uj8!3;QoZMuA z)3ok7uPK*>7%!{eBOW#(9HUX(Yhm}wQ-b=J!0V-jAPw;*9!3}v@^Y ztH$A69IMU)nKscrNuk#wf07m5oeLwnKm}bep$0J6T2V~&pv@!B$e^u1GouwARObS9 z6*!JOuL8dJ|KF$`lcM$@_y>Pg1)NrFZ?wV%BHD5442D_5GGyv8oOEs-mkVjaz~>ov z@Cl4K{t!m=vrdeEcByO*PG^jzFRY>syv){HxhW2G`6od-MH{=jwPLwUi#p!xi|!70 zWNVSnp!ZrTu*{1NS&u}24A)L#!A+^og1h1L$7(q#UF-D6&d>c8IC;cGqrMFP1PqU= z5YE$Ho(-FMdl)CrxGU4Zt5%}*8^9SAZ7mh;B!EI~`5Q7o;nxDxc0JsN!yOfn$?ffa z?b)->B$>v#;M;OPZc#;hq#4_79KdxFEsoh;u^lI^3q|#1NPO@(5{D5Xj{wl*?WafU zbCdnl`D(DG7%qs|MTNRikFAtW?Y`zkmlj91EtuQ)#T@EjL9RSlUEp%i?xOt zw#%q&Zmih2sA6Q}xEyU&#fTbXT(4+Fv5^zHvxG~|@Vb)3df6loeV7%^$$=T`{VTS! zKbqOsIPAy&i%Xh$zh{mI2S3Z&wT3n}Jo-zV(>lMQ4+m~%5N8|*1EW0HvrCM}B{+;( zC!p>ci(W{*_Rc!AraazM2RHL!V?c$b;G1J|M7*tql zzZ@5$z%m=#mtUVJdroWE0_!AsJf=$n<%VujXjo| zZI#;r-ItiDVtUCo5y!$2YHM$9HZ^7VB*db@)73??w_WX z^@v3i0a2h({QVLW#oO0O6bJEHa|ThATSVNckUvf2Bballm6PByt{*HoN$dxV9h_)c zE9IEaV0x}a2^ueFt0*Xz(UTEP-ouRJWQH`FASxGZL6>9lkwA7;X1P=&uz#TK68$LJ zDE2ubK>vF)?;REWjTvnv=);iY#6QiHe<^@JAew+FFY!M@s51$*Sf;?HD!4Bv+a_1f zV(iJtB|NLURTfuNIz=fA>I7UiGV7NLGi)P7VQND0cTw4}a;Ck`ygj1W!XjPa(1A## z2c?lJ4%d{NWN%mp8?>1|Ui-1aXDIOGy5vMDf zrl%k-F+(l#Tn0;fQh6h-JhW$pShfqja2k3tc@)70r@%BBGEd+`Bh3OJ8~)>2Y`B%) zCKkF?<)6s(#Aa$Ru5T)f#c@ehWW6f#uhjWldA@zzx-`#pd7A#aSJc7h)cNJ~{irFJ zPPPSf^G=j>z$^bQx*CdT)IhJCP<`m(kyK4Evd*O^1ok0)6GhyAhILrVTOn1+5n>an z;;A?o1ZY)U%txG7Ku;HUsuyk1 z%UZSYeZ*~#YYTp7(x{j1gCB7pTY?SZ?zg+xl5{KTPEiD%h1mzTT19fED3CORS~~Ey z#?b&|HRB49Dh25!!O#=BlNNS{W>(s08}j6YLq<7 z^W7{7Zpqdbivr}UWzSC~1WM1phd=*()puMoceB57Ub;}sYUVy%&>?1^1=!-ptwqa! zA1ce5V_zrlYs9DEW~yutLCb{mc7A19lpTL zVsIIS7=e4N5nn>klTa;2Tm~J)4ZY~ay>M#YO|L(|_lXzYXEi*c5_6pKF~cSyZia9) z$noAhjvkzr&miRNE`-3w>q>~HJ0Y|Q6d_Md<7rTOKa1scy8!NgeX=$^%*1aI!ATk( zqNhTNdLXZRJFAL~b+8TRuU`U8yqgGKdM=cc&{cHN6(U)zg+ikg$klG4@Q~$D2Lk#~ zibT1(Z&0Tj?~rdUvPYZRY+eg8F9>kCra661&3Q4dpH1TBHXM=S@C1trejbk=-~f{j z8u8Io@CE{0ESbfDj54NFf(d)YFjhg5a1%|@*Jf{JHqz-bZmow9e^`)*dMycOrvUe<$|%<#aYnO=sAWf)E)S zDUcm#D3*^|x84Y;esCNa5Rr!_ z6t7v1c^7110Wi-d^?a(vsN=SSK!UD1AB^wIdf|fb0HL?(NT3q6&~9`UF^P570wtE^ ziYBlc=giI~hFE?MKDfNUN&^5}JIHFSMz_BG)}uTtvl2@&VRW0qqmEugz{TD|H_BkQ zJC;A0Sgz?cAI~*(wt=z_B}bOJn@I(lx)I<0k|K**#>BZ#V}W<0TQ7&F*3ZspBMdr6 z;OklRwB%%}Ig29hi_k1MuNNSjo^T(cbY6!LFOUA&O~nWU1znDS*5HT7&C__J^f|K# zT*Q~M7{Tc!zPQ|&>7E2G&vj43kt9x#HZ<5`sW=bLXpV?ts+`m&ed!A}#9w9_H)*PP zv7#7f)^I4^HfKb#AU$8$Kd_SFRexG_)5|QJ#F+5lI=(D38)w|!_ZRKL0!`e04ck8* z>H)6uVxRF5Ze;k3kFn;s4jXOIvAVI#i(S#dFUVOXU*sZS#7mkn-4$c!(^vKhye;1X zHr#Os4$#BUL6YD2Y0hse%YMA|WE`2ID{e356Rj_bqWgA>^#J!8>#0XeZNV#&H<1A$ zHqY3F6KG=QV_+jXgGuOvFh1ymZTOIx^YLXLY{i#-5W$yc02}4^MR}JM_k|^L>_Cl1 zWhrm=UdR?!|G{H`miW*?a#Mh~*gt`5*-6PzS^xggpUTOu{SR5(6d$buAcU`Ym})Ol>V9dc{Nx$8Oq33TGGX zqokg2)g;PPKN2oha4u1pibR|Qn_TPbS()t%clHV#i@)|D%n8R8FbaKT>w`rlKU9Jd z=O!;iqE96T`grG$a@PcJyfHWgdV~4LBv18*M!AaveSnGydC9@DBzS!;w3_5KFXZfA z1tEy4G0&~gHZ-{$;?Dzyx+n4j7~X>J0MS~-M(D4GeOVaQ0rwfy>BYz>hp)9A`Nq@k z?+6y1gNsc2I^Ti4xaNr`W`6wCzNug9Wm~b%-Vz+3NAVvo)h(4*X>baMp!(_?E~-9w z;E}u=aC{Ih!Kj84iOys{sJ0u%WZBGz1Qx5?H{jtQR10YCC1_n`5=QH9t|zO3W&j14gZgazw(=HVBXZO-r=Lk zzK!JE?F_Ah&I!z_(dwEfFuDN?;LgeDrMuw2nMUWB^R^4b@Bfw32iue9!)?m@u)$pH zktR;!qAxmO5EdDF%-0#rgNNv0xqf7B6LQ5gl=er*nh!kmL5#!(*(ayNogu2!E(={o z@YA9NnsYq7`sOHY9gj{zTA_;548)TZ<8xIaA{JyOM4e<3{_+6}C@5SHF5>nDx5&3~{U!+ce=D-*;Pk?en3->6@*O5-%Mxe2dMY4P| zrIf_LyjRo=mllR1M-zWVRo1KwXXOKkrk$03#Pq1c@g3yDv^?YIrDesmJiq47PKM?A zCk#;tUZ&-_?pv11UyM)ZR>F3GT>Gt;VjgKELMQ;KO~7_)5&S17Dryk^1K2I_R1!=o z4S-Q!s4UZjUM58gMs%UNGAXt|#A(=ZKyj(F5OKERRCX?F<3Fr+hMvXMj!CUG6)ut| zIy!z{ugoaQ0R zb>pByY;tf4_IXxwujjQQNMtSSVSKKVADB`LkYSlpA%vwVC8=G6s|YY}U@lQDlsEB<&75bYDB`+Wyf0E(EOTip8(LBHBITRH!W#dPjzm=O!^dnpIs>r8?pT6G$dk3BQ^A=TzAT(g5Z`f<_E9QW=st zHA|j{qvL2im?R*EZTP>7e~12J?DXZ|a6B{$R)9EIn|~$3;!G)>adG0)QrQKZ=t9g9 zdd!mxmE4iMOf(^fYH^Us`8q;^e(Y$CgDM$JjPRbejsq`2Q8d4IMjby5K^?E7lrI^fEYFP6|N#==mp+fG-mB={Y9THzO8bA`dqyZ<;c**Y(--a$n5 zzs0ITX*l|$P?1!K&|Brww|JJUx?DLq3z5#Fp%16@%=DM5Ry2~ES-N5z(DoO_fpiuT7K}( zcoPq&fRKM<#ULw3xXBE&di*~R2+akm^!(90s}@I0M3tDDb)K5`up8-he`&du3ahOY z2dKv*u5QL+Ii?^JSsB>FEN&oGRb;nV7g2uf<|ziSzVD$ zfjM*xU;Z~r24rQg7|$RK@qC|p2heAX%T4x1ghaIDAnyY#5C;RwvPZg{R|?h2b}n#4EDBo5g%@pTB-D1FrRp&FP48{DJLQLu-BZ1+QgmDadM*^ z4mbvm;_om3l7kt|LKK@mN1G$sB`&@dO~kNF3|6urM|7#U!>^LJsbs!a7|RdBlE6&& zgaeL2Al|REdc! zq;W|{d{c4-+;fQT6Tic9n)^$r&c*7wzE_i+6m1IVYzJhe8)7e}$J^k1siqC8SS zxCX(ADdp|plUMyX$Zr=L&y+(9axD2vAukkj)8%RcPzG8P=z)C=ai%->4xGsT>ZA)?Y1(*>pk4}5x)YxPyn&~ z`>_WlUX*(%bij)NifnNC#{#7p;$k;K)D}3W$42!32MnJp*%5CcBXKk+W~5a@CC4)S zf>k1UDx*&$nq0!rqYCJFITpG%0BYvZzXNwRb1^!C5*YVg`TiN$adZ!lx|IyK+17R2 z|Jaz%RVy!;B7i~QGv1a@efEZpjJ>d_7|nR`F?ywoGhiJoeoR;ImEePDJ)^j`7m{C0 zjPkqGy~K>A22ke3M|COE#^rw`(i%T}NiwBG}cr6Sbo~ zJEYb!IShi?zpO&`0K)tSuz_+b79GHTV+W+NRHG&Hk(OpYTW8ZEsLh5BV8`OJbB?SO z(t~f}JJf^e@LtLQ`HeKMd53G4xV{#d;0p_~-4Y#+!NC-fh3^6O^2V9&>wuxO3x+8-|%Y0ZYvzwNJv< zrzOYnC?^5Fd76G-_%}clm;{VVh|zS$l*78VMA<}h715BNK*Nrm&v8v>3_Bhg2yXNV z#1PBx9FTf$;yVPzZBhfo#pvY_HW0#waO_eO&_Bk;(mzJbsT$5m@X#8<23r zQ2k)Do$9FTdo?$*3Y?{%B)`&#R}#R{xK%EM_K8(13A9h#_As4c<|}H`K!kLW>sFxD z3Sin&S%a)Vt`+D&C&^O63T(Fm8?8W-6@by9fR|Z;Mk`Qn1!@r>kN9H{#_AQt0kxmQi500i+p-p+UZF_jCUDql3$ zeVx`orJ%VYn5iw`3LG2jz1)^NwTrVl zdEDXi_%?~U8Yk`dI@xI(Nq_jjwOV-Ei5M=SPMiq7*+uUJc_GCy=D3VQ0X;z}<op~*BicY0cR0>zobn&5s?P4{~%R%M)Hz$^0JKN<>}-nGm=-NlbbS=FO5&Lw%ItZmTmi6d)*g6Yb z8^zP_n2-+s0~3>4^x#N6-x9wLbQHtXz>=9t*D_eKja>zUNxtQ?Pn5dK}X=Vne)BoJEpkNxC>^^ zk66KaJEs=18r6WsQY)C%q|~?8@D6I?yE1KPvM;>ei7Vp%^ZqRLlhzOz1eWQ5sN{w6 zb>s>fS4*3Sx=0Tn?4{ka7a?zGUUsv#cn=d{Iv4VoKx<%#m(q)r{M|_5o1(qIF}6=? zavVSI+~hYp0tHyz;-G-GR{J$pRH!5Fi}lic2DVo7|A~^EV)8OPR zJ9FHKG9^ikGgc=o%LU1=?9;8s@>WWF(t zm+WxtjK0!38c5YJ+cM=1mXAt=@l&DB;3X#DOsXv9i_U`pLsCEwmRa~JDc%AnJ+JMk zw8UV*!#j9gw$?z?k=CC}jY(zZ=+UK8SU999MQ|lUdyeIPeet=<{BLGC$W|4;H2+ud z3vxYXe7PAfHsjUutIS2sxzrt!@rT??B-}&t)QDE3&faK6YSV-G+EG0Zcg+MGPm{ff zxTz%(YeFp3%%OQ$&jAV$QbsPwxZ$m(l_{wk;01Rh@*Ijbz^hA!vKj=;dJ9cD3Qf8O zTvn zXIwg8aw0d`Pg^8C@iI*H9RT{)2biN5*Uco-cUcR#ZEb2jzI7N?`l?teQ!0;A3Z@$@!l7t zAH>4Pxtxtqc!`arlY=3q#K(WCgavqEY}m<*aw=nU-MB^93jXmi&Pa2;LtD8qS!cWw z+Bvjj6HbomMl#SJv(Ct@F|c$-+R>$Wlx9@h?13;+0!QMNr)<4*otJY-KIV$NH_Cyc_=T|>N7`fFt>KP7vxm;#7XrDn z$BVQ3bE2>sqv#J5gD5THITCGMSz#LmAwP%ChgYhGH}+F&J62 zqau45Fm_ZH?a}UOMtDqU)JPQl7lNS+PV-|c)A%+xkgqXmkrpJv8Exk)Pwc*;_6aff zNT0D6QgxCGQdRUyrF}2n;X<2YRa;j}Io;o9_VKZ*hgVBE-G9vN0kNvJtEHUoAFM6> z`w{5Vcz9o)w(v0oVg2}i{Pdq$K0GNET8ac8pNNVg0A8X2!N)CW_7`=)2(u>p!14aF z_Q2rEvJUN@b3x^Wv0fLzg34JtFE4Sb8TZ@eqEVUx;m)k!;7Z)WIaNNCd;XPf_)Cw+ zvzdt#VPfNaXZGxq#)RgM%xb<1;`Mo=A5uei*}#}@NK_~0(ytOfV&ag7;63>eqP0{l ziBFN1o`xvuJh=exfn)Sg*ffVq`|~Kv2i+QegOaE?M_Z5ug1wle9BZ|E??h^159;h0 z=>~2=AByx!AoW3ldjVlDErPR)w$Nx`E9E%ca#(DS_Ka-+u;E$p2A)Gv6y8b{CWY@2 z=e38$S=ckqm-=;~5S}bWA+Hc7J~}M6oSw1G0yfD+e~QG;foT#)lEkl>kTMW5duA2( z?t5V3F+j>@cYq|-?05#wog{R{VR4S^8D|STtQj3cS(F{~FlFcG!(uzOXKeMrCYwDu zMdFAI5=WE7UmO}&eAeTeH-aK~})L$X6<0LrJ7WHzE8Xi2Gy^O^~ zC)8#x3TP{}&^~Z-yv9Y&s8RT3t;TE7KjD4DwT3Tq!G@>srwiIaSO{(7TwV5WEkXzD zC^sIK!gpe<*QkL-K;xCJ9kte`LJ$5lnl);e?Zol1M_DaBsc$T*Ec01N8KI086 zXP~j;Dchu=5?CT9RjA%7ze22sLOZ3nI2Kuj z&c!cd$(qKq&@jY$DD;dfbh%aNNvn{b&3T|pAvrL5HP4+3(uS)7>NbS?k}7wwrt4r= z)|&>f9{Tt9WK((~t4B3bU(P}x(Sa_8WtDhBP1%mwH<-MSO~MM5VftWVARNyjPVcGK zxkvX{>n=w|t)>b*jT2V5^=AlfVj=QzN)cSbGO~#KO88w6pn?L>B7dL-VEK8@Mk?P< zJMNFt&l9-=na{DHBQOYmG1>3JHCdAC0I44%jC(=2oN6KaNFqaZ=;i#cj#9|BV9SKp z)9C)>q4f`fLx@X?hPL4T41_TvBz3D$R8m)sqo>{`6X7E!!n;j`W0CosovJkxp`L+o zlttl<7Q%mKBAj9(Jl#ZiA2JW6@W*e{O->>#DLlbKn2iICDGK|V2tR}mh)w>YM+%?F zK==R=l85hLOItR%cP7GSq_RVzCc<4kQaCvSq0gc)Y9XAKi7;p)Jl8~c9x@N*VXq8? z9eYg*Jr=^hWggO;E%C+(n0P@;xa1aq$B53JsEkeZmogdR{nbVQFRVQ@(sgLXkLZNbr) zXQV>G+|*Z2)ax;q(JnZU_!J_`Zo{tVN3u@DCW z@rzw}Y&Ox7r1I{;37K+ubaP-{gtCdtdn^TyMRHwtuSaFsMm*Go$3k%qhQ26!Wzj}| z_G0OU_v18?bZf!SLbq1pdil&~S85WoVL18VmdO?Oo{4Dy{xa!fvpiWThgo{Z2R-p! zDb~`l`~&!iX}C;?QlnCbZLnj5n`QgNL@c({cFlCmpz;C%o>grY3vo|9?T?A9{gN(_ z&P9{l*M;_H`=a<=nW*254WH-bon$V-J&+ZijneVuCVdaPfF+!A_ zVU1)dW=Psce>AgbJu{2eGztOyA$Q13YfOQwpQ4i*$Hb;q*u`WD+XD~RPxt{It63;0 z>FmH)U2e>1lWc#?@wst^5%3>{RxxI&8UbJ!^Wc^hMW-X*Vl=%yWGl8W za3wLR7p=oY$6p!##U~(%2fvPCAm+HHpXz*Ku^38HWgn$#b(HhCQ#S@$1d-ToN9j;I zQ^69|hAyWZB9EE)yRe1L0!LMsa@(O937t#jb$>>;A}Suo;vmufewwRDgbM5eoP0xV zgx~_!4>C96h73vSe~mA99#|K53PSi=>}8`Rz4ss>m4|M8lKAeUbX|l{TPX;s*MZd4 zSzOut3fE5L>CXqxz>deu4j%7ZGn43X)@zH*{3n)~o5k;-S+u^DMc?`DKPW|wLpZQ9 z_ydHkePl5giirmm!c+xO8Bd{{E2HuqHf&Vy6N_b0_(@d~f9d6RnPkNUp=xB3H9zpj z8JSvTm9;3@BhEJgDFC?V&%^eo%A}HQiILE&%1$?PoH7UPk>xjIBTF2}ljmE}G0Ta; zzQ?LlR``j`wQyKuY%)`!Qc=E{s9#enWBZi6|VbAC>b#RZV z**&K2&LuyT*_LkGyFI4HdrW=GOzp~@`+7{B*JJASJ*HkNQ?XMnE=x!eMrdLxRFMju zmkO1nLZ_rcLsFq5QlY$5s1x&)x*PF*DwIrxcBDe@rb4f!LhDkY)v3@wQlZCFp$Ai; z-=sndQ=z+3p*gA0^{LR6snBE@N={FNAa03;_(RT&R;l9{J}U)Vq*AZtdtPyIY$|<# zO7|v5Cr?feOqM0jVg65Fk_Soace$0u5@(+R+pd}??@bMt9F=sTP%i)uW3lzB*sBaT zsqk8Plf?Yl*Y8dSf}!e3F^u{9iV$_0093Cc>|z`Ch&yHB)O#X_xgW9n*3=o{_SEnB zZbxF~?F-zGXh2ez`w{B?60eZqMV#n4xZHt@%Q)26g4(U0t)Af&u{8ee!h?t&oq@9@ z4o4HFmoN^sUWLC|+?Br-Ti^x1$2%x`EdA5k?`(!PhE37aPiw!jDog&f_OZP612@`x zVhQkzV>4@fJ*a9Fj?C01m0BvkLBKpAyYuCf;OVw{r z--6U7sVMHuwBm4pI16(HZN{HIS7V?RZzq6Bdju4?%-AV2{@eR8{*0>A_hUvPHM56s zX(q8VKqD`GKZfrNfQ~t`x~}(ea1`^@|8yzmU7)hANTn-{Bei>_H+8M__k8sdl^*Tq*I#g#0`L7wUdP34bI^21 zUk_JbDn%cO(A!jK4(?Y73_iiQ$3Q*DdK!WEiY&ai%K?zMZX8q(U+fq8vXJb2zWK$& z5J1N(Ki7N@O^+*85MN$TjQq>G>$3k-^1ynp4Ue-eBLOkTrh}}X*W!4f)+rMiLy`yC zzheTzx*j7^gsPBQIY<@a9dJ9&{K%7@7(*~n{y*GLoXS%}Ah%jf{!U40TwEl{P3a50 z6+FPbkQDu0eoy@G2T*YreUQ4(^D6vrTRz1=yd2c&(X;qQNaS&#YH_SZGLjs*&zpmP zEC;_9fiDB(6x@FRZOj<_@3kC$@NakyH;f|EYK}UZ5kdFMUrh{{Iz1E3h9TItrdJvjI<$NdN zlo6W!6@)VIn@rwZGR?Rh*JB*-{}bJmzAtBZbLC^S>yRAW1IaSl^@Z6jj=yn#4B+1) zU24S9iYX7Uo>)QT=dSHpzv1vqSpgJ*Yk}(@#APz%nr>VT6M@AL+yd*ukXuDF@@q1L`EUDy%L@0p!P@pfO?&7uv99 zINBqg*eFLwEdO*QA!i(Oj$zJXm1CVK$G|#fuNqk9UAoi$$)YLwl=>5T7557rP0w~^ z-F(G5A8OAO1!Mi;Sr-I~0Dfb_F_*YZ*5!6Xpc8?`y7RiRZY&GpU?Qf6D`)6<$PD`F zIufETVtq9WKfi*9wS#?I#^vG!jJoCwRe1z5z^bnls~lv=P%`9BoT$iXuX*2c@;=G8 zCjhPPTTW77srNPIWQ_NOYQ;bxrodWyZ}ZI*Sb0l(GUrr}Zj5uOmjazQd#VkX;M4}- z&C5Na5s>O>XedY=#$?(EU=wSZu?i(!SF7PHKECyH@Y5jaJHZ?%S8gzk8%$Cn%@NF6l`(iPcJkNl= zM!{mq<^!Oduc5({nzWgC7Y{qO^1dAIVDAwXA1kG8-cNK%0Xtp~--&ChKiy@opnSKOaD5CgXQ1daL^GR%UqzI;gIAC0`C=w?y zj}tg*iC*dwKDg;PnLhiG($SpS1x`EwXrFjUCZ_d^W#5ToyJ4P@*n~SJOS<1Lwcyua zpQ2Mtz*e>zy4HKLrvAtITJ!#?dB4`r9~RvxhU9fAfcu=tuaevvh`Skl6j68LPnC;L zS9*9;8Sf5Z*5v(Um%#p|SzpzR)csa<8J;-sFerW%rW`+3gnx&ktM2j==BXGG?D{&Q z_J}uo$)lm@nYsM2BS;1C;0;C?$q;ZS=IWdTp5cWX06S**NHDE|)>)z-(_;m>5~I2# z?`^_9v`st%D~c|b36%~aP&wAr@A2z zWs?O|CpS*e2;;6XCgcOeWlYG!@OPR_;{C@E>NRg*H6kc(z#r>oylL`ykVKPb`B!Ri z!$d)C;x|uo$eOPlqaTE{X)u^N-lyO~WtW2k;oC8UazeK|&39`D;U)YGeW2_ImpR^| z7v*AfIpr7wk-Rj{F$Q~_FCb}R{|}N=d5B=`X6y#L^71NN!*Zuftp}O zVlYxndss3JzvfdS$`1kCTdUNW9IP>m$&p-2s$=(XZl@u(MOuHoM-s1T?rV9 z#|1d=1C}D<;>!f3qNq3f1u7Rh6i&=6#+vDj(`IkB{Rx=kD-xSW@vYS`!kUm>l&xy-o4 z#kQ+`+g*S1C2PJ0*hi0E;>2D+B6$pZIA!li`$VTW%UNl6HirNvDO*53vt26n27X@y z(haL1poQ*sX3fS!_qdwAhpz^;!b$)?Eq$@Vp3K6TNNb|)nn|J;zblFETK_cE4>dZB zJrmwP?>4P*l6#n9PU1I6o4>!aH-7T{SU+eSW^Bd#?e3xdn$-@}YF3}T%Ge4ZY%|<; za{71SP0-OSc6z^%^6SYnrubpL)Q`hUDC@`JPgmGwk>M;tx7KPf1-~w6w|=^>-!Q3A zC@sUp3$)e2F+AKMIi{0i(B?gHY%S;b435E=>7C-(G^xGP9AhRqcKJKxSZaL}{;HOD zfeJNemgc+=GsPux>gw{yM#0VBDv36q*|-jV<|XKq+I5G{uUxO{7`bNub7uK(`yUL? zYz^m&RBM!>m2M3)W&gk3WB*4>{;%zS$i{!&|2XrL$+7>g|FNmot^c7zF}MF`5x8Mb z7ZI5Gvn2vu^+ozU1?ydQKNkY>l^-mW?&ib4xaTpKX3LH4>-893ox#twq{c5??LuHX zUfO4{Oy#dQ;`gsiIjXh=Ts)gqJIapV3=HH!6XJNxxyD z`J=g8HB^R;!zTd?FUo5CWpss#?x38+)UR^O>qg4ZmWjXE#Zx(8>-lL5bi(Q!5GoijE3R%A7wFDyp80T*#M%etRe zyO%NL?dL}SR;DAqQRXjJSEl%5OH09K^e~dq!*~D`9k7g%U}d5|AA!9AO^5Jb4Y5Xb zUA=QYOThqz2cxP<_3tmq3o(n95P$uFZFiGRqS zCMwtuE1s0GQ@u^c;IC+fkY%oNJejMUV$qD!nJ%z;#I2EiCZz_<@K_@oIyguCx?72H zEI~2N26&6DADU2Oj_#S}=&nwW?j=d$m!rD|Y`~9V`P~5XyGLMjS9fCvmpLQB4!O=5 zL3VJVgLlm*VswvpCRW3$5=XIq46_$dJq}ouZ1WjI^}ILqJa{xF<|gi=d)i1ICd z{v&k=3sobFtEyjpqLfUn0yyts0{H2L-Yf2gzEvA)e|}Ac@Q9e|I)Sq;AZ3qOBy-aC zOqpD6<(kVaXW{`IElbZYYCV%)Uwk$_y^vAMkl!MO#*MkYNcpeF$X=n*4dM$=Bk}m5 ziX!Q!W-7QszP*~DHU;0v59oV}1}?u0QG6p0%bfqMANz3ZycZZ0w_>J`Brd}LCWDrw z=U@Du1GcI7x?c2LfAs3yn&{=u8Xkz43n3`kUCDFKIKrYA?bqYG@bl}h5Ti>xNEHVO za#5-aYYe>Y#t7OWe@v&C5+ucllent}XSL-G=ZaZcyoROE~%b2e*^F58zL_H zcWnXFyRM6xaeuDtBJS+njOba~ng^jZ-(mznP4zPhE^w>o3X(;Xsg27u7 z94nZzIb86ADAFQHw)o3-bYtCq#kws}&&GRU{Gd2)5rP{#$qn2Fd_{8OU0glhk&_%z zvKwGLawvF8zX!11@g0h3I}nmLk44@_W1Y5YUDW#kh}Z zjCG0Usa5%q;~rt#tj1_u{IJOiePxE^<9{x37c@=s%`WRjifOga*d|x#|B&`3@KKfb{{Kui5(G}L zfT$?ZMocPVqNoW(nF$G;kqJhNh^^XK5%-EXVR0QyBALYL<@V~&F1FIWz1?i=n?T~`Guqx#Ov~^pHN@J<)Au)Kp@?a9_&8~pMqLt*gA!wn%>6^gYZ$4 zysw%2j#@ql=!P0y$?}Qq-#YICX@V=AV`rsN*=FapOF=lu^G6#n70Rk|aWR!RfBBwp ztWl%M0ZnWH+i+TWF##0s-uJZYU}_e}u#LNTc$9g|z^BGvAb1Wm0~OuLWtpJv@;B}3 zjaJJKHI@EXt$QEVOMDmyC|>2b`4$Y0Y=5tHuQq-Wys4Y6kb8S*rbLZ(8FJm%b>Gu& z!ZSFPE7#n~Tb$GAU`pKVygQQ*@20CKO+QI>d@`ifSfvX`0y<=88{VD*nnA2c{BfGs zvbs^jifD22KT_S^cffQuK6o=q31{nex9chh`3@sbK|+;P&eHFiy$qhZV676F`$<~* z??1=kL$`0d`r&6dWjbGrtt1dIrw$a|`L&UC9k-8~6MHMRt^1?my4e2c+qu#G{zz@> zrsg@7U32P%!{yeT+d5VVPJ-P#ii1U~D!Dawj#c;mpK>C(qEWx9Jr~psxG#-G`Ged8G{_`Vmkkh>oAd<7rNgmu8+MNY(NAB@`HH!n;pl5s@bR3=oy>IN z8x&R9rMI!B&@GWum7BW0P=FH4QG$c)|W(J#1rG}Y{ycZ{~tlE~zK8P3r@ecq8$ zU*9kFVZ| z4ChP(Av(Z^?lO52AOb8$rdrFdbU|l_37^E7J_<#iTNm46AO*q#`8x%Ls=Ff7IR{u6 z>g@`0QURx!$vRE@GC>Nb8jhH2O21qNSXLNd!QTn%_w9oEqV+)$CnLf*aW07jId{j| z=`P4WRWn}GU&A&?>h2woe=lSvo}HceQYF431u7~$ShO-&w5dM!DsZx@P9)8GB#c3q zrlFr1aAL@s;9{4q0rdeVuO=QLb*en7FIrXfYB07nUD#9qtHPE_xapEfZ+5vmO1JY$ z`fZK(X2_&6XC|kClCQe{Vj+*fm~5{@dcEr-TjVS_ac`qo3Y4SMiyhbF|32q#Qw#_$ zEl=yW-&}`0#z^B{lzP$SUOID)iiv}l<(N>vZ+GvX1fhdZ0KMkfE&Dm%f|LaT1?U*3 zGon&p2}S>(x|Gd;9selwAE&|(nGym21Q%w>JofJCz%YW5GD-T;0_4mqL~Q2_z}TEm za2hJHkPZmeto~p{!(qG28_Fxc}iV^$-CR5p|;x( zY}fAIlXy%J8~d%1Kbli3!j0j$d;6Q*+dOJ2+vgNcg#i+-NN*$WLunUcqc-+_2XG8^~?2>LSq zID5?x@M_nikNK0nV}gGHtv- znPm9Gp=~nt6ci)JoYFpJfW(-X4NS=glman`sMy_waA_kqE5nrHj6q#P8QvH<&O$x{ z|COT-pRNX_B#w;b5Bt(>b{bW2YM?X=0j|HZi}s4hx1~F7)G)a?tkK!Ojcw+67{6O- zW925DaJlvxH6(u-H@C~{5Z@oKFeZy8Dy-ZuuW6xKZq!cs6`1AOS&`E+TQa?_eB zp5~=OF9c{VOhAcVDxZJShd3W+fI%3p!6CU?7h^LJl-v=-?rt&ZuPA(sUxTko! zt7{FkW@5bvPOh-&PL$Z+6)l4Ucz~I~@}b$cyOSe%Oq&C<8iIH8>Hz*`g=4dk-ZJRI zHmdFIsoun@wg>qT>tZKvR0XLb5!1f_n~c0NMbUH&Y|}g zwpMY0@KHtQm5qB=n+*M>KY_}w)O{}8(B1t}Ui57%x_{swE9T|=@lxN$_WSe1WXTH}#;Jdm zgry}BMM$=o(A(-+EO}ju|7^1>K#{~2gz|Ufi7p3hj1)9HKa`+?ZC_f7*p-c76=jqN z+?7bSz|p=I}~qbkr55m>mx(0 z``CqaHh2(cgJ0uSQM2KdBZGRmEz^qqg3eEiUp}ZeT)iVQds=)H9^39Xgy^BGCfYp9 zj!!-muHGJ*0Ymlm&+B5FP4F~=KUc6#=)sm917H%8=Nol+AAD7AZG9eJYPPK<4NZ*=lhIJo4Of-O5N`AZ2#cT9q9+8Qj{idd&05PfeFn@4Y5(Kh_8 zw7fg1=n&V#93PG$8APx83RxRXg=u(Rd`R8|w7m8@$+G*ShQ(`|CDHTq~#r#ItPC<~tZ&Lhm* zDBMjGP4A@7LDvS+tq_6(5Cpxi2+3;GCe-w)kGZt%d zy4mDhA?xFR(wmWIH9*^8>xJBa7wlt)hGRK(u?y(?N<7c5vt!Vd!NSTetlOe=!PUQC z5<~-UDDGML+L6&0APz@j{1Ut1I)Z5Z*l_2K5;y;RJ;T6mD+~_p5$t_kn}fmU_!(VW zuYJ%xFFK32#5DuBT%hBz(hZanj2_~QHuOIQ;Bwy?L1C*eC9TAt_t%iQNx~z{Lp_rcV!> zwaH}QYvz>fB1Lq_QxbNrOVtaj^*cOd7NOxVW)U3d-|WaOl4>?x<<1WXL7jXrG37sP zuCEncSE3{Rzfyl;TbA+U)W7H_5su;59vuU#K@zW#i4v=6NMAqD&c|~Kl7SoKY_Ei3 zw~b0p&&FTq1-!U<;~A4M+DRrcN*3qeaWkN+QkN<}qoBZ0tTz<aaA3B zM%6$@Uw1y#m`oX*^CyYkY#!EbN%-n>^lVE*U)N_ zXN89953ME3G$3HH3JMdMbl<6Jf{+Bzx}9>wCt>LAsnF^FqXg=o=+5nWl5ibQbFNy@ zXO4i224f?bni_kE;Hz`ZbP2xmt+tE6z==kJoUhVA4Xg?#PS>Uw3XXD7j`*HaSh&-j z7ICVYCKao37nyh9yfpp3+4(&mItX?OfT2=ybg;j~y7yfMPUGE0m~+*u)cqPEa(t;& zVmcKgP*h*ch=>R)qjCYX;Kk{{NY)gW0&T`jvWazYp?=yO#i~_~Ft*DzM5g7v(gAyE1h(T!6nq0iqIi5}m>y3^c*~C5cr=YO757 zhCW={u0n=BU@!%OU)hKw{5|YaP=zNsym?IHj{Dv`{_z8kjr|Z%DiW^aYu@o*vlzMAUHGT}(C6C0vxIN#*`rot>+LEtaeAjs?e*kqU|(z&oN1V~aVp_N?qL`G^PlFc z7(NQFNzB$$Y~bmW(^1;&B>t+d?{DY;pAJuW}1ULa!1bBekLlo=*>0ajo)sk@;sK)4D;xgyAYf+1d}=|!`Qaj$ z?e9tAAPA6Rcm3G;t|1q&|6tE?3D`Zqbl*IykEvdQZ6;U{mgZNy^CcT>JVi#n6?~$Q zriRM9!F~G2r@ zxm-f$ccKe>DQut$lYil^Q1!~@q;k!>sv+LEtD$=1f?43Ke5vAj4*o#TjQ)L6Yuz$z zATe9!Sg&oKV{LnNjp5(LkhAfauQ?T5fi_$MfMCiKOyw zkvYl936&?jfdpp;sExNK;9ey@Z?(y0(_lB(s<(QZd)aJ-v%%yt#wGNnC$9<#4e~E9 zAfSC9N+GVih3?K(>72=X+63Fx`>lKLBVL^x#8>m#YQo&))leE@hFRiHz1r-aJl*T; zJ;A*vK0+Hq+IMxoRM21N#?*-f7Gu6PV&H*t;a3F-tc- z_{^0lgBXYXNbA~Eq4D9ZDLG92V!(JeaxBF+2}?9O3z}1gF*|>%tjRGF_6dbKHR>>% z&1)utU|ks7?W{?CDpiF8-DOh!-UMgC6Y9_s_fVZVA6CkkcmuS{0Apg)nVI&R>GNwE zQ)drx*{Oe)nVR)JQ|DLM%z#z2tz<$01t%uLfd2IXpB=9`+65ww@VgJ05!S6=q|`1L zNRLUC8K>lUXOXGgJp!aYSMsfC`OK+IQcp z>Cc!i^yjt8jNa3qEcsmph%4u|Ivu(w)kZWRoMDf7HCqwXuokKeWn^jed{oIT0m&!FiKt z5;81}Z9M<(RCGRz$3%}a(R+wiy|f^2-o4b0P;k^3Q{$mruf|V#nTFGU+QM)!3TsRZ ziW6K>J9^@|gHc>4XjzwQB5zgXy{2;0 zocSe*i2Id8{QRR6bKEbJddX#c02_(($rWmO(T_)2GF(9@UtBV@nhY1ZU%B!&yQG$n z1`s<^<&_QP>#cjwSAc&vpf^;mxA*7GyO22$sH}76!0%4x_stXvaDHUoG?_o)?Fe(= zXV9C6CYF*S9DB*kK�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 C{HGoO literal 0 HcmV?d00001 diff --git a/src/Kuby/Commands/Base64.fs b/src/Kuby/Commands/Base64.fs new file mode 100755 index 0000000..e5e56f2 --- /dev/null +++ b/src/Kuby/Commands/Base64.fs @@ -0,0 +1,72 @@ +namespace Kuby.Commands + +open System +open System.ComponentModel.DataAnnotations +open System.Text +open McMaster.Extensions.CommandLineUtils +open Kuby.Clipboard + +[] +type Encode() = + inherit BaseCommand() + + [] + [] + member val Content = "" with get, set + + [] + member val NoCopy = false with get, set + + override this.Execute _ = + async { + let result = + this.Content + |> Encoding.UTF8.GetBytes + |> Convert.ToBase64String + + printfn "Encoded content:" + printfn "%s" result + + if not this.NoCopy + then do! copy result + + return ReturnValues.success + } + +[] +type Decode() = + inherit BaseCommand() + + [] + [] + member val Content = "" with get, set + + [] + member val NoCopy = false with get, set + + override this.Execute _ = + async { + let result = + this.Content + |> Convert.FromBase64String + |> Encoding.UTF8.GetString + + printfn "Decoded content:" + printfn "%s" result + + if not this.NoCopy + then do! copy result + + return ReturnValues.success + } + +[] +[, typeof)>] +type Base64() = + inherit BaseCommand() + + override this.Execute app = + async { + if not app.IsShowingInformation then app.ShowHelp() else () + return ReturnValues.success + } diff --git a/src/Kuby/Commands/BaseCommand.fs b/src/Kuby/Commands/BaseCommand.fs new file mode 100755 index 0000000..2819eab --- /dev/null +++ b/src/Kuby/Commands/BaseCommand.fs @@ -0,0 +1,12 @@ +namespace Kuby.Commands + +open System.Threading.Tasks +open McMaster.Extensions.CommandLineUtils + +[] +type BaseCommand() = + member this.OnExecuteAsync app: Task = this.Execute app |> Async.StartAsTask + + abstract Execute: CommandLineApplication -> Async + abstract GetCodeCompletions: unit -> Async + default this.GetCodeCompletions() = async { return Seq.empty } diff --git a/src/Kuby/Commands/CompletionTemplate.fs b/src/Kuby/Commands/CompletionTemplate.fs new file mode 100755 index 0000000..e2e1ac7 --- /dev/null +++ b/src/Kuby/Commands/CompletionTemplate.fs @@ -0,0 +1,83 @@ +namespace Kuby.Commands + +open System +open McMaster.Extensions.CommandLineUtils + +module private Templates = + // https://iridakos.com/programming/2018/03/01/bash-programmable-completion-tutorial +// let bash = +// String.Format +// (@" +//###-begin-{0}-completions-### +//# +//# {0} command completion script +//# +//# Installation: {0} completion --shell bash >> ~/.bashrc +//# or {0} completion --shell bash >> ~/.bash_profile on OSX. +//# +//_{0}_completions() +//{{ +// local cur_word args type_list +// cur_word=""${{COMP_WORDS[COMP_CWORD]}}"" +// args=(""${{COMP_WORDS[@]}}"") +// +// type_list=$({0} get-completions ""${{args[@]}}"") +// COMPREPLY=( $(compgen -W ""${{type_list}}"" -- ${{cur_word}}) ) +// +// # if no match was found, fall back to filename completion +// if [ ${{#COMPREPLY[@]}} -eq 0 ]; then +// COMPREPLY=() +// fi +// return 0 +//}} +//complete -o default -F _{0}_completions {0} +//###-end-{0}-completions-### +//", "kuby") + + let zsh = + String.Format + (@" +###-begin-{0}-completions-### +# +# {0} command completion script +# +# Installation: {0} completion --shell zsh >> ~/.zshrc +# or {0} completion --shell zsh >> ~/.zsh_profile on OSX. +# +_{0}_completions() +{{ + local reply + local si=$IFS + IFS=$'\n' reply=($({0} get-completions ""$BUFFER"")) + IFS=$si + _describe 'values' reply +}} +compdef _{0}_completions {0} +###-end-{0}-completions-### +", + "kuby") + +type ShellType = + //| Bash = 0 + | Zsh = 1 + +[> ~/.zshrc).")>] +type CompletionTemplate() = + inherit BaseCommand() + +// [] +// member val Shell = ShellType.Zsh with get, set + + override this.Execute _ = + async { +// match this.Shell with +//// | ShellType.Bash -> printf "%s" Templates.bash +// | ShellType.Zsh -> printf "%s" Templates.zsh +// | _ -> failwith "The provided shell value is not valid." + + printf "%s" Templates.zsh + return ReturnValues.success + } diff --git a/src/Kuby/Commands/Context.fs b/src/Kuby/Commands/Context.fs new file mode 100755 index 0000000..7e8ce2e --- /dev/null +++ b/src/Kuby/Commands/Context.fs @@ -0,0 +1,35 @@ +namespace Kuby.Commands + +open Kuby.ConsoleWriter +open Kuby.Kubernetes +open McMaster.Extensions.CommandLineUtils +open Sharprompt + +[] +type Context() = + inherit BaseCommand() + + [] + member val NewContext = "" with get, set + + override this.Execute _ = + async { + if this.NewContext <> "" + && Context.printableCurrentContextName = this.NewContext then + return ReturnValues.success + else + if this.NewContext = "" then + writeLine [ Plain("The current context is: ") + Color(Context.printableCurrentContextName, Color.Yellow) ] + this.NewContext <- + Prompt.Select($"Select new context (arrows for nav, type for search)", Context.contextNames, 5) + + writeLine [ Plain("Switch current context to: ") + Color(this.NewContext, Color.Cyan) ] + + KubeConfig.update (fun c -> c.CurrentContext <- this.NewContext) + + return ReturnValues.success + } + + override this.GetCodeCompletions() = async { return Context.contextNames } diff --git a/src/Kuby/Commands/Deployment.fs b/src/Kuby/Commands/Deployment.fs new file mode 100755 index 0000000..ea31003 --- /dev/null +++ b/src/Kuby/Commands/Deployment.fs @@ -0,0 +1,162 @@ +namespace Kuby.Commands.Deployment + +open System +open System.Collections +open System.IO +open System.Text +open System.Text.RegularExpressions +open Kuby +open Kuby.ConsoleWriter +open Kuby.Commands +open McMaster.Extensions.CommandLineUtils + +[] +type Deployment() = + inherit BaseCommand() + + [] + member val SourceFolder = "./k8s/" with get, set + + [] + member val DryRun = false with get, set + + [.")>] + member val Login: struct (bool * string) = (false, null) with get, set + + [] + member val Output = "" with get, set + + [] + member val Remove = false with get, set + + [] + member val Namespace = "" with get, set + + [] + member val Context = "" with get, set + + [] + member val EnvTrimPrefix = "" with get, set + + override this.Execute app = + async { + let sourcePath = + Path.GetFullPath + (if Path.IsPathRooted this.SourceFolder + then this.SourceFolder + else Path.Join(Directory.GetCurrentDirectory(), this.SourceFolder)) + + let rec getAllFiles dir = + seq { + yield! + Directory.EnumerateFiles(dir, "*.*") + |> Seq.filter (fun f -> f.EndsWith(".yaml") || f.EndsWith(".yml")) + + for d in Directory.EnumerateDirectories(dir) do + yield! getAllFiles d + } + + let targetDirectory = + if String.IsNullOrWhiteSpace this.Output then + Path.GetFullPath(Path.Join(Path.GetTempPath(), Path.GetRandomFileName())) + else + Path.GetFullPath + (if Path.IsPathRooted this.Output + then this.Output + else Path.Join(Directory.GetCurrentDirectory(), this.Output)) + + if not (Directory.Exists targetDirectory) then + Directory.CreateDirectory targetDirectory + |> ignore + + let envsubst (source: string) = + Environment.GetEnvironmentVariables() + |> Seq.cast + |> Seq.map (fun d -> d.Key :?> string, d.Value :?> string) + |> Map.ofSeq + |> Map.fold (fun source key value -> + let envkey = Strings.trimStart this.EnvTrimPrefix key + Regex.Replace(source, $@"\$({envkey}|{{{envkey}}})", value)) source + + do! getAllFiles sourcePath + |> Seq.map (fun file -> + async { + use sourceFile = File.OpenText file + let! source = sourceFile.ReadToEndAsync() |> Async.AwaitTask + + use destinationFile = + new StreamWriter(Path.Join(targetDirectory, Path.GetFileName file), false, Encoding.UTF8) + + do! destinationFile.WriteLineAsync(envsubst source) + |> Async.AwaitTask + }) + |> Async.Parallel + |> Async.Ignore + + if this.DryRun then + getAllFiles targetDirectory + |> Seq.iter (fun f -> + use source = File.OpenText f + + writeLines [ Color($@"Prepared file ""{Path.GetFileName f}"":", Color.Green) + Plain(source.ReadToEnd()) ]) + else + let kubeConfigPath = + Path.GetFullPath(Path.Join(Path.GetTempPath(), Path.GetRandomFileName())) + + let struct (login, loginContent) = this.Login + + if login then + let kc = KubeConfig() + kc.Path <- kubeConfigPath + + if not (String.IsNullOrWhiteSpace loginContent) + then kc.Content <- loginContent + + do! kc.Execute app |> Async.Ignore + + let! log, err = + Kubectl.execute + (seq { + if login then + "--kubeconfig" + kubeConfigPath + + if not (String.IsNullOrWhiteSpace this.Context) then + "--context" + this.Context + + if not (String.IsNullOrWhiteSpace this.Namespace) then + "--namespace" + this.Namespace + + if this.Remove then "delete" else "apply" + "-f" + targetDirectory + }) + + if not (String.IsNullOrWhiteSpace log) then writeLine [ Color(log, Color.Green) ] + + if not (String.IsNullOrWhiteSpace err) then writeLine [ Color(err, Color.Red) ] + + return ReturnValues.success + } diff --git a/src/Kuby/Commands/KubeConfig.fs b/src/Kuby/Commands/KubeConfig.fs new file mode 100755 index 0000000..98f7e01 --- /dev/null +++ b/src/Kuby/Commands/KubeConfig.fs @@ -0,0 +1,160 @@ +namespace Kuby.Commands.Deployment + +open System +open System.IO +open System.Text +open DotnetKubernetesClient +open Kuby.ConsoleWriter +open Kuby.Commands +open Kuby.Kubernetes +open Kuby.Strings +open McMaster.Extensions.CommandLineUtils +open Sharprompt +open k8s.KubeConfigModels +open k8s.Models + +[] +type Generate() = + inherit BaseCommand() + + let client = KubernetesClient() + + let getServiceAccounts (namespaceName: string) = + async { + let! serviceAccounts = + client.List(namespaceName) + |> Async.AwaitTask + + return + serviceAccounts + |> Seq.map (fun sa -> sa.Name()) + |> Seq.sort + } + + [] + member val Namespace = "" with get, set + + [] + member val ServiceAccount = "" with get, set + + override this.Execute _ = + async { + if String.IsNullOrWhiteSpace(this.Namespace) then + let! namespaces = Namespace.namespaceNames + + this.Namespace <- Prompt.Select($"Select namespace (arrows for nav, type for search)", namespaces, 5) + + if String.IsNullOrWhiteSpace(this.ServiceAccount) then + let! serviceAccounts = getServiceAccounts this.Namespace + + this.ServiceAccount <- + Prompt.Select($"Select service account (arrows for nav, type for search)", serviceAccounts, 5) + + let! secrets = + client.List(this.Namespace) + |> Async.AwaitTask + + match secrets + |> Seq.filter (fun s -> s.Type.Contains "service-account-token") + |> Seq.tryFind (fun s -> s.Name().StartsWith this.ServiceAccount) with + | Some (secret) -> + let resultConfig = K8SConfiguration() + + let token = + secret.Data.["token"] |> Encoding.UTF8.GetString + + let cluster = + match Cluster.currentCluster with + | Some (cluster) -> cluster + | _ -> Cluster() + + cluster.Name <- "cluster" + + resultConfig.ApiVersion <- "v1" + resultConfig.Kind <- "Config" + + resultConfig.Users <- + [ User(Name = this.ServiceAccount, UserCredentials = UserCredentials(Token = token)) ] + + resultConfig.Contexts <- + [ Context + (Name = "cluster-context", + ContextDetails = + ContextDetails(Cluster = "cluster", User = this.ServiceAccount, Namespace = this.Namespace)) ] + + resultConfig.Clusters <- [ cluster ] + resultConfig.CurrentContext <- "cluster-context" + + writeLines [ Plain + ($@"KubeConfig for service account ""{this.ServiceAccount}"" in namespace ""{ + this.Namespace + }"":") + Plain(KubeConfig.toString resultConfig) ] + + return ReturnValues.success + | None -> + writeLine [ Color("No secret deploy token was found for this account.", Color.Red) ] + return ReturnValues.failure + } + + override this.GetCodeCompletions() = + async { + if String.IsNullOrWhiteSpace(this.Namespace) + then return! Namespace.namespaceNames + else if String.IsNullOrWhiteSpace(this.ServiceAccount) + then return! getServiceAccounts this.Namespace + else return Seq.empty + } + +[] +[)>] +type KubeConfig() = + inherit BaseCommand() + + [] + member val Content = "" with get, set + + [] + member val Force = false with get, set + + [] + member val Path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".kube", "config") with get, set + + override this.Execute _ = + async { + let path = + Path.GetFullPath + (if Path.IsPathRooted this.Path + then this.Path + else Path.Join(Directory.GetCurrentDirectory(), this.Path)) + + if Directory.Exists path then + writeLine [ Color("The given path is a directory.", Color.Red) ] + return ReturnValues.failure + else if String.IsNullOrWhiteSpace(this.Content) + && String.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("KUBE_CONFIG")) then + writeLine [ Color("Neither content nor environment variable is set.", Color.Red) ] + return ReturnValues.failure + else if File.Exists(path) + && not this.Force + && not + (Prompt.GetYesNo($"Do you want to overwrite the config at {path}?", false, ConsoleColor.Yellow)) then + return ReturnValues.success + else + let content = + if String.IsNullOrWhiteSpace this.Content + then Environment.GetEnvironmentVariable("KUBE_CONFIG") + else this.Content + + let valid, text = isValidBase64 content + if valid then this.Content <- text + + File.WriteAllText(path, this.Content) + + return ReturnValues.success + } diff --git a/src/Kuby/Commands/Kuby.fs b/src/Kuby/Commands/Kuby.fs new file mode 100755 index 0000000..5660811 --- /dev/null +++ b/src/Kuby/Commands/Kuby.fs @@ -0,0 +1,96 @@ +namespace Kuby.Commands + +open System +open Kuby.Commands.Deployment +open McMaster.Extensions.CommandLineUtils + +[] +[, + typeof, + typeof, + typeof, + typeof, + typeof, + typeof, + typeof, + typeof)>] +type Kuby() = + inherit BaseCommand() + + override this.Execute app = + async { + if not app.IsShowingInformation then app.ShowHelp() else () + return ReturnValues.success + } + +and [] GetCompletions() = + inherit BaseCommand() + + let completionApp = new CommandLineApplication() + + do + completionApp.Conventions.UseDefaultConventions() + |> ignore + + completionApp.UnrecognizedArgumentHandling <- UnrecognizedArgumentHandling.CollectAndContinue + + [] + member val Arguments = "" with get, set + + override this.Execute _ = + async { + let args = this.Arguments.Split ' ' + let parsed = completionApp.Parse args + + let rec isAssignable (givenType: Type) (genericType: Type) = + if (givenType.IsGenericType + && givenType.GetGenericTypeDefinition() = genericType) + || Array.exists (fun (t: Type) -> + t.IsGenericType + && t.GetGenericTypeDefinition() = genericType) (givenType.GetInterfaces()) then + true + else if givenType.BaseType = null then + false + else + isAssignable givenType.BaseType genericType + + seq { + let description (description: string) = + if description = null then "" else $":{description}" + + yield! + parsed.SelectedCommand.Options + |> Seq.filter (fun o -> + not (Array.contains $"--{o.LongName}" args) + && not (Array.contains $"--{o.ShortName}" args) + && not (Array.contains $"--{o.SymbolName}" args)) + |> Seq.collect (fun o -> + seq { + yield $"--{o.LongName}{description o.Description}" + yield $"--{o.ShortName}{description o.Description}" + yield $"--{o.SymbolName}{description o.Description}" + }) + + yield! + parsed.SelectedCommand.Commands + |> Seq.filter (fun o -> o.ShowInHelpText) + |> Seq.collect (fun o -> o.Names |> Seq.map (fun n -> (n, o.Description))) + |> Seq.filter (fun (name, _) -> not <| Array.contains name args) + |> Seq.map (fun (name, desc) -> $"{name}{description desc}") + + if isAssignable (parsed.SelectedCommand.GetType()) typedefof> then + let baseCommand = + parsed + .SelectedCommand + .GetType() + .GetProperty("Model") + .GetValue(parsed.SelectedCommand) :?> BaseCommand + + yield! + baseCommand.GetCodeCompletions() + |> Async.RunSynchronously + } + |> Seq.iter (printfn "%s") + + return ReturnValues.success + } diff --git a/src/Kuby/Commands/Namespace.fs b/src/Kuby/Commands/Namespace.fs new file mode 100755 index 0000000..ec856d3 --- /dev/null +++ b/src/Kuby/Commands/Namespace.fs @@ -0,0 +1,38 @@ +namespace Kuby.Commands + +open Kuby.ConsoleWriter +open Kuby.Kubernetes +open McMaster.Extensions.CommandLineUtils +open Sharprompt + +[] +type Namespace() = + inherit BaseCommand() + + [] + member val NewNamespace = "" with get, set + + override this.Execute _ = + async { + writeLine [ Plain("The current namespace is: ") + Color(Namespace.printableCurrentNamespace, Color.Yellow) ] + + if this.NewNamespace = "" then + let! namespaces = Namespace.namespaceNames + + this.NewNamespace <- + Prompt.Select($"Select new namespace (arrows for nav, type for search)", namespaces, 5) + + writeLine [ Plain("Switch current namespace to: ") + Color(this.NewNamespace, Color.Cyan) ] + + KubeConfig.update (fun c -> + match c.Contexts + |> Seq.tryFind (fun ctx -> ctx.Name = c.CurrentContext) with + | Some (ctx) -> ctx.ContextDetails.Namespace <- this.NewNamespace + | _ -> ()) + + return ReturnValues.success + } + + override this.GetCodeCompletions() = Namespace.namespaceNames diff --git a/src/Kuby/Commands/ReturnValues.fs b/src/Kuby/Commands/ReturnValues.fs new file mode 100755 index 0000000..86f7444 --- /dev/null +++ b/src/Kuby/Commands/ReturnValues.fs @@ -0,0 +1,5 @@ +namespace Kuby.Commands + +module ReturnValues = + let success = 0 + let failure = 1 diff --git a/src/Kuby/Commands/Secret.fs b/src/Kuby/Commands/Secret.fs new file mode 100755 index 0000000..94f4724 --- /dev/null +++ b/src/Kuby/Commands/Secret.fs @@ -0,0 +1,140 @@ +namespace Kuby.Commands.Deployment + +open System +open System.ComponentModel.DataAnnotations +open System.Text +open Kuby.ConsoleWriter +open Kuby.Commands +open McMaster.Extensions.CommandLineUtils +open YamlDotNet.Core +open YamlDotNet.Serialization +open YamlDotNet.Serialization.NamingConventions +open k8s.Models + +type private Base64Converter() = + interface IYamlTypeConverter with + member this.Accepts t = t = typeof + + member this.ReadYaml(parser, t) = + let scalar = + parser.Current :?> YamlDotNet.Core.Events.Scalar + + let bytes = Convert.FromBase64String scalar.Value + parser.MoveNext() |> ignore + bytes :> obj + + member this.WriteYaml(emitter, value, _) = + let bytes = value :?> byte [] + + emitter.Emit + (YamlDotNet.Core.Events.Scalar(null, null, Convert.ToBase64String bytes, ScalarStyle.Plain, true, false)) + + +[] +type Create() = + inherit BaseCommand() + + let serializer = + SerializerBuilder() + .ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitDefaults) + .WithNamingConvention(CamelCaseNamingConvention.Instance) + .WithTypeConverter(Base64Converter()) + .Build() + + [] + [] + member val Name = "" with get, set + + [] + member val Data = [| "" |] with get, set + + override this.Execute _ = + async { + let data = + this.Data + |> Array.map (fun d -> d.Split '=' |> List.ofArray) + |> Array.map (fun d -> + match d with + | name :: values -> Some(name, String.Join('=', values) |> Encoding.UTF8.GetBytes) + | _ -> None) + |> Array.choose id + |> dict + + let secret = + V1Secret + (ApiVersion = V1Secret.KubeApiVersion, + Kind = V1Secret.KubeKind, + Type = "opaque", + Metadata = V1ObjectMeta(Name = this.Name), + Data = data) + + writeLines [ Plain("Resulting secret:") + Plain(serializer.Serialize secret) ] + + return ReturnValues.success + } + +[] +type DockerSecret() = + inherit BaseCommand() + + [] + [] + member val Name = "" with get, set + + [] + member val Username = "" with get, set + + [] + member val Password = "" with get, set + + [] + member val Server = "https://index.docker.io/v1/" with get, set + + [] + member val Email = "" with get, set + + override this.Execute app = + async { + while String.IsNullOrWhiteSpace this.Username do + this.Username <- Prompt.GetString "Enter the username for the registry:" + + while String.IsNullOrWhiteSpace this.Password do + this.Password <- Prompt.GetPassword "Enter the password for the registry:" + + while String.IsNullOrWhiteSpace this.Email do + this.Email <- Prompt.GetString "Enter the email for the registry:" + + while String.IsNullOrWhiteSpace this.Server do + this.Server <- Prompt.GetString "Enter the server for the registry:" + + let auth = + $"{this.Username}:{this.Password}" + |> Encoding.UTF8.GetBytes + |> Convert.ToBase64String + + let cfg = + $@"{{""auths"":{{""{this.Server}"":{{""username"":""{this.Username}"",""password"":""{this.Password}"",""email"":""{ + this.Email + }"",""auth"":""{auth}""}}}}}}" + + let creator = Create() + creator.Name <- this.Name + creator.Data <- [|$".dockerconfigjson={cfg}"|] + + do! creator.Execute(app) |> Async.Ignore + + return ReturnValues.success + } + +[] +[, typeof)>] +type Secret() = + inherit BaseCommand() + + override this.Execute app = + async { + if not app.IsShowingInformation then app.ShowHelp() else () + return ReturnValues.success + } diff --git a/src/Kuby/Commands/Version.fs b/src/Kuby/Commands/Version.fs new file mode 100644 index 0000000..5955ff8 --- /dev/null +++ b/src/Kuby/Commands/Version.fs @@ -0,0 +1,37 @@ +namespace Kuby.Commands + +open System.Reflection +open DotnetKubernetesClient +open Kuby +open Kuby.ConsoleWriter +open Kuby.Kubernetes +open McMaster.Extensions.CommandLineUtils + +[] +type Version() = + inherit BaseCommand() + + override this.Execute _ = + async { + let client = KubernetesClient() + + let server = + client.GetServerVersion() + |> Async.AwaitTask + |> Async.RunSynchronously + + let assemblyAttribute = + Assembly + .GetExecutingAssembly() + .GetCustomAttribute() + + let assembly = + if assemblyAttribute = null then "No explicit version." else assemblyAttribute.InformationalVersion + + writeLines [ Plain($"Kuby: v{assembly}") + Plain($"Kubectl: {Kubectl.version}") + Plain($"Current Server ({Cluster.currentClusterName}): v{server.Major}.{server.Minor}") + Plain($"Current Namespace: {Namespace.printableCurrentNamespace}") ] + + return ReturnValues.success + } diff --git a/src/Kuby/ConsoleWriter.fs b/src/Kuby/ConsoleWriter.fs new file mode 100755 index 0000000..bce73fd --- /dev/null +++ b/src/Kuby/ConsoleWriter.fs @@ -0,0 +1,26 @@ +module Kuby.ConsoleWriter + +open System + +type Color = ConsoleColor + +type Output = + | Plain of string + | Color of string * Color + +let private write (output: Output seq) (writer: string -> unit) = + output + |> Seq.iter (fun o -> + match o with + | Plain (s) -> writer s + | Color (s, c) -> + Console.ForegroundColor <- c + writer s + Console.ResetColor()) + +let writeLine (output: Output seq) = + write output Console.Write + Console.Write Environment.NewLine + +let writeLines (output: Output seq) = + write output Console.WriteLine diff --git a/src/Kuby/Kubectl.fs b/src/Kuby/Kubectl.fs new file mode 100755 index 0000000..10096c3 --- /dev/null +++ b/src/Kuby/Kubectl.fs @@ -0,0 +1,69 @@ +module Kuby.Kubectl + +open System +open System.Diagnostics +open System.IO +open System.Reflection +open System.Runtime.InteropServices +open McMaster.Extensions.CommandLineUtils +open Kuby.ConsoleWriter + +let version = "v1.19.4" + +let private basePath = + Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "kuby", "kubectl", version) + +let private targetExecutable = + if RuntimeInformation.IsOSPlatform OSPlatform.Windows + then Path.Join(basePath, "kubectl.exe") + else Path.Join(basePath, "kubectl") + +let private executable = + let assembly = Assembly.GetExecutingAssembly() + + if RuntimeInformation.IsOSPlatform OSPlatform.Windows then + assembly.GetManifestResourceStream("Kuby.Kubectl.windows.kubectl.exe") + else if RuntimeInformation.IsOSPlatform OSPlatform.Linux then + assembly.GetManifestResourceStream("Kuby.Kubectl.linux.kubectl") + else + assembly.GetManifestResourceStream("Kuby.Kubectl.darwin.kubectl") + +let private prepare () = + async { + if not (File.Exists targetExecutable) then + use memStream = new MemoryStream() + executable.CopyTo memStream + Directory.CreateDirectory(basePath) |> ignore + + do! File.WriteAllBytesAsync(targetExecutable, memStream.ToArray()) + |> Async.AwaitTask + + if RuntimeInformation.IsOSPlatform OSPlatform.Linux + || RuntimeInformation.IsOSPlatform OSPlatform.OSX then + use chmod = new Process() + chmod.StartInfo.FileName <- "chmod" + chmod.StartInfo.Arguments <- ArgumentEscaper.EscapeAndConcatenate([ "+x"; targetExecutable ]) + chmod.StartInfo.CreateNoWindow <- true + chmod.Start() |> ignore + do! chmod.WaitForExitAsync() |> Async.AwaitTask + + writeLine [ Color($@"Installed kubectl at ""{targetExecutable}""", Color.Cyan) ] + } + +let execute args = async { + do! prepare() + + use proc = new Process() + + proc.StartInfo.FileName <- targetExecutable + proc.StartInfo.RedirectStandardOutput <- true + proc.StartInfo.RedirectStandardError <- true + proc.StartInfo.Arguments <- ArgumentEscaper.EscapeAndConcatenate args + proc.StartInfo.CreateNoWindow <- true + proc.Start() |> ignore + do! proc.WaitForExitAsync() |> Async.AwaitTask + let! output = proc.StandardOutput.ReadToEndAsync() |> Async.AwaitTask + let! error = proc.StandardError.ReadToEndAsync() |> Async.AwaitTask + + return output, error +} diff --git a/src/Kuby/Kubernetes/Cluster.fs b/src/Kuby/Kubernetes/Cluster.fs new file mode 100755 index 0000000..b81e729 --- /dev/null +++ b/src/Kuby/Kubernetes/Cluster.fs @@ -0,0 +1,15 @@ +module Kuby.Kubernetes.Cluster + +let currentCluster = + let config = KubeConfig.load() + let currentClusterName = match Context.currentContext with + | Some(ctx) -> ctx.ContextDetails.Cluster + | None -> "" + + config.Clusters + |> Seq.tryFind (fun c -> c.Name = currentClusterName) + +let currentClusterName = + match currentCluster with + | Some(cluster) -> cluster.Name + | None -> "" diff --git a/src/Kuby/Kubernetes/Context.fs b/src/Kuby/Kubernetes/Context.fs new file mode 100755 index 0000000..fd444ae --- /dev/null +++ b/src/Kuby/Kubernetes/Context.fs @@ -0,0 +1,22 @@ +module Kuby.Kubernetes.Context + +let currentContext = + let config = KubeConfig.load() + + config.Contexts + |> Seq.tryFind (fun c -> c.Name = config.CurrentContext) + +let currentContextName = + match currentContext with + | Some (ctx) -> Some ctx.Name + | None -> None + +let printableCurrentContextName = + match currentContextName with + | Some (ctx) -> ctx + | None -> "" + +let contexts = KubeConfig.load().Contexts + +let contextNames = + contexts |> Seq.map (fun c -> c.Name) |> Seq.sort diff --git a/src/Kuby/Kubernetes/KubeConfig.fs b/src/Kuby/Kubernetes/KubeConfig.fs new file mode 100755 index 0000000..5239bd8 --- /dev/null +++ b/src/Kuby/Kubernetes/KubeConfig.fs @@ -0,0 +1,70 @@ +module Kuby.Kubernetes.KubeConfig + +open System.Collections.Generic +open System.IO +open YamlDotNet.Core +open YamlDotNet.Serialization +open YamlDotNet.Serialization.EventEmitters +open YamlDotNet.Serialization.NamingConventions +open k8s +open k8s.KubeConfigModels + +type private EmitterState(valuePeriod: int) = + let mutable period = valuePeriod + let mutable currentIndex = 0 + + member this.VisitNext() = + currentIndex <- currentIndex + 1 + currentIndex % period = 0 + +type private StringEmitter(next: IEventEmitter) = + inherit ChainedEventEmitter(next) + + let state = Stack() + + do state.Push <| EmitterState(1) + + override this.Emit(eventInfo: ScalarEventInfo, emitter: IEmitter): unit = + if state.Peek().VisitNext() + && eventInfo.Source.Type = typeof then + eventInfo.Style <- ScalarStyle.DoubleQuoted + + base.Emit(eventInfo, emitter) + + override this.Emit(eventInfo: MappingStartEventInfo, emitter: IEmitter): unit = + state.Peek().VisitNext() |> ignore + state.Push <| EmitterState(2) + base.Emit(eventInfo, emitter) + + override this.Emit(eventInfo: MappingEndEventInfo, emitter: IEmitter): unit = + state.Pop() |> ignore + base.Emit(eventInfo, emitter) + + override this.Emit(eventInfo: SequenceStartEventInfo, emitter: IEmitter): unit = + state.Peek().VisitNext() |> ignore + state.Push <| EmitterState(1) + base.Emit(eventInfo, emitter) + + override this.Emit(eventInfo: SequenceEndEventInfo, emitter: IEmitter): unit = + state.Pop() |> ignore + base.Emit(eventInfo, emitter) + +let private serializer = + SerializerBuilder() + .ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitDefaults) + .WithNamingConvention(CamelCaseNamingConvention.Instance) + .WithEventEmitter(fun n -> StringEmitter(n)) + .Build() + +let load () = + KubernetesClientConfiguration.LoadKubeConfig() + +let save (config: K8SConfiguration) = + File.WriteAllText(config.FileName, (serializer.Serialize config)) + +let toString (config: K8SConfiguration) = serializer.Serialize config + +let update (updater: K8SConfiguration -> unit) = + let config = load () + updater config + save config diff --git a/src/Kuby/Kubernetes/Namespace.fs b/src/Kuby/Kubernetes/Namespace.fs new file mode 100755 index 0000000..9bf48c8 --- /dev/null +++ b/src/Kuby/Kubernetes/Namespace.fs @@ -0,0 +1,25 @@ +module Kuby.Kubernetes.Namespace + +open DotnetKubernetesClient +open k8s.Models + +let private client = KubernetesClient() + +let currentNamespace = + match Context.currentContext with + | None -> None + | Some (ctx) -> + match ctx.ContextDetails.Namespace with + | null -> None + | value -> Some value + +let printableCurrentNamespace = + match currentNamespace with + | Some (ns) -> ns + | None -> "default" + +let namespaceNames = + async { + let! ns = client.List() |> Async.AwaitTask + return ns |> Seq.map (fun a -> a.Name()) |> Seq.sort + } diff --git a/src/Kuby/Kuby.fsproj b/src/Kuby/Kuby.fsproj new file mode 100755 index 0000000..8787821 --- /dev/null +++ b/src/Kuby/Kuby.fsproj @@ -0,0 +1,61 @@ + + + + Exe + net5.0 + preview + kuby + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + v1.19.4 + + + + + + + + + + + + + + + + + + + + diff --git a/src/Kuby/Program.fs b/src/Kuby/Program.fs new file mode 100755 index 0000000..6b09f51 --- /dev/null +++ b/src/Kuby/Program.fs @@ -0,0 +1,8 @@ +open Kuby.Commands +open McMaster.Extensions.CommandLineUtils + +[] +let main argv = + CommandLineApplication.ExecuteAsync argv + |> Async.AwaitTask + |> Async.RunSynchronously diff --git a/src/Kuby/Strings.fs b/src/Kuby/Strings.fs new file mode 100755 index 0000000..042c4b1 --- /dev/null +++ b/src/Kuby/Strings.fs @@ -0,0 +1,24 @@ +module Kuby.Strings + +open System +open System.Text + +let isValidBase64 (string: string) = + let buffer = + Span(Array.create string.Length 0uy) + + let isBase64, converted = + Convert.TryFromBase64String(string, buffer) + + let result = + Encoding.UTF8.GetString(buffer.ToArray(), 0, converted) + + let test = + Convert.ToBase64String(Encoding.UTF8.GetBytes(result)) + + isBase64 && string = test, result + +let rec trimStart (pattern: string) (string: string) = + if String.IsNullOrWhiteSpace pattern then string + else if string.StartsWith pattern then trimStart pattern (string.Substring pattern.Length) + else string diff --git a/src/commands/apply/index.ts b/src/commands/apply/index.ts deleted file mode 100644 index 49cd18e..0000000 --- a/src/commands/apply/index.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { pathExists, readdir, stat } from 'fs-extra'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../root-arguments'; -import { ExitCode } from '../../utils/exit-code'; -import { Logger } from '../../utils/logger'; -import { RcFile } from '../../utils/rc-file'; -import { spawn } from '../../utils/spawn'; -import { kubeConfigCommand } from '../kube-config'; - -type ApplyArguments = RootArguments & { deployFolder: string }; - -export const applyCommand: CommandModule = { - command: 'apply [deployFolder]', - describe: 'Apply all prepared yaml files with kubectl.', - - builder: (argv: Argv) => - argv - .positional('deployFolder', { - default: './deployment/', - description: 'Folder with prepared yaml (k8s) files.', - type: 'string', - normalize: true, - }) - .completion('completion', undefined, async (_, argv: Arguments) => { - if (argv._.length >= 3) { - return []; - } - const dirs = []; - const directory = await readdir(process.cwd()); - for (const path of directory) { - const stats = await stat(path); - if (stats.isDirectory()) { - dirs.push(path); - } - } - return dirs; - }), - - async handler(args: Arguments): Promise { - if (args.getYargsCompletions) { - return; - } - - const logger = new Logger('deployment'); - logger.debug('Apply yaml files'); - - if (!(await pathExists(args.deployFolder))) { - logger.error('Deploy directory does not exist. Aborting.'); - process.exit(ExitCode.error); - return; - } - - if (args.ci) { - await kubeConfigCommand.handler({ - ...args, - noInteraction: true, - force: true, - }); - } - - const code = await spawn('kubectl', RcFile.getKubectlArguments(args, ['apply', '-f', args.deployFolder])); - - if (code !== 0) { - logger.error('An error happend during the kubectl command.'); - process.exit(ExitCode.error); - return; - } - - logger.success('Files applied.'); - }, -}; diff --git a/src/commands/base64/decode/index.ts b/src/commands/base64/decode/index.ts deleted file mode 100644 index 12decf1..0000000 --- a/src/commands/base64/decode/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { write } from 'clipboardy'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../../root-arguments'; -import { Logger } from '../../../utils/logger'; - -type Base64DecodeArguments = RootArguments & { - content: string; - noClip: boolean; -}; - -export const base64DecodeCommand: CommandModule = { - command: 'decode ', - aliases: 'dec', - describe: 'Decode a defined content from the Base64 format.', - - builder: (argv: Argv) => - (argv - .positional('content', { - type: 'string', - description: 'The content that should be base64 encoded.', - }) - .option('no-clip', { - boolean: true, - default: false, - description: `Don't copy the resulting value into the clipboard.`, - }) as unknown) as Argv, - - async handler(args: Arguments): Promise { - const logger = new Logger('base64'); - logger.debug('Decode base64 content.'); - - const decoded = args.content.base64Decode(); - logger.output(decoded); - if (!args.noClip) { - await write(decoded); - } - }, -}; diff --git a/src/commands/base64/encode/index.ts b/src/commands/base64/encode/index.ts deleted file mode 100644 index a555de3..0000000 --- a/src/commands/base64/encode/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { write } from 'clipboardy'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../../root-arguments'; -import { Logger } from '../../../utils/logger'; - -type Base64EncodeArguments = RootArguments & { - content: string; - noClip: boolean; -}; - -export const base64EncodeCommand: CommandModule = { - command: 'encode ', - aliases: 'enc', - describe: 'Encode a defined content into the Base64 format.', - - builder: (argv: Argv) => - (argv - .positional('content', { - type: 'string', - description: 'The content that should be base64 encoded.', - }) - .option('no-clip', { - boolean: true, - default: false, - description: `Don't copy the resulting value into the clipboard.`, - }) as unknown) as Argv, - - async handler(args: Arguments): Promise { - const logger = new Logger('base64'); - logger.debug('Encode string content.'); - - const base64 = args.content.base64Encode(); - logger.output(base64); - if (!args.noClip) { - await write(base64); - } - }, -}; diff --git a/src/commands/base64/index.ts b/src/commands/base64/index.ts deleted file mode 100644 index 7c1ac6a..0000000 --- a/src/commands/base64/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Argv, CommandModule, showHelp } from 'yargs'; - -import { base64DecodeCommand } from './decode'; -import { base64EncodeCommand } from './encode'; - -const base64Commands: CommandModule[] = [base64DecodeCommand, base64EncodeCommand]; - -export const base64Command: CommandModule = { - command: 'base64', - aliases: 'b64', - describe: 'Utilities for base64 tranformations.', - - builder: (argv: Argv) => base64Commands.reduce((_, cur) => argv.command(cur), argv), - - handler(): void { - showHelp('log'); - }, -}; diff --git a/src/commands/cleanup/index.ts b/src/commands/cleanup/index.ts deleted file mode 100644 index a32914a..0000000 --- a/src/commands/cleanup/index.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { Arguments, Argv, CommandModule } from 'yargs'; -import { kubeConfigCommand } from '../kube-config'; -import { RootArguments } from '../../root-arguments'; -import { exec } from '../../utils/exec'; -import { Logger } from '../../utils/logger'; -import { RcFile } from '../../utils/rc-file'; -import { simpleConfirm } from '../../utils/simple-confirm'; -import { spawn } from '../../utils/spawn'; - -export type CleanupArguments = RootArguments & { - names: string[]; - resources: string[]; - dryRun: boolean; - exactMatch?: boolean; - regex?: boolean; -}; - -class Resource { - public get identifier(): string { - return `${this.type}/${this.name}`; - } - - constructor(public readonly type: string, public readonly name: string, public readonly namespace: string) {} -} - -function namePattern({ exactMatch, regex }: CleanupArguments): string { - switch (true) { - case exactMatch && !regex: - return 'exact'; - case !exactMatch && !regex: - return 'partial'; - case !exactMatch && regex: - return 'pattern'; - default: - throw new Error('not possible name combo found.'); - } -} - -function resourceFilter({ exactMatch, regex, names }: CleanupArguments): (resource: Resource) => boolean { - return ({ name }) => { - switch (true) { - case regex: - return names.map(n => new RegExp(n, 'g')).some(exp => exp.test(name)); - case !regex && exactMatch: - return names.includes(name); - case !regex && !exactMatch: - return names.some(n => name.includes(n)); - default: - return false; - } - }; -} - -export const cleanupCommand: CommandModule = { - command: 'cleanup ', - describe: - 'Cleanup a namespace. Remove (delete) the given resources that contain "name" in it (you can add multiple names).', - - builder: (argv: Argv) => - (argv - .positional('names', { - type: 'string', - array: true, - description: 'The names of the resources that should be deleted.', - }) - .option('resources', { - alias: 'r', - array: true, - string: true, - default: ['ingress', 'service', 'deployment', 'pvc', 'configmap', 'secret', 'certificate'], - description: - 'Defines a list of resources that should be cleaned up. If a comma separated list is given, it is split.', - coerce(args: string[]): string[] { - const result = []; - for (const arg of args) { - result.push(...arg.split(',')); - } - return result; - }, - }) - .option('regex', { - boolean: true, - conflicts: 'exact-match', - description: 'Use the inputted names as regex patterns to determine if the resource should be deleted.', - }) - .option('dry-run', { - boolean: true, - default: false, - description: "Don't delete the resources, just print what would've been deleted.", - }) - .option('exact-match', { - boolean: true, - description: 'Use an exact name match and not a partial match.', - }) as unknown) as Argv, - - async handler(args: Arguments): Promise { - const logger = new Logger('cleanup'); - logger.debug( - `Delete resources: ${args.resources.join(',')} within the namespace with the ${namePattern( - args, - )} names ${args.names.join(', ')}.`, - ); - logger.info('Cleanup resources from the namespace.'); - - if(args.ci) { - await kubeConfigCommand.handler({ - ...args, - noInteraction: true, - force: true, - }); - } - - const resources = (await exec( - `kubectl ${RcFile.getKubectlArguments(args, []).join(' ')} get ${args.resources.join( - ',', - )} -o jsonpath="{range $.items[*]}{.kind}|{.metadata.name}|{.metadata.namespace}{'\\n'}{end}"`, - )) - .split('\n') - .filter(Boolean) - .map(str => str.split('|')) - .map(([type, name, namespace]) => new Resource(type, name, namespace)); - - const toDelete = resources - .filter(r => !!!args.namespace || args.namespace === r.namespace) - .filter(resourceFilter(args)) - .map(r => r.identifier); - - if (toDelete.length <= 0) { - logger.info('No items to delete. Return.'); - return; - } - - if (args.dryRun) { - logger.output(`DRY-RUN - Deletion would include:\n${toDelete.join('\n')}`); - return; - } - - if (!args.ci && !(await simpleConfirm(`Do you want to proceed and delete ${toDelete.length} resources?`, false))) { - logger.info('Aborting.'); - return; - } - - await spawn('kubectl', RcFile.getKubectlArguments(args, ['delete', ...toDelete])); - logger.success('Resources cleaned up.'); - }, -}; diff --git a/src/commands/context/index.ts b/src/commands/context/index.ts deleted file mode 100644 index 81f1f85..0000000 --- a/src/commands/context/index.ts +++ /dev/null @@ -1,85 +0,0 @@ -import * as chalk from 'chalk'; -import { prompt } from 'inquirer'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../root-arguments'; -import { exec } from '../../utils/exec'; -import { ExitCode } from '../../utils/exit-code'; -import { Logger } from '../../utils/logger'; -import { getContexts, getCurrentContext } from './utils/kubectx'; - -const fuzzy = require('fuzzy'); - -export const contextCommand: CommandModule< - RootArguments, - { - name?: string; - } -> = { - command: 'context [name]', - aliases: 'ctx', - describe: - 'Utilities for kubernetes contexts. Without any subcommands, ' + 'prints a list of possible configured contexts.', - - builder: (argv: Argv) => - argv - .positional('name', { - description: 'Context to switch to. If omitted, user is asked.', - type: 'string', - }) - .completion('completion', false as any, async (_, argv: Arguments) => (argv._.length >= 3 ? [] : await getContexts())), - - async handler( - args: Arguments<{ - name?: string; - }>, - ): Promise { - if (args.getYargsCompletions) { - return; - } - - const logger = new Logger('contexts'); - logger.debug('list / switch contexts'); - - const current = await getCurrentContext(); - const contexts = await getContexts(); - - if (!args.name) { - args.name = ((await prompt([ - { - type: 'autocomplete', - name: 'context', - message: `Which context do you want to use? ${chalk.dim(`(current: ${current})`)}`, - source: async (_: any, input: string) => { - if (!input) { - return contexts; - } - return fuzzy - .filter(input.replace(/\s/g, ''), contexts, { - pre: '{', - post: '}', - }) - .map((e: any) => ({ - name: e.string.replace(/{(.)}/g, chalk.underline('$1')), - value: e.original, - })); - }, - } as any, - ])) as { context: string }).context; - } - - if (current === args.name) { - logger.info('No different context selected, exiting.'); - return; - } - - if (!contexts.includes(args.name)) { - logger.error(`The context "${args.name}" does not exist.`); - process.exit(ExitCode.error); - return; - } - - await exec(`kubectl config use-context "${args.name}"`); - logger.info(`Active context is now "${chalk.green(args.name)}".`); - }, -}; diff --git a/src/commands/context/utils/kubectx.ts b/src/commands/context/utils/kubectx.ts deleted file mode 100644 index 3255ad9..0000000 --- a/src/commands/context/utils/kubectx.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { EOL } from 'os'; - -import { exec } from '../../../utils/exec'; - -export function getCurrentContext(): Promise { - return exec(`kubectl config view -o=jsonpath='{.current-context}'`); -} - -export async function getContexts(): Promise { - const value = await exec('kubectl config get-contexts -o=name'); - return value - .split(EOL) - .filter(ctx => !!ctx) - .sort(); -} diff --git a/src/commands/delete/index.ts b/src/commands/delete/index.ts deleted file mode 100644 index bae477a..0000000 --- a/src/commands/delete/index.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { readdir, stat } from 'fs-extra'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../root-arguments'; -import { ExitCode } from '../../utils/exit-code'; -import { Logger } from '../../utils/logger'; -import { RcFile } from '../../utils/rc-file'; -import { spawn } from '../../utils/spawn'; -import { kubeConfigCommand } from '../kube-config'; -import { prepareCommand } from '../prepare'; - -type DeleteArguments = RootArguments & { - sourceFolder: string; - destinationFolder: string; -}; - -export const deleteCommand: CommandModule = { - command: 'delete [sourceFolder] [destinationFolder]', - aliases: 'del', - describe: 'Prepare yaml files and execute DELETE on them.', - - builder: (argv: Argv) => - argv - .positional('sourceFolder', { - description: 'Folder to search for yaml files.', - type: 'string', - default: './k8s/', - }) - .positional('destinationFolder', { - description: 'Folder to put prepared yaml files in.', - type: 'string', - default: './deployment/', - }) - .completion('completion', false as any, async (_, argv: Arguments) => { - if (argv._.length >= 4) { - return []; - } - const dirs = []; - const directory = await readdir(process.cwd()); - for (const path of directory) { - const stats = await stat(path); - if (stats.isDirectory()) { - dirs.push(path); - } - } - return dirs; - }), - - async handler(args: Arguments): Promise { - if (args.getYargsCompletions) { - return; - } - - const logger = new Logger('deployment'); - logger.debug('Delete deployment'); - - await prepareCommand.handler(args); - - if (args.ci) { - await kubeConfigCommand.handler({ - ...args, - noInteraction: true, - force: true, - }); - } - - const code = await spawn('kubectl', RcFile.getKubectlArguments(args, ['delete', '-f', args.destinationFolder])); - if (code !== 0) { - logger.error('An error happend during the kubectl command.'); - process.exit(ExitCode.error); - return; - } - - logger.success('Deployments deleted.'); - }, -}; diff --git a/src/commands/deploy/index.ts b/src/commands/deploy/index.ts deleted file mode 100644 index 1c26a35..0000000 --- a/src/commands/deploy/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { readdir, stat } from 'fs-extra'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../root-arguments'; -import { Logger } from '../../utils/logger'; -import { applyCommand } from '../apply'; -import { prepareCommand } from '../prepare'; - -type DeployArguments = RootArguments & { - sourceFolder: string; - destinationFolder: string; -}; - -export const deployCommand: CommandModule = { - command: 'deploy [sourceFolder] [destinationFolder]', - aliases: 'dep', - describe: 'Prepare and deploy all found yaml files.', - - builder: (argv: Argv) => - argv - .positional('sourceFolder', { - description: 'Folder to search for yaml files.', - type: 'string', - default: './k8s/', - }) - .positional('destinationFolder', { - description: 'Folder to put prepared yaml files in.', - type: 'string', - default: './deployment/', - }) - .completion('completion', false as any, async (_, argv: Arguments) => { - if (argv._.length >= 4) { - return []; - } - const dirs = []; - const directory = await readdir(process.cwd()); - for (const path of directory) { - const stats = await stat(path); - if (stats.isDirectory()) { - dirs.push(path); - } - } - return dirs; - }), - - async handler(args: Arguments): Promise { - if (args.getYargsCompletions) { - return; - } - - const logger = new Logger('deployment'); - logger.debug('Execute deployment'); - - await prepareCommand.handler(args); - await applyCommand.handler({ - ...args, - deployFolder: args.destinationFolder, - }); - - logger.success('Deployments applied.'); - }, -}; diff --git a/src/commands/index.ts b/src/commands/index.ts deleted file mode 100644 index 6ee62f3..0000000 --- a/src/commands/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommandModule } from 'yargs'; -import { applyCommand } from './apply'; -import { base64Command } from './base64'; -import { cleanupCommand } from './cleanup'; -import { contextCommand } from './context'; -import { deleteCommand } from './delete'; -import { deployCommand } from './deploy'; -import { kubeConfigCommand } from './kube-config'; -import { kubectlCommand } from './kubectl'; -import { namespaceCommand } from './namespace'; -import { prepareCommand } from './prepare'; -import { previewDeployCommand } from './preview-deploy'; -import { secretCommand } from './secret'; -import { versionCommand } from './version'; - -export const commands: CommandModule[] = [ - applyCommand, - base64Command, - cleanupCommand, - contextCommand, - deleteCommand, - deployCommand, - kubeConfigCommand, - kubectlCommand, - namespaceCommand, - prepareCommand, - previewDeployCommand, - secretCommand, - versionCommand, -]; diff --git a/src/commands/kube-config/index.ts b/src/commands/kube-config/index.ts deleted file mode 100644 index ceec29c..0000000 --- a/src/commands/kube-config/index.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { outputFile, pathExists } from 'fs-extra'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../root-arguments'; -import { ExitCode } from '../../utils/exit-code'; -import { Filepathes } from '../../utils/filepathes'; -import { Logger } from '../../utils/logger'; -import { simpleConfirm } from '../../utils/simple-confirm'; - -const defaultEnv = 'KUBE_CONFIG'; - -type KubeConfigArguments = RootArguments & { - configContent?: string; - noInteraction: boolean; - force: boolean; -}; - -interface KubeConfigCommandModule extends CommandModule { - handler(args: KubeConfigArguments): Promise; -} - -export const kubeConfigCommand: KubeConfigCommandModule = { - command: 'kube-config [configContent]', - aliases: 'kc', - describe: - 'Use the given kube-config content ' + - 'and create the ~/.kube/config file. If the content is omitted, the content ' + - 'of the env var "$KUBE_CONFIG" is used.', - - builder: (argv: Argv) => - (argv - .positional('configContent', { - description: 'kube-config content (base64 encoded or not).', - type: 'string', - }) - .option('f', { - alias: 'force', - boolean: true, - default: false, - description: 'Force login, overwrite existing ~/.kube/config.', - }) - .option('n', { - alias: 'no-interaction', - boolean: true, - default: false, - description: 'No interaction mode, use default answers.', - }) as unknown) as Argv, - - async handler(args: Arguments): Promise { - const logger = new Logger('login config'); - logger.debug('Set Kubernetes configuration'); - - if (!args.configContent && !process.env[defaultEnv]) { - logger.error('Neither env variable nor content provided. Aborting.'); - process.exit(ExitCode.error); - return; - } - - let content = (args.configContent || process.env[defaultEnv] || '').trim(); - - if (!content) { - logger.error('Config content is empty. Aborting.'); - process.exit(ExitCode.error); - return; - } - - if (content.isBase64()) { - logger.info('The content was base64 encoded.'); - content = content.base64Decode(); - } - - if (await pathExists(Filepathes.configPath)) { - if (args.noInteraction && !args.force) { - logger.info('Config already exists, exitting.'); - return; - } - - if ( - !args.force && - !(await simpleConfirm('The kube config (~/.kube/config) already exists. Do you want to overwrite it?', false)) - ) { - return; - } - } - - logger.info('Writing ~/.kube/config file.'); - await outputFile(Filepathes.configPath, content); - - logger.success('~/.kube/config written.'); - }, -}; diff --git a/src/commands/kubectl/index.ts b/src/commands/kubectl/index.ts deleted file mode 100644 index 0bf4da7..0000000 --- a/src/commands/kubectl/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Argv, CommandModule, showHelp } from 'yargs'; - -import { kubectlInstallCommand } from './install'; -import { kubectlListCommand } from './list'; -import { kubectlRefreshCommand } from './refresh'; -import { kubectlRemoveCommand } from './remove'; -import { kubectlUseCommand } from './use'; - -const kubectlCommands: CommandModule[] = [ - kubectlInstallCommand, - kubectlListCommand, - kubectlRefreshCommand, - kubectlRemoveCommand, - kubectlUseCommand, -]; - -export const kubectlCommand: CommandModule = { - command: 'kubectl', - describe: 'Utilities for kubectl management.', - - builder: (argv: Argv) => kubectlCommands.reduce((_, cur) => argv.command(cur), argv), - - handler(): void { - showHelp('log'); - }, -}; diff --git a/src/commands/kubectl/install/index.ts b/src/commands/kubectl/install/index.ts deleted file mode 100644 index 56ce9e5..0000000 --- a/src/commands/kubectl/install/index.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { ensureDir } from 'fs-extra'; -import { maxSatisfying } from 'semver'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../../root-arguments'; -import { ExitCode } from '../../../utils/exit-code'; -import { Filepathes } from '../../../utils/filepathes'; -import { Logger } from '../../../utils/logger'; -import { simpleConfirm } from '../../../utils/simple-confirm'; -import { kubectlUseCommand } from '../use'; -import { downloadKubectl, getLocalVersions, getRemoteVersions } from '../utils/kubectl'; - -type KubectlInstallArguments = RootArguments & { - semver: string; - noInteraction: boolean; - force: boolean; -}; - -export const kubectlInstallCommand: CommandModule = { - command: 'install ', - describe: 'Install and use a specific version of kubectl (i.e. download it).', - - builder: (argv: Argv) => - (argv - .positional('semver', { - description: 'Semver version of the kubectl version to install.', - type: 'string', - default: undefined, - }) - .option('no-interaction', { - alias: 'n', - boolean: true, - default: false, - description: 'No interaction mode, use default answers.', - }) - .option('force', { - alias: 'f', - boolean: true, - default: false, - description: 'Force re-install of a version if already installed.', - }) as unknown) as Argv, - - async handler(args: Arguments): Promise { - if (args.getYargsCompletions) { - return; - } - - const logger = new Logger('kubectl'); - logger.debug('Install kubectl version'); - - await ensureDir(Filepathes.kubectlInstallPath); - - const versions = await getRemoteVersions(logger); - const installVersion = maxSatisfying(versions, args.semver); - - if (!installVersion) { - logger.error('The given semver is not available. Use other version or use the refresh command.'); - process.exit(ExitCode.error); - return; - } - - if (!args.force && (await getLocalVersions()).includes(installVersion)) { - logger.info(`v${installVersion} already installed and no force flag set.`); - await kubectlUseCommand.handler(args); - return; - } - - if (!args.noInteraction && !(await simpleConfirm(`Found version v${installVersion}. Process install?`, true))) { - logger.info('Aborting'); - return; - } - - await downloadKubectl(installVersion, logger); - await kubectlUseCommand.handler(args); - }, -}; diff --git a/src/commands/kubectl/list/index.ts b/src/commands/kubectl/list/index.ts deleted file mode 100644 index db5b087..0000000 --- a/src/commands/kubectl/list/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -import * as chalk from 'chalk'; -import { CommandModule } from 'yargs'; - -import { Logger } from '../../../utils/logger'; -import { getVersionInfo } from '../../version'; -import { getLocalVersions } from '../utils/kubectl'; - -export const kubectlListCommand: CommandModule = { - command: 'list', - aliases: 'ls', - describe: 'List local available kubectl versions.', - - async handler(): Promise { - const logger = new Logger('kubectl'); - logger.debug('List kubectl installations'); - - const versions = await getLocalVersions(); - const { kubectlVersion } = await getVersionInfo(); - if (versions.length === 0) { - logger.warn('No local installations found.'); - return; - } - - logger.info('Local available kubectl versions:'); - versions.forEach(v => - logger.info( - `v${v} (~/.kube/kuby/kubectl/v${v})${ - v === kubectlVersion ? chalk.green(' selected') : '' - }`, - ), - ); - }, -}; diff --git a/src/commands/kubectl/refresh/index.ts b/src/commands/kubectl/refresh/index.ts deleted file mode 100644 index 31d8ea8..0000000 --- a/src/commands/kubectl/refresh/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ensureFile, writeJson } from 'fs-extra'; -import { CommandModule } from 'yargs'; - -import { Filepathes } from '../../../utils/filepathes'; -import { Logger } from '../../../utils/logger'; -import { downloadRemoteVersions } from '../utils/kubectl'; - -export const kubectlRefreshCommand: CommandModule = { - command: 'refresh', - describe: - 'Get all kubernetes releases from github api and store them locally.', - - async handler(): Promise { - const logger = new Logger('kubectl'); - logger.debug('Refresh online kubernetes release versions'); - - await ensureFile(Filepathes.kubectlVersionsPath); - - const versions = await downloadRemoteVersions(logger); - await writeJson(Filepathes.kubectlVersionsPath, versions, { - encoding: 'utf8', - }); - - logger.success('Versions refreshed.'); - }, -}; diff --git a/src/commands/kubectl/remove/index.ts b/src/commands/kubectl/remove/index.ts deleted file mode 100644 index 9c070a6..0000000 --- a/src/commands/kubectl/remove/index.ts +++ /dev/null @@ -1,74 +0,0 @@ -import * as chalk from 'chalk'; -import { remove } from 'fs-extra'; -import { prompt } from 'inquirer'; -import { platform } from 'os'; -import { posix } from 'path'; -import { maxSatisfying } from 'semver'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { Filepathes } from '../../../utils/filepathes'; -import { Logger } from '../../../utils/logger'; -import { getVersionInfo } from '../../version'; -import { getLocalVersions } from '../utils/kubectl'; - -interface KubectlRemoveArguments extends Arguments { - semver?: string; -} - -export const kubectlRemoveCommand: CommandModule = { - command: 'remove [semver]', - aliases: 'rm', - describe: 'Delete (locally) a version of kubectl.', - - builder: (argv: Argv) => - argv.positional('semver', { - description: 'Semver version of the kubectl version to remove.', - type: 'string', - }), - - async handler(args: KubectlRemoveArguments): Promise { - const logger = new Logger('kubectl'); - logger.debug('Delete kubectl version'); - - const versions = await getLocalVersions(); - const { kubectlVersion } = await getVersionInfo(); - if (!args.semver) { - const answers = (await prompt([ - { - type: 'list', - name: 'version', - message: `Which version do you want to delete? ${chalk.dim( - `(current: v${kubectlVersion})`, - )}`, - choices: [ - ...versions.map(v => ({ - value: v, - name: `v${v}`, - })), - ], - }, - ])) as { version: string }; - args.semver = answers.version; - } - - const removeVersion = maxSatisfying(versions, args.semver); - - if (!removeVersion) { - logger.warn('The given semver is not locally installed.'); - return; - } - - logger.debug('Delete folder.'); - await remove( - posix.join(Filepathes.kubectlInstallPath, `v${removeVersion}`), - ); - - logger.debug('Delete symlink.'); - if (platform() !== 'win32') { - await remove('/usr/local/bin/kubectl'); - } - // TODO windows. - - logger.success(`Version v${removeVersion} removed.`); - }, -}; diff --git a/src/commands/kubectl/use/index.ts b/src/commands/kubectl/use/index.ts deleted file mode 100644 index 42d1a13..0000000 --- a/src/commands/kubectl/use/index.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { remove, symlink } from 'fs-extra'; -import { prompt } from 'inquirer'; -import { platform } from 'os'; -import { posix } from 'path'; -import { maxSatisfying } from 'semver'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { ExitCode } from '../../../utils/exit-code'; -import { Filepathes } from '../../../utils/filepathes'; -import { Logger } from '../../../utils/logger'; -import { getVersionInfo } from '../../version'; -import { getLocalVersions } from '../utils/kubectl'; - -interface KubectlUseArguments extends Arguments { - semver?: string; -} - -interface KubectlUseCommandModule extends CommandModule { - handler(args: KubectlUseArguments): Promise; -} - -export const kubectlUseCommand: KubectlUseCommandModule = { - command: 'use [semver]', - describe: 'Use a specific version of kubectl (symlink it).', - - builder: (argv: Argv) => - argv.positional('semver', { - description: 'Semver version of the kubectl version to use.', - type: 'string', - }), - - async handler(args: KubectlUseArguments): Promise { - const logger = new Logger('kubectl'); - logger.debug('Use kubectl version'); - - const versions = await getLocalVersions(); - const { kubectlVersion } = await getVersionInfo(); - if (!args.semver) { - const answers = (await prompt([ - { - type: 'list', - name: 'version', - message: `Which version do you want to use? (current: v${kubectlVersion})`, - choices: [...versions.map(v => ({ value: v, name: `v${v}` }))], - }, - ])) as { version: string }; - args.semver = answers.version; - } - - const installVersion = maxSatisfying(versions, args.semver); - - if (!installVersion) { - logger.error( - 'The given semver is not locally available. Use the install command.', - ); - process.exit(ExitCode.error); - return; - } - - logger.debug(`Redirect the symlink to v${installVersion}.`); - if (platform() !== 'win32') { - await remove('/usr/local/bin/kubectl'); - await symlink( - posix.join( - Filepathes.kubectlInstallPath, - `v${installVersion}`, - 'kubectl', - ), - '/usr/local/bin/kubectl', - 'file', - ); - } - // TODO windows. - - logger.success(`Version changed to v${installVersion}.`); - }, -}; diff --git a/src/commands/kubectl/utils/kubectl.ts b/src/commands/kubectl/utils/kubectl.ts deleted file mode 100644 index 5545e93..0000000 --- a/src/commands/kubectl/utils/kubectl.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { - chmod, - createWriteStream, - emptyDir, - ensureDir, - lstatSync, - outputJSON, - pathExists, - readdir, - readJson, -} from 'fs-extra'; -import got from 'got'; -import { platform } from 'os'; -import { posix } from 'path'; -import { clean, rcompare } from 'semver'; - -import { Filepathes } from '../../../utils/filepathes'; -import { Logger, LogLevel } from '../../../utils/logger'; - -const initialUrl = - 'https://api.github.com/repos/kubernetes/kubernetes/releases?per_page=100'; - -export async function downloadKubectl( - version: string, - logger: Logger = new Logger('download kubectl'), -): Promise { - logger.startSpinner(`Downloading v${version}.`, LogLevel.info); - const url = kubectlDownloadUrl(version, getOs()); - const destination = posix.join(Filepathes.kubectlInstallPath, `v${version}`); - const destinationFile = posix.join( - destination, - `kubectl${getOs() === 'windows' ? '.exe' : ''}`, - ); - await emptyDir(destination); - return new Promise((resolve, reject) => { - got.stream(url) - .on('error', () => { - logger.spinnerFail('Error during download.'); - reject(); - }) - .on('downloadProgress', progress => - logger.setSpinnerText( - `Downloading v${version}. Progress: ${Math.round( - progress.percent * 100, - )}%`, - ), - ) - .on('end', () => { - logger.spinnerSuccess(`Downloaded v${version}`); - resolve(); - }) - .pipe(createWriteStream(destinationFile)); - }).then(() => chmod(destinationFile, '755')); -} - -const kubectlDownloadUrl = ( - version: string, - os: 'linux' | 'darwin' | 'windows', -) => - `https://storage.googleapis.com/kubernetes-release/release/v${version}/bin/${os}/amd64/kubectl${ - os === 'windows' ? '.exe' : '' - }`; - -function getOs(): 'linux' | 'darwin' | 'windows' { - switch (platform()) { - case 'darwin': - return 'darwin'; - case 'win32': - return 'windows'; - default: - return 'linux'; - } -} - -export async function getLocalVersions(): Promise { - await ensureDir(Filepathes.kubectlInstallPath); - return ((await readdir(Filepathes.kubectlInstallPath)) - .filter(path => - lstatSync(posix.join(Filepathes.kubectlInstallPath, path)).isDirectory(), - ) - .map(v => clean(v)) - .filter(Boolean) as string[]).sort(rcompare); -} - -export async function downloadRemoteVersions( - logger: Logger = new Logger('download remote kubetl versions'), -): Promise { - const versions: string[] = []; - - let getUrl: string | null = initialUrl; - logger.startSpinner(`Downloading from: ${getUrl}`, LogLevel.info); - while (getUrl) { - logger.setSpinnerText(`Downloading from: ${getUrl}`); - const result = await got.get(getUrl); - - versions.push( - ...JSON.parse(result.body).map((release: any) => release.tag_name), - ); - - const { link } = result.headers; - const links = (link as string).split(','); - - getUrl = null; - for (const parsedLink of links) { - const match = /<(.*?)>; rel="next"/g.exec(parsedLink || ''); - if (match) { - getUrl = match ? match[1] : null; - break; - } - } - } - logger.spinnerSuccess('Versions downloaded'); - - return versions.map(v => clean(v)).filter(Boolean) as string[]; -} - -export async function getRemoteVersions( - logger: Logger = new Logger('get remote kubetl versions'), -): Promise { - if (await pathExists(Filepathes.kubectlVersionsPath)) { - return await readJson(Filepathes.kubectlVersionsPath, { encoding: 'utf8' }); - } - - const versions = await downloadRemoteVersions(logger); - await outputJSON(Filepathes.kubectlVersionsPath, versions, { - encoding: 'utf8', - }); - - return versions; -} diff --git a/src/commands/namespace/create/index.ts b/src/commands/namespace/create/index.ts deleted file mode 100644 index 15a8b80..0000000 --- a/src/commands/namespace/create/index.ts +++ /dev/null @@ -1,213 +0,0 @@ -import * as chalk from 'chalk'; -import { outputFile, pathExists, readFile } from 'fs-extra'; -import { prompt } from 'inquirer'; -import { EOL } from 'os'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../../root-arguments'; -import { datasubst } from '../../../utils/envsubst'; -import { exec } from '../../../utils/exec'; -import { ExitCode } from '../../../utils/exit-code'; -import { Filepathes } from '../../../utils/filepathes'; -import { Logger } from '../../../utils/logger'; -import { RcFile } from '../../../utils/rc-file'; -import { simpleConfirm } from '../../../utils/simple-confirm'; -import { spawn } from '../../../utils/spawn'; -import { getCurrentContext } from '../../context/utils/kubectx'; -import { namespaceKubeConfigCommand } from '../kube-config'; -import { getNamespaces } from '../utils/kubens'; - -type NamespaceCreateArguments = RootArguments & { - name: string; - base64: boolean; - noInteraction: boolean; -}; - -interface PromptAnswers { - createServiceAccount: boolean; - serviceAccountName: string; - role: string; - saveRole: boolean; -} - -const serviceAccount = (namespace: string, saName: string) => `apiVersion: v1 -kind: ServiceAccount -metadata: - name: ${saName} - namespace: ${namespace} -`; - -const rolebinding = (namespace: string, saName: string, roleName: string) => `apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: ${saName} - namespace: ${namespace} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ${roleName} -subjects: -- kind: ServiceAccount - name: ${saName} - namespace: ${namespace} -`; - -const defaultRoleYml = `# possible variables: NAME (name of the namespace) -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: Role -metadata: - name: $\{NAME\}-deploy - namespace: $\{NAME\} -rules: - - apiGroups: - - '*' - resources: - - '*' - verbs: - - '*' -`; - -export const namespaceCreateCommand: CommandModule = { - command: 'create ', - describe: 'Create a new kubernetes namespace (with optional service account and kubeconfig).', - - builder: (argv: Argv) => - (argv - .positional('name', { - description: 'Kubernetes namespace name.', - type: 'string', - }) - .option('b', { - alias: 'base64', - default: false, - description: 'Output the kube-config encoded in base64.', - }) - .option('n', { - alias: 'no-interaction', - boolean: true, - default: false, - description: 'No interaction mode, use default answers.', - }) as unknown) as Argv, - - async handler(args: Arguments): Promise { - const logger = new Logger('namespaces'); - logger.debug('Create kubernetes namespace.'); - - const namespaces = await getNamespaces(); - - if (namespaces.includes(args.name)) { - logger.error(`The namespace "${args.name}" already exists.`); - process.exit(ExitCode.error); - return; - } - - const defaultRole = (await pathExists(Filepathes.namespaceDefaultRolePath)) - ? await readFile(Filepathes.namespaceDefaultRolePath, 'utf8') - : defaultRoleYml; - - const questions = [ - { - type: 'confirm', - name: 'createServiceAccount', - message: 'Create a service account?', - default: true, - }, - { - type: 'input', - name: 'serviceAccountName', - message: `The name of the service account?`, - default: `${args.name}-deploy`, - when: (answers: PromptAnswers) => answers.createServiceAccount, - validate: (input: string) => !!input || 'Please enter a name.', - }, - { - type: 'editor', - name: 'role', - message: 'Edit the role for the service account.', - default: defaultRole, - when: (answers: PromptAnswers) => answers.createServiceAccount, - }, - { - type: 'confirm', - name: 'saveRole', - message: 'Save the given role as new default?', - default: false, - when: (answers: PromptAnswers) => answers.createServiceAccount, - }, - ]; - - const answers = (args.noInteraction - ? { - createServiceAccount: true, - serviceAccountName: `${args.name}-deploy`, - role: defaultRole, - saveRole: false, - } - : await prompt(questions)) as PromptAnswers; - - if (answers.createServiceAccount && answers.role && answers.saveRole) { - await outputFile(Filepathes.namespaceDefaultRolePath, answers.role); - logger.info('The default role was saved under: ~/.kube/kuby/namespace/default-role.yml'); - logger.info('If you want to reset it, just delete the file.'); - } - - if ( - !args.noInteraction && - !(await simpleConfirm( - `Create namespace "${chalk.yellow(args.name)}" on context "${chalk.yellow(await getCurrentContext())}"${ - answers.createServiceAccount ? `, with service account "${chalk.yellow(answers.serviceAccountName)}"` : '' - }. Proceed?`, - true, - )) - ) { - logger.info('Aborting'); - return; - } - - const code = await spawn('kubectl', RcFile.getKubectlCtxArguments(args, ['create', 'ns', args.name])); - if (code !== 0) { - logger.error('An error happend during the kubectl create namespace command.'); - process.exit(ExitCode.error); - return; - } - - logger.success(`Namespace "${args.name}" created.`); - if (!answers.createServiceAccount) { - return; - } - - const role = datasubst(answers.role, { NAME: args.name }); - const roleNameRegex = /^\s*name:\s*(.*)$/gm.exec(role); - if (!roleNameRegex || !roleNameRegex[1]) { - logger.error('No valid role name provided. aborting.'); - process.exit(ExitCode.error); - return; - } - const roleName = roleNameRegex[1]; - - const templates = [ - role, - serviceAccount(args.name, answers.serviceAccountName), - rolebinding(args.name, answers.serviceAccountName, roleName), - ]; - - logger.debug(`Executing `); - try { - const result = await exec(`echo "${templates.join(`${EOL}---${EOL}`)}" | kubectl create -f -`); - logger.info(result); - } catch (e) { - logger.error(`Error: ${e}`); - process.exit(ExitCode.error); - return; - } - - logger.success(`ServiceAccount "${answers.serviceAccountName}" created.`); - logger.success(`Role and RoleBinding "${roleName}" created.`); - - await namespaceKubeConfigCommand.handler({ - ...args, - namespace: args.name, - serviceAccount: answers.serviceAccountName, - }); - }, -}; diff --git a/src/commands/namespace/index.ts b/src/commands/namespace/index.ts deleted file mode 100644 index c50f9df..0000000 --- a/src/commands/namespace/index.ts +++ /dev/null @@ -1,94 +0,0 @@ -import * as chalk from 'chalk'; -import { prompt } from 'inquirer'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../root-arguments'; -import { exec } from '../../utils/exec'; -import { ExitCode } from '../../utils/exit-code'; -import { Logger } from '../../utils/logger'; -import { getCurrentContext } from '../context/utils/kubectx'; -import { namespaceCreateCommand } from './create'; -import { namespaceKubeConfigCommand } from './kube-config'; -import { getCurrentNamespace, getNamespaces } from './utils/kubens'; - -const fuzzy = require('fuzzy'); - -type NamespaceArguments = RootArguments & { - name?: string; -}; - -const namespaceCommands: CommandModule[] = [namespaceCreateCommand, namespaceKubeConfigCommand]; - -export const namespaceCommand: CommandModule = { - command: 'namespace [name]', - aliases: 'ns', - describe: - 'Utilities for kubernetes namespaces. Without any subcommands, ' + - 'prints a list of possible namespaces in the current context. If provided ' + - 'with a name, the command switches directly to that namespace.', - - builder: (argv: Argv) => { - argv - .positional('name', { - description: 'Namespace to switch to. If omitted, user is asked.', - type: 'string', - }) - .completion('completion', false as any, async (_, argv: Arguments) => - argv._.length >= 3 ? [] : await getNamespaces(), - ); - return namespaceCommands.reduce((_, cur) => argv.command(cur), argv); - }, - - async handler(args: Arguments): Promise { - if (args.getYargsCompletions) { - return; - } - - const logger = new Logger('namespaces'); - logger.debug(`list / switch namespaces`); - - logger.startSpinner('Download namespaces'); - const current = await getCurrentNamespace(); - const namespaces = await getNamespaces(); - logger.stopSpinner(); - - if (!args.name) { - args.name = ((await prompt([ - { - type: 'autocomplete', - name: 'namespace', - message: `Which namespace do you want to use? ${chalk.dim(`(current: ${current})`)}`, - source: async (_: any, input: string) => { - if (!input) { - return namespaces; - } - return fuzzy - .filter(input.replace(/\s/g, ''), namespaces, { - pre: '{', - post: '}', - }) - .map((e: any) => ({ - name: e.string.replace(/{(.)}/g, chalk.underline('$1')), - value: e.original, - })); - }, - } as any, - ])) as { namespace: string }).namespace; - } - - if (current === args.name) { - logger.info('No different namespace selected, exiting.'); - return; - } - - if (!namespaces.includes(args.name)) { - logger.error(`The namespace "${args.name}" does not exist.`); - process.exit(ExitCode.error); - return; - } - - const context = await getCurrentContext(); - await exec(`kubectl config set-context "${context}" --namespace="${args.name}"`); - logger.info(`Active namespace is now "${chalk.yellow(args.name)}".`); - }, -}; diff --git a/src/commands/namespace/kube-config/index.ts b/src/commands/namespace/kube-config/index.ts deleted file mode 100644 index 75ab0d7..0000000 --- a/src/commands/namespace/kube-config/index.ts +++ /dev/null @@ -1,173 +0,0 @@ -import * as chalk from 'chalk'; -import { prompt } from 'inquirer'; -import { EOL } from 'os'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../../root-arguments'; -import { exec } from '../../../utils/exec'; -import { ExitCode } from '../../../utils/exit-code'; -import { Logger } from '../../../utils/logger'; -import { getCurrentContext } from '../../context/utils/kubectx'; -import { getCurrentNamespace, getNamespaces, getServiceAccountsForNamespace } from '../utils/kubens'; - -type NamespaceKubeConfigArguments = RootArguments & { - namespace?: string; - serviceAccount?: string; - base64: boolean; -}; - -const kubeConfig = (server: string, certificate: string, namespace: string, saName: string, token: string) => `apiVersion: v1 -kind: Config -clusters: -- cluster: - server: ${server} - certificate-authority-data: ${certificate} - name: cluster -users: -- name: ${saName} - user: - token: ${token} -preferences: {} -contexts: -- context: - cluster: cluster - user: ${saName} - namespace: ${namespace} - name: cluster-context -current-context: cluster-context -`; - -export async function generateKubeConfig(namespace: string, serviceAccount: string): Promise { - const [tokenSecret] = (await exec( - `kubectl get secrets -n ${namespace} -o=jsonpath='{range .items[*]}{@.metadata.name};{@.type}{"\\n"}{end}'`, - )) - .split('\n') - .filter(Boolean) - .map(line => line.split(';')) - .filter(secret => secret[1].includes('service-account-token')) - .find(secret => secret[0].startsWith(serviceAccount || '')) || ['']; - - if (!tokenSecret) { - throw new Error('No token secret found'); - } - - const base64Token = await exec(`kubectl get secret -n ${namespace} ${tokenSecret} -o=jsonpath='{@.data.token}'`); - - const token = base64Token.base64Decode(); - const currentContext = await getCurrentContext(); - const clusterName = await exec( - `kubectl config view -o=jsonpath='{.contexts[?(@.name=="${currentContext}")].context.cluster}'`, - ); - const [address, certificate] = (await exec( - `kubectl config view --raw -o=jsonpath='{range .clusters[?(@.name=="${clusterName}")].cluster}` + - `{@.server}||{@.certificate-authority-data}{end}'`, - )).split('||'); - - return kubeConfig(address, certificate, namespace, serviceAccount, token); -} - -export const namespaceKubeConfigCommand: CommandModule = { - command: 'kube-config [namespace] [serviceAccount]', - aliases: 'kc', - describe: - 'Generate a specific kube-config for the namespace and the given service account. If omitted, the user is asked.', - - builder: (argv: Argv) => - argv - .positional('namespace', { - description: 'Kubernetes namespace name.', - type: 'string', - }) - .positional('serviceAccount', { - description: 'Kubernetes service account name.', - type: 'string', - }) - .option('base64', { - alias: 'b', - default: false, - description: 'Output the kube-config encoded in base64.', - }) - .completion('completion', false as any, async (current: string, argv: Arguments) => { - switch (argv._.length) { - case 3: - return await getNamespaces(); - case 4: - return await getServiceAccountsForNamespace(current); - default: - return []; - } - }), - - async handler(args: Arguments): Promise { - if (args.getYargsCompletions) { - return; - } - - const logger = new Logger('namespaces'); - logger.debug('Generate kube-config.'); - - const currentNamespace = await getCurrentNamespace(); - const namespaces = await getNamespaces(); - - if (!args.namespace) { - args.namespace = ((await prompt([ - { - type: 'list', - name: 'namespace', - message: `Which namespace do you want to generate the config for?`, - choices: namespaces, - default: currentNamespace, - }, - ])) as { namespace: string }).namespace; - } - - if (!namespaces.includes(args.namespace)) { - logger.error(`The namespace "${args.namespace}" does not exist.`); - process.exit(ExitCode.error); - return; - } - - const serviceAccounts = await getServiceAccountsForNamespace(args.namespace); - - if (!args.serviceAccount) { - args.serviceAccount = ((await prompt([ - { - type: 'list', - name: 'sa', - message: `Which serviceaccount in "${args.namespace}" do you want to generate the config for?`, - choices: serviceAccounts, - }, - ])) as { sa: string }).sa; - } - - if (!serviceAccounts.includes(args.serviceAccount)) { - logger.error(`The service account "${args.serviceAccount}" does not exist in namespace "${args.namespace}".`); - process.exit(ExitCode.error); - return; - } - - logger.info( - `Generate kube-config for account "${chalk.yellow(args.serviceAccount)}" in namespace "${chalk.yellow( - args.namespace, - )}".`, - ); - - try { - const config = await generateKubeConfig(args.namespace, args.serviceAccount); - - logger.info( - `Kube-Config for user "${chalk.yellow(args.serviceAccount)}" in namespace "${chalk.yellow(args.namespace)}":`, - ); - if (args.base64) { - logger.info('(Config is Base64 encoded)'); - } - - logger.output(`${EOL}${EOL}${args.base64 ? config.base64Encode() : config}${EOL}${EOL}`); - - logger.success(`Kube-Config created.`); - } catch (e) { - logger.error(`Error while fetching the config: ${e}`); - process.exit(ExitCode.error); - } - }, -}; diff --git a/src/commands/namespace/utils/kubens.ts b/src/commands/namespace/utils/kubens.ts deleted file mode 100644 index ee792e7..0000000 --- a/src/commands/namespace/utils/kubens.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { exec } from '../../../utils/exec'; -import { getCurrentContext } from '../../context/utils/kubectx'; - -export async function getCurrentNamespace(): Promise { - const currentContext = await getCurrentContext(); - return await exec( - `kubectl config view -o=jsonpath='{.contexts[?(@.name=="${currentContext}")].context.namespace}'`, - ); -} - -export async function getNamespaces(): Promise { - const value = await exec( - `kubectl get namespaces -o=jsonpath='{range .items[*].metadata.name}{@}{"\\n"}{end}'`, - ); - return value - .split('\n') - .filter(ns => !!ns) - .sort(); -} - -export async function getServiceAccountsForNamespace( - namespace: string, -): Promise { - const value = await exec( - `kubectl get serviceaccounts -n ${namespace} -o=jsonpath='{range .items[*].metadata.name}{@}{"\\n"}{end}'`, - ); - return value - .split('\n') - .filter(sa => !!sa) - .sort(); -} diff --git a/src/commands/prepare/index.ts b/src/commands/prepare/index.ts deleted file mode 100644 index 13bd364..0000000 --- a/src/commands/prepare/index.ts +++ /dev/null @@ -1,84 +0,0 @@ -import * as fastGlob from 'fast-glob'; -import { emptyDir, outputFile, pathExists, readdir, readFile, stat } from 'fs-extra'; -import { posix, sep } from 'path'; -import { Arguments, Argv, CommandModule } from 'yargs'; -import { RootArguments } from '../../root-arguments'; -import { envsubst } from '../../utils/envsubst'; -import { ExitCode } from '../../utils/exit-code'; -import { Logger } from '../../utils/logger'; - -type PrepareArguments = RootArguments & { - sourceFolder: string; - destinationFolder: string; -}; - -export const prepareCommand: CommandModule = { - command: 'prepare [sourceFolder] [destinationFolder]', - describe: 'Prepare all found yaml files.', - - builder: (argv: Argv) => - argv - .positional('sourceFolder', { - description: 'Folder to search for yaml files.', - type: 'string', - default: './k8s/', - }) - .positional('destinationFolder', { - description: 'Folder to put prepared yaml files in.', - type: 'string', - default: './deployment/', - }) - .completion('completion', false as any, async (_, argv: Arguments) => { - if (argv._.length >= 4) { - return []; - } - const dirs = []; - const directory = await readdir(process.cwd()); - for (const path of directory) { - const stats = await stat(path); - if (stats.isDirectory()) { - dirs.push(path); - } - } - return dirs; - }), - - async handler(args: PrepareArguments): Promise { - if (args.getYargsCompletions) { - return; - } - - const logger = new Logger('deployment'); - logger.debug('Prepare yaml files'); - - args.sourceFolder = posix.join(process.cwd(), args.sourceFolder); - args.destinationFolder = posix.join(process.cwd(), args.destinationFolder); - - if (!(await pathExists(args.sourceFolder))) { - logger.error('Source directory does not exist. Aborting.'); - process.exit(ExitCode.error); - return; - } - - if (await pathExists(args.destinationFolder)) { - logger.warn('Destination directory already exists, cleaning directory.'); - } - - await emptyDir(args.destinationFolder); - - const files = await fastGlob(['**/*.{yml,yaml}'], { - cwd: args.sourceFolder, - }); - logger.debug(`Found ${files.length} files for processing.`); - - for (const file of files) { - const destination = file.replace(new RegExp(sep, 'g'), '-'); - logger.debug(`Copy ${file} to ${destination} and replace env vars.`); - - const content = await readFile(posix.join(args.sourceFolder, file), 'utf8'); - await outputFile(posix.join(args.destinationFolder, destination), envsubst(content)); - } - - logger.success('Files prepared.'); - }, -}; diff --git a/src/commands/preview-deploy/index.ts b/src/commands/preview-deploy/index.ts deleted file mode 100644 index 418f687..0000000 --- a/src/commands/preview-deploy/index.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { V1Namespace, V1ObjectMeta } from '@kubernetes/client-node'; -import * as fastGlob from 'fast-glob'; -import { readFile } from 'fs-extra'; -import { EOL } from 'os'; -import { posix } from 'path'; -import { Arguments, Argv, CommandModule } from 'yargs'; -import { RootArguments } from '../../root-arguments'; -import { envsubst } from '../../utils/envsubst'; -import { exec } from '../../utils/exec'; -import { ExitCode } from '../../utils/exit-code'; -import { KubernetesApi } from '../../utils/kubernetes-api'; -import { Logger } from '../../utils/logger'; -import { kubeConfigCommand } from '../kube-config'; - -type PreviewDeployArguments = RootArguments & { - name: string; - sourceFolder: string; - prefix: string; - kubeConfig?: string; -}; - -const logger = new Logger('preview deployment'); - -async function createNamespace(api: KubernetesApi, name: string): Promise { - try { - logger.info(`Create preview namespace "${name}".`); - await api.core.readNamespace(name); - logger.info(`Namespace "${name}" already exists.`); - } catch (e) { - if (e.response.statusCode !== 404) { - throw e; - } - - await api.core.createNamespace({ - ...new V1Namespace(), - apiVersion: 'v1', - kind: 'Namespace', - metadata: { - ...new V1ObjectMeta(), - name, - }, - }); - logger.success(`Created namespace "${name}".`); - } -} - -export const previewDeployCommand: CommandModule = { - command: 'preview-deploy [sourceFolder]', - aliases: 'prev-dep', - describe: - 'Create opinionated preview deployment. This command creates a namespace ' + - 'and deploys the application in the given namespace.', - - builder: (argv: Argv) => - argv - .option('prefix', { - string: true, - description: 'Defines the prefix for the namespace name.', - default: 'prev-', - }) - .option('kube-config', { - string: true, - description: 'Define the kube config to use for namespace creation. Defaults to $KUBE_CONFIG variable.', - }) - .positional('name', { - description: 'Name of the preview namespace.', - type: 'string', - }) - .positional('sourceFolder', { - description: 'Folder to search for yaml files.', - type: 'string', - default: './k8s/', - }) as Argv, - - async handler(args: Arguments): Promise { - if (args.getYargsCompletions) { - return; - } - - logger.debug('Execute preview deployment'); - - const name = `${args.prefix}${args.name}`; - if (name.length > 64) { - logger.error(`Name of the namespace "${name}" is too long (max: 64 characters, is: ${args.name.length})`); - process.exit(ExitCode.error); - return; - } - - const api = args.kubeConfig - ? KubernetesApi.fromString(args.kubeConfig.isBase64() ? args.kubeConfig.base64Decode() : args.kubeConfig) - : KubernetesApi.fromDefault(); - - await createNamespace(api, name); - - const files = await fastGlob(['**/*.{yml,yaml}'], { - cwd: args.sourceFolder, - }); - logger.debug(`Found ${files.length} files for processing.`); - - const yamls = (await Promise.all(files.map(async f => await readFile(posix.join(args.sourceFolder, f), 'utf8')))) - .map(yaml => envsubst(yaml)) - .join(`${EOL}---${EOL}`); - - await kubeConfigCommand.handler({ - ...args, - configContent: args.kubeConfig, - noInteraction: true, - force: args.ci, - }); - - logger.debug('Executing apply -f ->'); - try { - const result = await exec(`echo "${yamls}" | kubectl -n ${name} apply -f -`); - logger.info(result); - } catch (e) { - logger.error(`Error: ${e}`); - process.exit(ExitCode.error); - return; - } - - logger.success(`Preview Deployment applied to namespace "${name}".`); - }, -}; diff --git a/src/commands/secret/basic-auth/index.ts b/src/commands/secret/basic-auth/index.ts deleted file mode 100644 index 967a9de..0000000 --- a/src/commands/secret/basic-auth/index.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { prompt } from 'inquirer'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../../root-arguments'; -import { Logger } from '../../../utils/logger'; -import { secretCreateCommand } from '../create'; - -const apacheMd5 = require('apache-md5'); - -type SecretBasicAuthArguments = RootArguments & { - name: string; - dryRun: boolean; - username?: string; - password?: string; -}; - -export const secretBasicAuthCommand: CommandModule = { - command: 'basic-auth [username] [password]', - aliases: 'ba', - describe: 'Create a secret used for basic auth with an ingress.', - - builder: (argv: Argv) => - argv - .example( - 'kuby secret basic-auth my-secret user pass', - 'This creates an secret with the name my-secret, the user "user" and password "pass".', - ) - .example( - 'kuby secret basic-auth my-secret user', - 'This creates an secret for basic auth and the password will be asked.', - ) - .example( - 'kuby secret basic-auth my-secret', - 'This creates an secret for basic auth and both, the user and the password, will be asked.', - ) - .option('dry-run', { - boolean: true, - default: false, - description: "Don't create secret on server. Log it to console instead.", - }) - .positional('name', { - description: 'Name of the secret to create', - type: 'string', - }) as unknown as Argv, - - async handler(args: Arguments): Promise { - const logger = new Logger('secrets'); - logger.debug('Create basic auth secret.'); - - const answers = await prompt([ - { - type: 'input', - name: 'username', - message: 'The username for basic auth?', - when: () => !!!args.username, - validate: (input: string) => !!input || 'Please enter a username.', - }, - { - type: 'password', - name: 'password', - message: 'The password for basic auth?', - when: () => !!!args.password, - validate: (input: string) => !!input || 'Please enter a password.', - }, - ]); - - const basicAuthArguments = { - ...args, - ...answers, - } as Arguments & Required>; - - logger.info(`Create basic auth secret for user "${basicAuthArguments.username}".`); - - await secretCreateCommand.handler({ - ...basicAuthArguments, - data: [ - { - name: 'auth', - value: `${basicAuthArguments.username}:${apacheMd5(basicAuthArguments.password)}`, - }, - ], - }); - }, -}; diff --git a/src/commands/secret/create/index.ts b/src/commands/secret/create/index.ts deleted file mode 100644 index 2ad8e53..0000000 --- a/src/commands/secret/create/index.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { dumpYaml, V1ObjectMeta, V1Secret } from '@kubernetes/client-node'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../../root-arguments'; -import { ExitCode } from '../../../utils/exit-code'; -import { KubernetesApi } from '../../../utils/kubernetes-api'; -import { Logger } from '../../../utils/logger'; - -type SecretCreateArguments = RootArguments & { - name: string; - dryRun: boolean; - - /** - * Array of already splitted and converted data for the secret. - */ - data: { name: string; value: string }[]; -}; - -export const secretCreateCommand: CommandModule = { - command: 'create ', - describe: 'Create a generic secret.', - - builder: (argv: Argv) => - (argv - .example( - 'kuby secret create my-secret foo=bar', - 'This creates an secret with the name my-secret and the data foo: bar. (bar will be base64 encoded)', - ) - .example( - 'kuby secret create my-secret foo=bar this=that good="morning sir"', - 'This creates an secret with the name my-secret and the given data (encoded).', - ) - .positional('name', { - description: 'Name of the secret to create', - type: 'string', - }) - .option('dry-run', { - boolean: true, - default: false, - description: "Don't create secret on server. Log it to console instead.", - }) - .positional('data', { - description: 'Array of secret data in the form of: key=value key=value key=value', - coerce: (data: string[]) => - data - .map(str => str.split('=')) - .map(([name, ...values]) => ({ - name, - value: values.join('='), - })) - .filter(obj => obj.name && obj.value), - type: 'string', - }) as unknown) as Argv, - - async handler(args: Arguments): Promise { - const logger = new Logger('secrets'); - logger.debug('Create secret with data.'); - - if (args.data.length <= 0) { - logger.error('No data given. Must be in format key=value or key="value value". Aborting.'); - process.exit(ExitCode.error); - return; - } - - const api = KubernetesApi.fromDefault(); - - logger.info(`Create secret with name "${args.name}".`); - logger.debug(`Add ${args.data.length} data keys.`); - try { - const secret = { - ...new V1Secret(), - apiVersion: 'v1', - kind: 'Secret', - type: 'Opaque', - metadata: { - ...new V1ObjectMeta(), - name: args.name, - }, - data: args.data.reduce( - (obj, cur) => { - obj[cur.name] = cur.value.base64Encode(); - return obj; - }, - {} as { [key: string]: string }, - ), - }; - if (args.dryRun) { - logger.info('Dry run set, only log the secret and return.'); - logger.output(`\n\n${dumpYaml(secret)}\n\n`); - } else { - logger.startSpinner('Creating...'); - await api.core.createNamespacedSecret(api.currentNamespace, secret); - logger.stopSpinner(); - } - logger.success('Secret created.'); - } catch ({ body: { message } }) { - logger.stopSpinner(); - logger.error('There was an error during the creation of the secret:'); - logger.error(message); - process.exit(ExitCode.error); - return; - } - }, -}; diff --git a/src/commands/secret/docker-registry/create/index.ts b/src/commands/secret/docker-registry/create/index.ts deleted file mode 100644 index bb21ea3..0000000 --- a/src/commands/secret/docker-registry/create/index.ts +++ /dev/null @@ -1,243 +0,0 @@ -import * as fastGlob from 'fast-glob'; -import { pathExists } from 'fs-extra'; -import { prompt, Separator } from 'inquirer'; -import { EOL } from 'os'; -import { parse, posix } from 'path'; -import { Arguments, Argv, CommandModule } from 'yargs'; -import { RootArguments } from '../../../../root-arguments'; -import { Crypto } from '../../../../utils/crypto'; -import { exec } from '../../../../utils/exec'; -import { ExitCode } from '../../../../utils/exit-code'; -import { Filepathes } from '../../../../utils/filepathes'; -import { Logger } from '../../../../utils/logger'; -import { RcFile } from '../../../../utils/rc-file'; -import { simpleConfirm } from '../../../../utils/simple-confirm'; -import { spawn } from '../../../../utils/spawn'; - -interface PromptAnswers { - server: string; - user: string; - email: string; - password: string; - saveSecret?: boolean; - saveSecretName?: string; -} - -type SecretDockerRegistryCreateArguments = RootArguments & { - name: string; - noInteraction: boolean; - from?: string; - server?: string; - user?: string; - email?: string; - password?: string; -}; - -async function loadDockerSecret(args: SecretDockerRegistryCreateArguments, path: string): Promise { - const secret = await Crypto.load(path); - args.server = secret.server; - args.user = secret.user; - args.email = secret.email; - args.password = secret.password; -} - -export const secretDockerRegistryCreateCommand: CommandModule = { - command: 'create ', - describe: - `Create a docker registry secret with the name "".${EOL}` + - 'For each option that is omitted, the user will be asked to enter the information.', - - builder: (argv: Argv) => - (argv - .example( - 'kuby secret docker-registry create test --server hub.docker.com ' + - '--user myaccount --email foo@bar.ch --password asdf', - 'This command creates a dockerconfigjson secret for the server hub.docker.com with the given credentials.', - ) - .example( - 'kuby secret docker-registry create test', - 'This command creates a dockerconfigjson secret named test, and the user will be asked for the other information.', - ) - .positional('name', { - description: 'The name of the secret.', - }) - .option('n', { - alias: 'no-interaction', - boolean: true, - default: false, - description: 'No interaction mode, use options or throw error.', - }) - .option('from', { - string: true, - description: 'Use an already saved dockersecret as template', - }) - .option('server', { - string: true, - description: 'The docker registry server (e.g. hub.docker.com).', - }) - .option('user', { - string: true, - description: 'Username of the docker user.', - }) - .option('email', { - string: true, - description: 'Email for the given user.', - }) - .option('password', { - string: true, - description: 'Password for the given user.', - }) as unknown) as Argv, - - async handler(args: Arguments): Promise { - const logger = new Logger('secrets'); - logger.debug('Create docker secret.'); - - const secrets = (await exec( - `kubectl ${RcFile.getKubectlArguments(args, [ - 'get', - 'secrets', - '-o', - `jsonpath='{range .items[*]}{@.metadata.name}{"\\n"}{end}'`, - ]).join(' ')}`, - )).split('\n'); - - if (secrets.includes(args.name)) { - logger.error(`The secret "${args.name}" already exists.`); - if (args.ci) { - logger.warn('CI Mode: existing secret does not fail command.'); - return; - } - process.exit(ExitCode.error); - return; - } - - if (args.from) { - const path = posix.join(Filepathes.dockerSecretPath, args.from); - if (await pathExists(path)) { - await loadDockerSecret(args, path); - } else { - logger.error(`The file ${path} does not exist. Cannot use template.`); - } - } else if (!!!args.from && !args.noInteraction) { - const secretFiles = await fastGlob(['./*'], { - cwd: Filepathes.dockerSecretPath, - }); - const selected = (await prompt([ - { - type: 'list', - name: 'file', - message: 'Use an existing secret as value template, or create a new one?', - choices: [ - { value: 'new', name: 'create new' }, - new Separator(), - ...secretFiles.map(file => ({ - value: file, - name: parse(file).name, - })), - ], - }, - ])) as { file: string }; - if (selected.file !== 'new') { - const path = posix.join(Filepathes.dockerSecretPath, selected.file); - args.from = selected.file; - await loadDockerSecret(args, path); - } - } - - if (args.noInteraction && (!args.server || !args.user || !args.email || !args.password)) { - logger.error('No interaction mode used but not all information present (server, user, mail, password).'); - process.exit(ExitCode.error); - return; - } - - const questions = [ - { - type: 'input', - name: 'server', - message: 'The server url of the registry?', - when: () => !args.noInteraction && !!!args.server, - validate: (input: string) => !!input || 'Please enter a server url.', - }, - { - type: 'input', - name: 'user', - message: 'The user of the registry?', - when: () => !args.noInteraction && !!!args.user, - validate: (input: string) => !!input || 'Please enter a username.', - }, - { - type: 'input', - name: 'email', - message: 'The email of the registry user?', - when: () => !args.noInteraction && !!!args.email, - validate: (input: string) => !!input || 'Please enter an email address.', - }, - { - type: 'password', - name: 'password', - message: 'The password of the registry user?', - when: () => !args.noInteraction && !!!args.password, - validate: (input: string) => !!input || 'Please enter a password.', - }, - { - type: 'confirm', - name: 'saveSecret', - message: 'Save the given secret as template (encrypted, to be used with --from in the future)?', - default: false, - when: () => !args.noInteraction && !!!args.from, - }, - { - type: 'input', - name: 'saveSecretName', - message: 'Name of the file?', - default: args.name, - when: (answers: PromptAnswers) => !args.noInteraction && !!!args.from && !!answers.saveSecret, - validate: (input: string) => !!input || 'Please enter a filename.', - }, - ]; - - const createArgs = { - ...args, - ...((await prompt(questions)) as PromptAnswers), - }; - - const code = await spawn( - 'kubectl', - RcFile.getKubectlArguments(args, [ - 'create', - 'secret', - 'docker-registry', - createArgs.name, - `--docker-server=${createArgs.server}`, - `--docker-username=${createArgs.user}`, - `--docker-email=${createArgs.email}`, - `--docker-password=${createArgs.password}`, - ]), - ); - if (code !== 0) { - logger.error('An error happend during the kubectl create secret command.'); - process.exit(ExitCode.error); - return; - } - - logger.success(`Docker-Registry secret "${args.name}" created.`); - - if (createArgs.saveSecret) { - const name = createArgs.saveSecretName || createArgs.name; - const path = posix.join(Filepathes.dockerSecretPath, name); - if ( - (await pathExists(path)) && - !(await simpleConfirm(`Secret with name "${name}" already exists, overwrite?`, false)) - ) { - return; - } - await Crypto.save(path, { - server: createArgs.server, - user: createArgs.user, - email: createArgs.email, - password: createArgs.password, - }); - logger.success(`Secret saved under ${path}.`); - } - }, -}; diff --git a/src/commands/secret/docker-registry/index.ts b/src/commands/secret/docker-registry/index.ts deleted file mode 100644 index 050a09a..0000000 --- a/src/commands/secret/docker-registry/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Argv, CommandModule, showHelp } from 'yargs'; - -import { secretDockerRegistryCreateCommand } from './create'; - -const secretDockerRegistryCommands: CommandModule[] = [secretDockerRegistryCreateCommand]; - -export const secretDockerRegistryCommand: CommandModule = { - command: 'docker-registry', - describe: 'Utilities for kubernetes docker registry secrets.', - - builder: (argv: Argv) => secretDockerRegistryCommands.reduce((_, cur) => argv.command(cur), argv), - - handler(): void { - showHelp('log'); - }, -}; diff --git a/src/commands/secret/index.ts b/src/commands/secret/index.ts deleted file mode 100644 index 65892ae..0000000 --- a/src/commands/secret/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Argv, CommandModule, showHelp } from 'yargs'; - -import { secretBasicAuthCommand } from './basic-auth'; -import { secretCreateCommand } from './create'; -import { secretDockerRegistryCommand } from './docker-registry'; - -const secretCommands: CommandModule[] = [secretBasicAuthCommand, secretCreateCommand, secretDockerRegistryCommand]; - -export const secretCommand: CommandModule = { - command: 'secret', - describe: 'Utilities for kubernetes secrets.', - - builder: (argv: Argv) => secretCommands.reduce((_, cur) => argv.command(cur), argv), - - handler(): void { - showHelp('log'); - }, -}; diff --git a/src/commands/version/index.ts b/src/commands/version/index.ts deleted file mode 100644 index 9dd9f41..0000000 --- a/src/commands/version/index.ts +++ /dev/null @@ -1,72 +0,0 @@ -import * as chalk from 'chalk'; -import { Arguments, Argv, CommandModule } from 'yargs'; - -import { RootArguments } from '../../root-arguments'; -import { exec } from '../../utils/exec'; -import { Logger } from '../../utils/logger'; -import { VersionInfo } from './version-info'; - -const { version } = require('../../../package.json'); - -export async function getVersionInfo(withRemote: boolean = false): Promise { - const result: VersionInfo = { - kubectlPlatform: 'unknown', - kubectlVersion: 'unknown', - toolVersion: version, - }; - - try { - const kubectlVersion = await exec(`kubectl version${withRemote ? '' : ' --client'}`); - const kubectlGitVersion = /Client.*GitVersion:"v(.*?)"/g.exec(kubectlVersion); - const kubectlPlatform = /Client.*Platform:"(.*?)"/g.exec(kubectlVersion); - - result.kubectlVersion = kubectlGitVersion ? kubectlGitVersion[1] : 'unknown'; - result.kubectlPlatform = kubectlPlatform ? kubectlPlatform[1] : 'unknown'; - - if (withRemote) { - const remoteGitVersion = /Server.*GitVersion:"v(.*?)"/g.exec(kubectlVersion); - const remotePlatform = /Server.*Platform:"(.*?)"/g.exec(kubectlVersion); - - result.remoteVersion = remoteGitVersion ? remoteGitVersion[1] : 'unknown'; - result.remotePlatform = remotePlatform ? remotePlatform[1] : 'unknown'; - } - } catch {} - - return result; -} - -export const versionCommand: CommandModule = { - command: 'version', - describe: 'Output the program version and the version of kubectl that is used.', - - builder: (argv: Argv) => - argv.option('remote', { - alias: 'r', - description: 'Include (or at least try to) the version numeber of the remote server of the actual context.', - boolean: true, - default: false, - }), - - async handler({ remote }: Arguments<{ remote: boolean }>): Promise { - const logger = new Logger('version'); - logger.debug('Print app version'); - - const versionInfo = await getVersionInfo(remote); - - logger.info(`kuby version: ${chalk.green(versionInfo.toolVersion)}`); - - logger.info( - `kubectl version: ${chalk.green(`v${versionInfo.kubectlVersion}`)} for platform: ${chalk.green( - versionInfo.kubectlPlatform, - )}`, - ); - - if (remote) { - logger.info( - `kubernetes remote version: ${chalk.green(`v${versionInfo.remoteVersion}`)} for platform: ${chalk.green( - versionInfo.remotePlatform || '', - )}`, - ); - } - }, -}; diff --git a/src/commands/version/version-info.ts b/src/commands/version/version-info.ts deleted file mode 100644 index 77048ad..0000000 --- a/src/commands/version/version-info.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Version info for the tooling and the kubectl cli as well. - * Does not contain the `v` in `kubectlVersion`. - * - * @export - * @interface VersionInfo - */ -export interface VersionInfo { - toolVersion: string; - kubectlVersion: string; - kubectlPlatform: string; - remoteVersion?: string; - remotePlatform?: string; -} diff --git a/src/extensions.d.ts b/src/extensions.d.ts deleted file mode 100644 index 162bea5..0000000 --- a/src/extensions.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare interface String { - isBase64(): boolean; - base64Encode(): string; - base64Decode(): string; -} diff --git a/src/kubernetes-helpers.ts b/src/kubernetes-helpers.ts deleted file mode 100644 index c846c1b..0000000 --- a/src/kubernetes-helpers.ts +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env node -import './utils/extensions'; - -import * as chalk from 'chalk'; -import { readFileSync } from 'fs-extra'; -import yargonaut = require('yargonaut'); -import { - alias, - Arguments, - command, - completion, - config as yargsConfig, - epilog, - help, - middleware, - option, - parse, - scriptName, - showHelp, - strict, - terminalWidth, - version, - wrap, -} from 'yargs'; - -import { commands } from './commands'; -import { envTrimPrefix } from './utils/env-trim-prefix'; -import { KubernetesApi } from './utils/kubernetes-api'; -import { Logger, LogLevel } from './utils/logger'; - -yargonaut.style('blue').errorsStyle('red.bold'); - -const findUp = require('find-up'); - -scriptName('kuby'); -version(false); - -strict(); - -middleware((args: Arguments) => { - args.logLevel = (LogLevel[args['logLevel']] as unknown) as LogLevel; - Logger.level = args['logLevel']; -}); - -middleware((args: Arguments) => { - if (args.trimEnvPrefix) { - envTrimPrefix(args.trimEnvPrefix); - } -}); - -middleware((args: Arguments) => { - if (args.namespace) { - KubernetesApi.namespaceOverride = args.namespace; - } - if (args.context) { - KubernetesApi.contextOverride = args.context; - } -}); - -for (const cmd of commands) { - command(cmd); -} - -completion(); - -option('ci', { - description: 'CI Mode (non-interactive and biased)', - boolean: true, - default: false, - global: true, -}); -option('context', { - description: 'The context to run the given subcommand in', - alias: 'ctx', - string: true, - global: true, -}); -option('namespace', { - description: 'The namespace to run the given subcommand in', - alias: 'ns', - string: true, - global: true, -}); -option('log-level', { - alias: 'll', - description: 'Loglevel of the tool.', - choices: ['debug', 'info', 'warn', 'error'], - default: 'info', -}); -option('trim-env-prefix', { - alias: 'p', - description: 'Prefix to trim from env variables', - default: '', -}); - -try { - const configPath = findUp.sync(['.kubyrc', '.kubyrc.json']); - const config = configPath ? JSON.parse(readFileSync(configPath, 'utf8')) : {}; - yargsConfig(config); -} catch { - console.warn(chalk.yellow('The given config (.kubyrc / .kubyrc.json) could not be read.')); - console.warn(chalk.yellow('Please ensure, it is a valid json file.')); -} - -alias('h', 'help'); -help('help'); -wrap(terminalWidth()); - -epilog(chalk.dim('This tool intends to help with everyday kubernetes administration.')); - -const args = parse(); -if (args._.length === 0 && !args.getYargsCompletions) { - showHelp('log'); -} diff --git a/src/root-arguments.ts b/src/root-arguments.ts deleted file mode 100644 index 6dc41d4..0000000 --- a/src/root-arguments.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { LogLevel } from './utils/logger'; - -export interface RootArguments { - ci: boolean; - logLevel: LogLevel; - context?: string; - namespace?: string; - trimEnvPrefix?: string; - getYargsCompletions?: boolean; -} diff --git a/src/typings.d.ts b/src/typings.d.ts deleted file mode 100644 index 63fa02f..0000000 --- a/src/typings.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'yargonaut'; diff --git a/src/utils/crypto.ts b/src/utils/crypto.ts deleted file mode 100644 index 4d4698d..0000000 --- a/src/utils/crypto.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { createCipheriv, createDecipheriv, createHmac, randomBytes } from 'crypto'; -import { outputFile, readFile } from 'fs-extra'; - -const { machineId } = require('node-machine-id'); - -const algorithm = 'aes-256-cbc'; -const hash = 'sha256'; -const ivLength = 16; - -export class Crypto { - private constructor() {} - - public static async save(filepath: string, object: T): Promise { - const iv = randomBytes(ivLength); - const cipher = createCipheriv(algorithm, await Crypto.getKey(), iv); - const content = JSON.stringify(object); - - const encrypted = cipher.update(content); - const buffer = `${iv.toString('hex')}:${Buffer.concat([ - encrypted, - cipher.final(), - ]).toString('hex')}`; - - await outputFile(filepath, buffer, { encoding: 'utf8' }); - } - - public static async load(filepath: string): Promise { - const content = (await readFile(filepath, { encoding: 'utf8' })).split(':'); - const iv = Buffer.from(content.shift()!, 'hex'); - const encrypted = Buffer.from(content.join(':'), 'hex'); - - const cipher = createDecipheriv(algorithm, await Crypto.getKey(), iv); - - let decrypted = cipher.update(encrypted); - decrypted = Buffer.concat([decrypted, cipher.final()]); - - return JSON.parse(decrypted.toString()); - } - - private static async getKey(): Promise { - const machineKey = await machineId(); - return createHmac(hash, machineKey) - .update(machineKey) - .digest(); - } -} diff --git a/src/utils/env-trim-prefix.ts b/src/utils/env-trim-prefix.ts deleted file mode 100644 index 6a3ef71..0000000 --- a/src/utils/env-trim-prefix.ts +++ /dev/null @@ -1,6 +0,0 @@ -export function envTrimPrefix(prefix: string): void { - Object.keys(process.env) - .filter(n => n.startsWith(prefix)) - .map(n => n.substr(prefix.length)) - .forEach(n => process.env[n] = process.env[prefix + n]); -} diff --git a/src/utils/envsubst.ts b/src/utils/envsubst.ts deleted file mode 100644 index f2c3db3..0000000 --- a/src/utils/envsubst.ts +++ /dev/null @@ -1,24 +0,0 @@ -export function envsubst(content: string): string { - const regex = /\$(?:(\w+)|{(\w+)})/g; - - return content.replace(regex, (original, g1: string, g2: string) => { - const variable = g1 || g2; - - return process.env.hasOwnProperty(variable) - ? process.env[variable]! - : original; - }); -} - -export function datasubst( - content: string, - data: { [key: string]: string }, -): string { - const regex = /\$(?:(\w+)|{(\w+)})/g; - - return content.replace(regex, (original, g1: string, g2: string) => { - const variable = g1 || g2; - - return data.hasOwnProperty(variable) ? data[variable]! : original; - }); -} diff --git a/src/utils/exec.ts b/src/utils/exec.ts deleted file mode 100644 index fd67a8b..0000000 --- a/src/utils/exec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { exec as procExec } from 'child_process'; - -export function exec(command: string): Promise { - return new Promise((resolve, reject) => { - procExec(command, (err, stdout, stderr) => { - if (err || stderr) { - reject(err || stderr); - return; - } - resolve(stdout); - }); - }); -} diff --git a/src/utils/exit-code.ts b/src/utils/exit-code.ts deleted file mode 100644 index ce5e206..0000000 --- a/src/utils/exit-code.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const enum ExitCode { - error = 1, -} diff --git a/src/utils/extensions.ts b/src/utils/extensions.ts deleted file mode 100644 index e55c683..0000000 --- a/src/utils/extensions.ts +++ /dev/null @@ -1,15 +0,0 @@ -import inquirer = require('inquirer'); - -inquirer.registerPrompt('autocomplete', require('inquirer-autocomplete-prompt')); - -String.prototype.isBase64 = function (this: string): boolean { - return Buffer.from(this, 'base64').toString('base64') === this; -}; - -String.prototype.base64Encode = function (this: string): string { - return Buffer.from(this).toString('base64'); -}; - -String.prototype.base64Decode = function (this: string): string { - return Buffer.from(this, 'base64').toString('utf8'); -}; diff --git a/src/utils/filepathes.ts b/src/utils/filepathes.ts deleted file mode 100644 index 1fcf899..0000000 --- a/src/utils/filepathes.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { homedir } from 'os'; -import { posix } from 'path'; - -const basepath = posix.join(homedir(), '.kube', 'kuby'); - -export class Filepathes { - public static get configPath(): string { - return posix.join(homedir(), '.kube', 'config'); - } - - public static get dockerSecretPath(): string { - return posix.join(this.secretsPath, 'docker-registry'); - } - - public static get kubectlInstallPath(): string { - return posix.join(basepath, 'kubectl'); - } - - public static get kubectlVersionsPath(): string { - return posix.join(this.kubectlInstallPath, 'versions'); - } - - public static get namespacePath(): string { - return posix.join(basepath, 'namespace'); - } - - public static get namespaceDefaultRolePath(): string { - return posix.join(this.namespacePath, 'default-role.yml'); - } - - public static get secretsPath(): string { - return posix.join(basepath, 'secret'); - } - - private constructor() {} -} diff --git a/src/utils/kubernetes-api.ts b/src/utils/kubernetes-api.ts deleted file mode 100644 index 487bec2..0000000 --- a/src/utils/kubernetes-api.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { CoreV1Api, KubeConfig } from '@kubernetes/client-node'; -import { Context } from '@kubernetes/client-node/dist/config_types'; - -export class KubernetesApi { - public static contextOverride: string | undefined; - - public static namespaceOverride: string | undefined; - - /** - * Manage elements of the kubernetes core api. - */ - public readonly core: CoreV1Api; - - /** - * Manage kube-config. - */ - public readonly kubeConfig: KubeConfig; - - /** - * Convenience getter for current context. - * - * @throws {Error} When the returned context from the config is `null`. - */ - public get currentContext(): Context { - const contextName = this.kubeConfig.getCurrentContext(); - const context = this.kubeConfig.getContextObject(contextName); - if (context == null) { - throw new Error(`No context with name '${contextName}' found.`); - } - return context; - } - - /** - * Convenience getter for current namespace. Does take overrides into account (--ns). - * Returns "default" when no "current" namespace is set - * on the context. - */ - public get currentNamespace(): string { - return KubernetesApi.namespaceOverride || this.currentContext.namespace || 'default'; - } - - private constructor(kubeConfig: KubeConfig) { - this.kubeConfig = kubeConfig; - if (KubernetesApi.contextOverride) { - this.kubeConfig.setCurrentContext(KubernetesApi.contextOverride); - } - - this.core = this.kubeConfig.makeApiClient(CoreV1Api); - } - - /** - * Creates a kubernetes api from the default configuration - * (located at `~/.kube/config` or the env var that points - * to the kube config). - */ - public static fromDefault(): KubernetesApi { - const kubeConfig = new KubeConfig(); - kubeConfig.loadFromDefault(); - return new KubernetesApi(kubeConfig); - } - - /** - * Creates the kubernetes api from a given string content. - */ - public static fromString(content: string): KubernetesApi { - const kubeConfig = new KubeConfig(); - kubeConfig.loadFromString(content); - return new KubernetesApi(kubeConfig); - } -} diff --git a/src/utils/logger.ts b/src/utils/logger.ts deleted file mode 100644 index 200c884..0000000 --- a/src/utils/logger.ts +++ /dev/null @@ -1,123 +0,0 @@ -import * as chalk from 'chalk'; - -export enum LogLevel { - debug, - info, - warn, - error, - output, -} - -const ora = require('ora'); - -export class Logger { - public static level: LogLevel = LogLevel.info; - private spinner: typeof ora | undefined; - - constructor(private prefix: string = '') {} - - public startSpinner( - initialText: string, - level: LogLevel = LogLevel.info, - ): void { - if (level < Logger.level) { - return; - } - this.spinner = ora(initialText).start(); - } - - public stopSpinner(): void { - if (!this.spinner) { - return; - } - this.spinner.stop(); - delete this.spinner; - } - - public setSpinnerText(text: string): void { - if (!this.spinner) { - return; - } - setTimeout(() => { - if (this.spinner) { - this.spinner.text = text; - } - }, 0); - } - - public spinnerSuccess(text?: string): void { - if (!this.spinner) { - return; - } - this.spinner.succeed(text); - delete this.spinner; - } - - public spinnerFail(text?: string): void { - if (!this.spinner) { - return; - } - this.spinner.fail(text); - delete this.spinner; - } - - public log(level: LogLevel, message: string): void { - if (level < Logger.level || this.spinner) { - return; - } - this.getLogFunction(level)(`${this.getLevelPrefix(level)}${message}`); - } - - public debug(message: string): void { - this.log(LogLevel.debug, message); - } - - public info(message: string): void { - this.log(LogLevel.info, message); - } - - public output(message: string): void { - this.log(LogLevel.output, message); - } - - public success(message: string): void { - this.log(LogLevel.info, chalk.green(message)); - } - - public warn(message: string): void { - this.log(LogLevel.warn, chalk.yellow(message)); - } - - public error(message: string): void { - this.log(LogLevel.error, chalk.red(message)); - } - - private getLevelPrefix(level: LogLevel): string { - if (!this.prefix) { - return ''; - } - switch (level) { - case LogLevel.debug: - return chalk.grey(`[${this.prefix}]: `); - case LogLevel.warn: - return chalk.yellow(`[${this.prefix}]: `); - case LogLevel.error: - return chalk.red(`[${this.prefix}]: `); - default: - return chalk.blue(`[${this.prefix}]: `); - } - } - - private getLogFunction(level: LogLevel): (message: string) => void { - switch (level) { - case LogLevel.debug: - return console.debug; - case LogLevel.warn: - return console.warn; - case LogLevel.error: - return console.error; - default: - return console.info; - } - } -} diff --git a/src/utils/rc-file.ts b/src/utils/rc-file.ts deleted file mode 100644 index 6fb6322..0000000 --- a/src/utils/rc-file.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as chalk from 'chalk'; - -import { RootArguments } from '../root-arguments'; -import { Logger } from './logger'; - -/** - * @deprecated Will be removed (the class, not the rc file) - * as soon as kubernetes-api is fully implemented for communicating with - * the server. - */ -export class RcFile { - private static logger: Logger = new Logger('.rc file'); - - private constructor() {} - - public static getKubectlArguments(rootArgs: RootArguments, args: string[]): string[] { - let kubectlArgs = RcFile.getKubectlCtxArguments(rootArgs, args); - kubectlArgs = RcFile.getKubectlNsArguments(rootArgs, kubectlArgs); - return kubectlArgs; - } - - public static getKubectlCtxArguments({ context }: RootArguments, args: string[]): string[] { - if (context) { - RcFile.logger.info(`Context set to ${chalk.yellow(context)}.`); - args.unshift(context); - args.unshift('--context'); - } - return args; - } - - public static getKubectlNsArguments({ namespace }: RootArguments, args: string[]): string[] { - if (namespace) { - RcFile.logger.info(`Namespace set to ${chalk.yellow(namespace)}.`); - args.unshift(namespace); - args.unshift('--namespace'); - } - return args; - } -} diff --git a/src/utils/simple-confirm.ts b/src/utils/simple-confirm.ts deleted file mode 100644 index b7c506e..0000000 --- a/src/utils/simple-confirm.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { prompt } from 'inquirer'; - -export async function simpleConfirm(message: string, defaultValue: boolean): Promise { - const answer = await prompt([ - { - message, - type: 'confirm', - name: 'confirm', - default: defaultValue, - }, - ]) as { confirm: boolean }; - - return answer.confirm; -} diff --git a/src/utils/spawn.ts b/src/utils/spawn.ts deleted file mode 100644 index 855e57b..0000000 --- a/src/utils/spawn.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { spawn as procSpawn } from 'child_process'; - -import { Logger } from './logger'; - -export function spawn(command: string, args: string[] = []): Promise { - const logger = new Logger(`exec ${command}`); - - return new Promise((resolve, reject) => { - const child = procSpawn(command, args, { - stdio: 'pipe', - }); - - child.stderr.on('data', logger.error.bind(logger)); - child.stdout.on('data', logger.info.bind(logger)); - - child.on('error', err => reject(err)).on('exit', code => resolve(code || 0)); - }); -} diff --git a/test/__mocks__/fs.js b/test/__mocks__/fs.js deleted file mode 100644 index 3123366..0000000 --- a/test/__mocks__/fs.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('memfs').fs; diff --git a/test/commands/apply/apply.spec.ts b/test/commands/apply/apply.spec.ts deleted file mode 100644 index 991573f..0000000 --- a/test/commands/apply/apply.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { vol } from 'memfs'; - -import { applyCommand } from '../../../src/commands/apply'; -import { kubeConfigCommand } from '../../../src/commands/kube-config'; -import { spawn } from '../../../src/utils/spawn'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / apply', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - afterEach(() => { - clearGlobalMocks(); - }); - - it('should return when used with completion args', async () => { - expect(await applyCommand.handler({ getYargsCompletions: true } as any)).toBeUndefined(); - expect(process.exit).not.toHaveBeenCalled(); - }); - - it('should fail when deployfolder is not present', async () => { - await applyCommand.handler({ deployFolder: './deploy' } as any); - expect(process.exit).toHaveBeenCalledWith(1); - }); - - it('should not fail when deployfolder is not present', async () => { - vol.fromJSON( - { - './deploy/file.yml': '', - }, - process.cwd(), - ); - await applyCommand.handler({ deployFolder: './deploy' } as any); - expect(process.exit).not.toHaveBeenCalled(); - expect(spawn).toHaveBeenCalledWith('kubectl', ['apply', '-f', './deploy']); - }); - - it('should fail when spawn returns non zero code', async () => { - vol.fromJSON( - { - './deploy/file.yml': '', - }, - process.cwd(), - ); - (spawn as any as jest.Mock).mockReturnValue(1); - await applyCommand.handler({ deployFolder: './deploy' } as any); - expect(process.exit).toHaveBeenCalled(); - }); - - it('should call kube-config command in ci mode', async () => { - kubeConfigCommand.handler = jest.fn(() => Promise.resolve()); - vol.fromJSON( - { - './deploy/file.yml': '', - }, - process.cwd(), - ); - await applyCommand.handler({ deployFolder: './deploy', ci: true } as any); - expect(kubeConfigCommand.handler).toHaveBeenCalled(); - }); -}); diff --git a/test/commands/base64/base64.decode.spec.ts b/test/commands/base64/base64.decode.spec.ts deleted file mode 100644 index eb38192..0000000 --- a/test/commands/base64/base64.decode.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { write } from 'clipboardy'; - -import { base64DecodeCommand } from '../../../src/commands/base64/decode'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / base64 / decode', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - afterEach(() => clearGlobalMocks()); - - it('should output base64 decoded content', async () => { - await base64DecodeCommand.handler({ - content: 'Zm9vYmFy', - noClip: false, - } as any); - - expect((Logger as any).instance.output.mock.calls[0][0]).toBe('foobar'); - }); - - it('should write base64 decoded content to clipboard', async () => { - await base64DecodeCommand.handler({ - content: 'Zm9vYmFy', - noClip: false, - } as any); - - expect((write as any).mock.calls[0][0]).toBe('foobar'); - }); - - it('should not write base64 decoded content to clipboard when noClip is set', async () => { - await base64DecodeCommand.handler({ - content: 'Zm9vYmFy', - noClip: true, - } as any); - - expect(write).not.toHaveBeenCalled(); - }); -}); diff --git a/test/commands/base64/base64.encode.spec.ts b/test/commands/base64/base64.encode.spec.ts deleted file mode 100644 index 32f0de5..0000000 --- a/test/commands/base64/base64.encode.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { write } from 'clipboardy'; - -import { base64EncodeCommand } from '../../../src/commands/base64/encode'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / base64 / encode', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - afterEach(() => clearGlobalMocks()); - - it('should output base64 encoded content', async () => { - await base64EncodeCommand.handler({ - content: 'foobar', - noClip: false, - } as any); - - expect((Logger as any).instance.output.mock.calls[0][0]).toBe('Zm9vYmFy'); - }); - - it('should write base64 encoded content to clipboard', async () => { - await base64EncodeCommand.handler({ - content: 'foobar', - noClip: false, - } as any); - - expect((write as any).mock.calls[0][0]).toBe('Zm9vYmFy'); - }); - - it('should not write base64 encoded content to clipboard when noClip is set', async () => { - await base64EncodeCommand.handler({ - content: 'foobar', - noClip: true, - } as any); - - expect(write).not.toHaveBeenCalled(); - }); -}); diff --git a/test/commands/cleanup/cleanup.spec.ts b/test/commands/cleanup/cleanup.spec.ts deleted file mode 100644 index 71836c4..0000000 --- a/test/commands/cleanup/cleanup.spec.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { Arguments } from 'yargs'; -import { CleanupArguments, cleanupCommand } from '../../../src/commands/cleanup'; -import { exec } from '../../../src/utils/exec'; -import { LogLevel } from '../../../src/utils/logger'; -import * as Confirm from '../../../src/utils/simple-confirm'; -import { spawn } from '../../../src/utils/spawn'; -import { clearGlobalMocks } from '../../helpers'; - -const defaultArgs: Arguments = { - names: [], - resources: ['ingress', 'service', 'deployment', 'pvc', 'configmap', 'secret', 'certificate'], - dryRun: false, - ci: false, - logLevel: LogLevel.info, - _: [], - $0: '', -}; - -const demoResources = `Ingress|demo-1|ns-1 -Ingress|demo-2|ns-1 -Ingress|demo-3|ns-1 -Service|foo-demo-bar|ns-1 -Deployment|asdf-qwer|ns-1 -`; - -describe('commands / cleanup', () => { - let confirm: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - confirm = jest.spyOn(Confirm, 'simpleConfirm').mockResolvedValue(true); - }); - - afterEach(() => { - clearGlobalMocks(); - confirm.mockClear(); - }); - - afterAll(() => { - confirm.mockRestore(); - }); - - it('should call for the default resources', async () => { - (exec as jest.Mock).mockResolvedValueOnce(''); - await cleanupCommand.handler(defaultArgs); - expect(exec).toHaveBeenCalledWith( - `kubectl get ingress,service,deployment,pvc,configmap,secret,certificate -o jsonpath=\"{range $.items[*]}{.kind}|{.metadata.name}|{.metadata.namespace}{'\\n'}{end}\"`, - ); - }); - - it('should correctly parse given resources', async () => { - (exec as jest.Mock).mockResolvedValueOnce(''); - await cleanupCommand.handler({ - ...defaultArgs, - resources: ['ing,svc', 'cm'], - }); - expect(exec).toHaveBeenCalledWith( - `kubectl get ing,svc,cm -o jsonpath=\"{range $.items[*]}{.kind}|{.metadata.name}|{.metadata.namespace}{'\\n'}{end}\"`, - ); - }); - - it('should filter the correct resources in exact mode', async () => { - (exec as jest.Mock).mockResolvedValueOnce(demoResources); - await cleanupCommand.handler({ - ...defaultArgs, - exactMatch: true, - names: ['demo-1', 'demo-2'], - }); - expect(spawn).toHaveBeenCalledWith('kubectl', ['delete', 'Ingress/demo-1', 'Ingress/demo-2']); - }); - - it('should filter the correct resources in partial mode', async () => { - (exec as jest.Mock).mockResolvedValueOnce(demoResources); - await cleanupCommand.handler({ - ...defaultArgs, - names: ['demo', 'asdf'], - }); - expect(spawn).toHaveBeenCalledWith('kubectl', [ - 'delete', - 'Ingress/demo-1', - 'Ingress/demo-2', - 'Ingress/demo-3', - 'Service/foo-demo-bar', - 'Deployment/asdf-qwer', - ]); - }); - - it('should filter the correct resources in regex mode', async () => { - (exec as jest.Mock).mockResolvedValueOnce(demoResources); - await cleanupCommand.handler({ - ...defaultArgs, - regex: true, - names: ['demo-\\d'], - }); - expect(spawn).toHaveBeenCalledWith('kubectl', ['delete', 'Ingress/demo-1', 'Ingress/demo-2', 'Ingress/demo-3']); - }); - - it('should not do anything if resulting list is empty', async () => { - (exec as jest.Mock).mockResolvedValueOnce(demoResources); - await cleanupCommand.handler({ - ...defaultArgs, - exactMatch: true, - names: ['asdfasdfasdf'], - }); - expect(spawn).not.toHaveBeenCalled(); - }); - - it('should do nothing if in dry run mode', async () => { - (exec as jest.Mock).mockResolvedValueOnce(demoResources); - await cleanupCommand.handler({ - ...defaultArgs, - dryRun: true, - names: ['demo'], - }); - expect(spawn).not.toHaveBeenCalled(); - }); - - it('should ask the user to proceed if not in ci mode', async () => { - (exec as jest.Mock).mockResolvedValueOnce(demoResources); - await cleanupCommand.handler({ - ...defaultArgs, - names: ['demo'], - }); - expect(confirm).toHaveBeenCalled(); - expect(spawn).toHaveBeenCalled(); - }); - - it('should not ask the user to proceed if in ci mode', async () => { - (exec as jest.Mock).mockResolvedValueOnce(demoResources); - await cleanupCommand.handler({ - ...defaultArgs, - ci: true, - names: ['demo'], - }); - expect(confirm).not.toHaveBeenCalled(); - expect(spawn).toHaveBeenCalled(); - }); -}); diff --git a/test/commands/context/context.spec.ts b/test/commands/context/context.spec.ts deleted file mode 100644 index 81b7288..0000000 --- a/test/commands/context/context.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { prompt } from 'inquirer'; -import { EOL } from 'os'; - -import { contextCommand } from '../../../src/commands/context'; -import { exec } from '../../../src/utils/exec'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / context', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - afterEach(() => { - clearGlobalMocks(); - }); - - it('should return when used with completion args', async () => { - expect(await contextCommand.handler({ getYargsCompletions: true } as any)).toBeUndefined(); - expect((Logger as any).instance).toBeUndefined(); - }); - - it('should ask the user if no is set', async () => { - (prompt as any as jest.Mock).mockResolvedValue({ context: 'current' }); - (exec as jest.Mock).mockResolvedValueOnce('current').mockResolvedValueOnce(`current${EOL}non-current${EOL}third`); - - await contextCommand.handler({} as any); - - expect(prompt).toHaveBeenCalled(); - }); - - it('should not ask the user if is set', async () => { - (exec as jest.Mock).mockResolvedValueOnce('current').mockResolvedValueOnce(`current${EOL}non-current${EOL}third`); - - await contextCommand.handler({ name: 'current' } as any); - - expect(prompt).not.toHaveBeenCalled(); - }); - - it('should not do anything if is current', async () => { - (exec as jest.Mock).mockResolvedValueOnce('current').mockResolvedValueOnce(`current${EOL}non-current${EOL}third`); - - await contextCommand.handler({ name: 'current' } as any); - - expect((Logger as any).instance.info.mock.calls[0][0]).toBe('No different context selected, exiting.'); - }); - - it('should exit if does not exist', async () => { - (exec as jest.Mock).mockResolvedValueOnce('current').mockResolvedValueOnce(`current${EOL}non-current${EOL}third`); - - await contextCommand.handler({ name: 'foobar' } as any); - - expect(process.exit).toHaveBeenCalledWith(1); - }); - - it('should switch then context if does exist', async () => { - (prompt as any as jest.Mock).mockResolvedValue({ context: 'current' }); - (exec as jest.Mock).mockResolvedValueOnce('current').mockResolvedValueOnce(`current${EOL}non-current${EOL}third`); - - await contextCommand.handler({ name: 'third' } as any); - - expect(process.exit).not.toHaveBeenCalled(); - expect(exec).toHaveBeenNthCalledWith(3, `kubectl config use-context "third"`); - }); -}); diff --git a/test/commands/context/context.utils.kubectx.spec.ts b/test/commands/context/context.utils.kubectx.spec.ts deleted file mode 100644 index fc4ca6e..0000000 --- a/test/commands/context/context.utils.kubectx.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { EOL } from 'os'; - -import { getContexts, getCurrentContext } from '../../../src/commands/context/utils/kubectx'; -import { exec } from '../../../src/utils/exec'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / context / utils / kubectx', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - afterEach(() => { - clearGlobalMocks(); - }); - - describe('getContexts()', () => { - it('should call kubectl config', async () => { - (exec as jest.Mock).mockReturnValue(''); - await getContexts(); - expect(exec as jest.Mock).toHaveBeenCalledWith('kubectl config get-contexts -o=name'); - }); - - it('should split contexts by EOL', async () => { - (exec as jest.Mock).mockReturnValue(`foo${EOL}bar${EOL}`); - const result = await getContexts(); - expect(result).toBeInstanceOf(Array); - expect(result).toHaveLength(2); - }); - - it('should filter empty values', async () => { - (exec as jest.Mock).mockReturnValue(`foo${EOL}bar${EOL}${EOL}${EOL}`); - const result = await getContexts(); - expect(result).toBeInstanceOf(Array); - expect(result).toHaveLength(2); - }); - - it('should sort the list', async () => { - (exec as jest.Mock).mockReturnValue(`foo${EOL}bar${EOL}`); - const result = await getContexts(); - expect(result).toBeInstanceOf(Array); - expect(result).toEqual(['bar', 'foo']); - }); - }); - - describe('getCurrentContext()', () => { - it('should call kubectl config', async () => { - await getCurrentContext(); - expect(exec as jest.Mock).toHaveBeenCalledWith(`kubectl config view -o=jsonpath='{.current-context}'`); - }); - }); -}); diff --git a/test/commands/delete/delete.spec.ts b/test/commands/delete/delete.spec.ts deleted file mode 100644 index 035adf9..0000000 --- a/test/commands/delete/delete.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { deleteCommand } from '../../../src/commands/delete'; -import { kubeConfigCommand } from '../../../src/commands/kube-config'; -import { prepareCommand } from '../../../src/commands/prepare'; -import { Logger } from '../../../src/utils/logger'; -import { spawn } from '../../../src/utils/spawn'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / delete', () => { - let prepare: jest.SpyInstance; - let kubeConfig: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - prepare = jest.spyOn(prepareCommand, 'handler').mockResolvedValue(undefined); - kubeConfig = jest.spyOn(kubeConfigCommand, 'handler').mockResolvedValue(undefined); - }); - - afterEach(() => { - clearGlobalMocks(); - prepare.mockClear(); - kubeConfig.mockClear(); - }); - - afterAll(() => { - prepare.mockRestore(); - kubeConfig.mockRestore(); - }); - - it('should return when used with completion args', async () => { - expect(await deleteCommand.handler({ getYargsCompletions: true } as any)).toBeUndefined(); - expect((Logger as any).instance.debug).not.toHaveBeenCalled(); - }); - - it('should call prepare', async () => { - await deleteCommand.handler({} as any); - expect(prepare).toHaveBeenCalled(); - }); - - it('should call kubeConfig (login) when in ci mode', async () => { - await deleteCommand.handler({ ci: true } as any); - expect(kubeConfig).toHaveBeenCalled(); - }); - - it('should call kubectl delete', async () => { - (spawn as jest.Mock).mockResolvedValue(0); - await deleteCommand.handler({ destinationFolder: './foobar' } as any); - expect(spawn).toHaveBeenCalledWith('kubectl', ['delete', '-f', './foobar']); - }); - - it('should exit when kubectl returns non zero exitcode', async () => { - (spawn as jest.Mock).mockResolvedValue(1); - await deleteCommand.handler({ destinationFolder: './foobar' } as any); - expect(process.exit).toHaveBeenCalledWith(1); - }); -}); diff --git a/test/commands/deploy/deploy.spec.ts b/test/commands/deploy/deploy.spec.ts deleted file mode 100644 index 1bc6751..0000000 --- a/test/commands/deploy/deploy.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { applyCommand } from '../../../src/commands/apply'; -import { deployCommand } from '../../../src/commands/deploy'; -import { prepareCommand } from '../../../src/commands/prepare'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / deploy', () => { - let prepare: jest.SpyInstance; - let apply: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - prepare = jest.spyOn(prepareCommand, 'handler').mockResolvedValue(undefined); - apply = jest.spyOn(applyCommand, 'handler').mockResolvedValue(undefined); - }); - - afterEach(() => { - clearGlobalMocks(); - prepare.mockClear(); - apply.mockClear(); - }); - - afterAll(() => { - prepare.mockRestore(); - apply.mockRestore(); - }); - - it('should return when used with completion args', async () => { - expect(await deployCommand.handler({ getYargsCompletions: true } as any)).toBeUndefined(); - expect((Logger as any).instance.debug).not.toHaveBeenCalled(); - }); - - it('should call prepare', async () => { - await deployCommand.handler({} as any); - expect(prepare).toHaveBeenCalled(); - }); - - it('should call apply', async () => { - await deployCommand.handler({} as any); - expect(apply).toHaveBeenCalled(); - }); -}); diff --git a/test/commands/kube-config/kube-config.spec.ts b/test/commands/kube-config/kube-config.spec.ts deleted file mode 100644 index b6a7b2a..0000000 --- a/test/commands/kube-config/kube-config.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { vol } from 'memfs'; -import { homedir } from 'os'; -import { posix } from 'path'; -import { kubeConfigCommand } from '../../../src/commands/kube-config'; -import { Logger } from '../../../src/utils/logger'; -import * as Helper from '../../../src/utils/simple-confirm'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / kube-config', () => { - const configPath = posix.join(homedir(), '.kube', 'config'); - let confirm: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - confirm = jest.spyOn(Helper, 'simpleConfirm').mockResolvedValue(true); - }); - - afterEach(() => { - clearGlobalMocks(); - delete process.env['KUBE_CONFIG']; - confirm.mockClear(); - }); - - afterAll(() => { - confirm.mockRestore(); - }); - - it('should exit when no content given and no env var is set', async () => { - await kubeConfigCommand.handler({ noInteraction: true } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error.mock.calls[0][0]).toBe('Neither env variable nor content provided. Aborting.'); - }); - - it('should exit when content is empty', async () => { - await kubeConfigCommand.handler({ - noInteraction: true, - configContent: ' ', - } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error.mock.calls[0][0]).toBe('Config content is empty. Aborting.'); - }); - - it('should exit when env var is empty', async () => { - process.env['KUBE_CONFIG'] = ' '; - await kubeConfigCommand.handler({ - noInteraction: true, - } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error.mock.calls[0][0]).toBe('Config content is empty. Aborting.'); - }); - - it('should not convert content when it is not base64', async () => { - await kubeConfigCommand.handler({ - noInteraction: true, - configContent: 'FOO', - } as any); - expect(vol.toJSON()).toEqual({ - [configPath]: 'FOO', - }); - }); - - it('should not convert content when env var is not base64', async () => { - process.env['KUBE_CONFIG'] = 'FOO'; - await kubeConfigCommand.handler({ noInteraction: true } as any); - expect(vol.toJSON()).toEqual({ - [configPath]: 'FOO', - }); - }); - - it('should write the ~/.kube/config file when it does not exist', async () => { - await kubeConfigCommand.handler({ configContent: 'Zm9vYmFy' } as any); - expect(vol.toJSON()).toEqual({ - [configPath]: 'foobar', - }); - }); - - it('should write the ~/.kube/config file when it does not exist (non b64)', async () => { - await kubeConfigCommand.handler({ configContent: 'foobar' } as any); - expect(vol.toJSON()).toEqual({ - [configPath]: 'foobar', - }); - }); - - it('should do nothing when config exists and in no interaction mode', async () => { - vol.fromJSON({ - [configPath]: 'whatever', - }); - await kubeConfigCommand.handler({ - configContent: 'Zm9vYmFy', - noInteraction: true, - } as any); - expect(vol.toJSON()).toEqual({ - [configPath]: 'whatever', - }); - expect((Logger as any).instance.info.mock.calls[1][0]).toBe('Config already exists, exitting.'); - }); - - it('should ask the user if the config should be overwritten', async () => { - confirm.mockResolvedValue(false); - vol.fromJSON({ - [configPath]: 'whatever', - }); - await kubeConfigCommand.handler({ - configContent: 'Zm9vYmFy', - noInteraction: false, - } as any); - expect(vol.toJSON()).toEqual({ - [configPath]: 'whatever', - }); - }); - - it('should overwrite the config when the user accepts', async () => { - confirm.mockResolvedValue(true); - vol.fromJSON({ - [configPath]: 'whatever', - }); - await kubeConfigCommand.handler({ - configContent: 'Zm9vYmFy', - noInteraction: false, - } as any); - expect(vol.toJSON()).toEqual({ - [configPath]: 'foobar', - }); - }); -}); diff --git a/test/commands/kubectl/kubectl.install.spec.ts b/test/commands/kubectl/kubectl.install.spec.ts deleted file mode 100644 index ebc47fc..0000000 --- a/test/commands/kubectl/kubectl.install.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { vol } from 'memfs'; -import { homedir } from 'os'; -import { posix } from 'path'; -import { kubectlInstallCommand } from '../../../src/commands/kubectl/install'; -import { kubectlUseCommand } from '../../../src/commands/kubectl/use'; -import * as Helpers from '../../../src/commands/kubectl/utils/kubectl'; -import { Logger } from '../../../src/utils/logger'; -import * as Confirm from '../../../src/utils/simple-confirm'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / kubectl / install', () => { - let use: jest.SpyInstance; - let confirm: jest.SpyInstance; - - let remoteVersions: jest.SpyInstance; - let localVersions: jest.SpyInstance; - let download: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - use = jest.spyOn(kubectlUseCommand, 'handler').mockResolvedValue(undefined); - confirm = jest.spyOn(Confirm, 'simpleConfirm').mockResolvedValue(true); - remoteVersions = jest.spyOn(Helpers, 'getRemoteVersions').mockResolvedValue([]); - localVersions = jest.spyOn(Helpers, 'getLocalVersions').mockResolvedValue([]); - download = jest.spyOn(Helpers, 'downloadKubectl').mockResolvedValue(undefined); - }); - - afterEach(() => { - clearGlobalMocks(); - use.mockClear(); - confirm.mockClear(); - remoteVersions.mockClear(); - localVersions.mockClear(); - download.mockClear(); - }); - - afterAll(() => { - use.mockRestore(); - confirm.mockRestore(); - remoteVersions.mockRestore(); - localVersions.mockRestore(); - download.mockRestore(); - }); - - it('should return when used with completion args', async () => { - expect(await kubectlInstallCommand.handler({ getYargsCompletions: true } as any)).toBeUndefined(); - expect((Logger as any).instance).toBeUndefined(); - }); - - it('should create the kubectl install dir when it does not exist', async () => { - await kubectlInstallCommand.handler({} as any); - const installDir = posix.join(homedir(), '.kube', 'kuby', 'kubectl'); - expect(Object.keys(vol.toJSON())).toContain(installDir); - }); - - it('should exit if the given semver is not available', async () => { - remoteVersions.mockResolvedValue(['1.10.0']); - await kubectlInstallCommand.handler({ semver: '2' } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error.mock.calls[0][0]).toBe( - 'The given semver is not available. Use other version or use the refresh command.', - ); - }); - - it('should not download a version when force not set', async () => { - remoteVersions.mockResolvedValue(['1.10.0']); - localVersions.mockResolvedValue(['1.10.0']); - await kubectlInstallCommand.handler({ semver: '1' } as any); - expect(use).toHaveBeenCalled(); - expect((Logger as any).instance.info.mock.calls[0][0]).toBe('v1.10.0 already installed and no force flag set.'); - }); - - it('should ask the user if it should overwrite the version', async () => { - remoteVersions.mockResolvedValue(['1.10.0']); - localVersions.mockResolvedValue([]); - await kubectlInstallCommand.handler({ semver: '1' } as any); - expect(confirm).toHaveBeenCalled(); - }); - - it('should abort when the user decides to keep the version', async () => { - remoteVersions.mockResolvedValue(['1.10.0']); - localVersions.mockResolvedValue([]); - confirm.mockResolvedValue(false); - await kubectlInstallCommand.handler({ semver: '1' } as any); - expect(confirm).toHaveBeenCalled(); - expect((Logger as any).instance.info.mock.calls[0][0]).toBe('Aborting'); - }); - - it('should force a download when force flag is set', async () => { - remoteVersions.mockResolvedValue(['1.10.0']); - localVersions.mockResolvedValue(['1.10.0']); - await kubectlInstallCommand.handler({ - semver: '1', - force: true, - noInteraction: true, - } as any); - expect(download).toHaveBeenCalled(); - }); - - it('should not ask the user if noInteraction is set', async () => { - remoteVersions.mockResolvedValue(['1.10.0']); - localVersions.mockResolvedValue([]); - await kubectlInstallCommand.handler({ - semver: '1', - noInteraction: true, - } as any); - expect(download).toHaveBeenCalled(); - }); - - it('should download a version and call the use command', async () => { - remoteVersions.mockResolvedValue(['1.10.0']); - localVersions.mockResolvedValue([]); - await kubectlInstallCommand.handler({ - semver: '1', - noInteraction: true, - } as any); - expect(download).toHaveBeenCalled(); - expect(use).toHaveBeenCalled(); - }); -}); diff --git a/test/commands/kubectl/kubectl.list.spec.ts b/test/commands/kubectl/kubectl.list.spec.ts deleted file mode 100644 index 0aaa9ef..0000000 --- a/test/commands/kubectl/kubectl.list.spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as chalk from 'chalk'; -import { kubectlListCommand } from '../../../src/commands/kubectl/list'; -import * as Helpers from '../../../src/commands/kubectl/utils/kubectl'; -import * as Version from '../../../src/commands/version'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / kubectl / list', () => { - let versionInfo: jest.SpyInstance; - let localVersions: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - versionInfo = jest.spyOn(Version, 'getVersionInfo').mockResolvedValue({ - kubectlVersion: 'kubectlversion', - }); - localVersions = jest.spyOn(Helpers, 'getLocalVersions').mockResolvedValue([]); - }); - - afterEach(() => { - clearGlobalMocks(); - localVersions.mockClear(); - versionInfo.mockClear(); - }); - - afterAll(() => { - localVersions.mockRestore(); - versionInfo.mockRestore(); - }); - - it('should warn when no local installations are found', async () => { - localVersions.mockResolvedValue([]); - await kubectlListCommand.handler({} as any); - expect((Logger as any).instance.warn.mock.calls[0][0]).toBe('No local installations found.'); - }); - - it('should list local versions', async () => { - localVersions.mockResolvedValue(['1.10.0']); - await kubectlListCommand.handler({} as any); - expect((Logger as any).instance.info.mock.calls[1][0]).toBe('v1.10.0 (~/.kube/kuby/kubectl/v1.10.0)'); - }); - - it('should highlight the selected version', async () => { - localVersions.mockResolvedValue(['1.10.0']); - versionInfo.mockResolvedValue({ - kubectlVersion: '1.10.0', - }); - await kubectlListCommand.handler({} as any); - expect((Logger as any).instance.info.mock.calls[1][0]).toBe( - `v1.10.0 (~/.kube/kuby/kubectl/v1.10.0)${chalk.green(' selected')}`, - ); - }); -}); diff --git a/test/commands/kubectl/kubectl.refresh.spec.ts b/test/commands/kubectl/kubectl.refresh.spec.ts deleted file mode 100644 index 5e751ec..0000000 --- a/test/commands/kubectl/kubectl.refresh.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { vol } from 'memfs'; -import { EOL } from 'os'; -import { kubectlRefreshCommand } from '../../../src/commands/kubectl/refresh'; -import * as Helpers from '../../../src/commands/kubectl/utils/kubectl'; -import { Filepathes } from '../../../src/utils/filepathes'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / kubectl / refresh', () => { - let download: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - download = jest.spyOn(Helpers, 'downloadRemoteVersions').mockResolvedValue([]); - }); - - afterEach(() => { - clearGlobalMocks(); - download.mockClear(); - }); - - afterAll(() => { - download.mockRestore(); - }); - - it('should create the versions file', async () => { - await kubectlRefreshCommand.handler({} as any); - expect(Object.keys(vol.toJSON())).toContain(Filepathes.kubectlVersionsPath); - }); - - it('should write kubectl versions', async () => { - download.mockResolvedValue(['1.10.0', '1.12.0']); - await kubectlRefreshCommand.handler({} as any); - expect(vol.toJSON()).toEqual({ - [Filepathes.kubectlVersionsPath]: `${JSON.stringify(['1.10.0', '1.12.0'])}${EOL}`, - }); - }); -}); diff --git a/test/commands/kubectl/kubectl.remove.spec.ts b/test/commands/kubectl/kubectl.remove.spec.ts deleted file mode 100644 index 3568945..0000000 --- a/test/commands/kubectl/kubectl.remove.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { prompt } from 'inquirer'; -import { vol } from 'memfs'; -import { posix } from 'path'; -import { kubectlRemoveCommand } from '../../../src/commands/kubectl/remove'; -import * as Version from '../../../src/commands/version'; -import { Filepathes } from '../../../src/utils/filepathes'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / kubectl / remove', () => { - let versionInfo: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - versionInfo = jest.spyOn(Version, 'getVersionInfo').mockResolvedValue({ - kubectlVersion: 'kubectlVersion', - }); - }); - - beforeEach(() => { - vol.fromJSON({ - [posix.join(Filepathes.kubectlInstallPath, 'v1.12.1', 'kubectl')]: 'kubectl', - [posix.join(Filepathes.kubectlInstallPath, 'v1.12.2', 'kubectl')]: 'kubectl', - [posix.join(Filepathes.kubectlInstallPath, 'v1.10.0', 'kubectl')]: 'kubectl', - [posix.join(Filepathes.kubectlInstallPath, 'v1.8.4', 'kubectl')]: 'kubectl', - }); - vol.mkdirpSync('/usr/local/bin/'); - vol.symlinkSync(posix.join(Filepathes.kubectlInstallPath, 'v1.10.0', 'kubectl'), '/usr/local/bin/kubectl'); - }); - - afterEach(() => { - clearGlobalMocks(); - versionInfo.mockClear(); - }); - - afterAll(() => { - versionInfo.mockRestore(); - }); - - it('should ask the user if no semver version is provided', async () => { - ((prompt as any) as jest.Mock).mockResolvedValue({ version: '1.8.4' }); - await kubectlRemoveCommand.handler({} as any); - expect(prompt).toHaveBeenCalled(); - }); - - it('should warn when the version is not locally installed', async () => { - await kubectlRemoveCommand.handler({ semver: '2' } as any); - expect((Logger as any).instance.warn).toHaveBeenLastCalledWith('The given semver is not locally installed.'); - }); - - it('should remove the version folder', async () => { - await kubectlRemoveCommand.handler({ semver: '1.8' } as any); - expect(Object.keys(vol.toJSON())).not.toContain(posix.join(Filepathes.kubectlInstallPath, 'v1.8.4', 'kubectl')); - }); - - it('should remove the symlink to the kubectl executable', async () => { - expect(vol.existsSync('/usr/local/bin/kubectl')).toBe(true); - await kubectlRemoveCommand.handler({ semver: '1.8' } as any); - expect(vol.existsSync('/usr/local/bin/kubectl')).toBe(false); - }); -}); diff --git a/test/commands/kubectl/kubectl.use.spec.ts b/test/commands/kubectl/kubectl.use.spec.ts deleted file mode 100644 index 7acaeb3..0000000 --- a/test/commands/kubectl/kubectl.use.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { readFile } from 'fs-extra'; -import { prompt } from 'inquirer'; -import { vol } from 'memfs'; -import { posix } from 'path'; -import { kubectlUseCommand } from '../../../src/commands/kubectl/use'; -import * as Version from '../../../src/commands/version'; -import { Filepathes } from '../../../src/utils/filepathes'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / kubectl / use', () => { - let versionInfo: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - versionInfo = jest.spyOn(Version, 'getVersionInfo').mockResolvedValue({ - kubectlVersion: 'kubectlVersion', - }); - }); - - beforeEach(() => { - vol.fromJSON({ - [posix.join(Filepathes.kubectlInstallPath, 'v1.12.1', 'kubectl')]: 'v1.12.1', - [posix.join(Filepathes.kubectlInstallPath, 'v1.12.2', 'kubectl')]: 'v1.12.2', - [posix.join(Filepathes.kubectlInstallPath, 'v1.10.0', 'kubectl')]: 'v1.10.0', - [posix.join(Filepathes.kubectlInstallPath, 'v1.8.4', 'kubectl')]: 'v1.8.4', - }); - vol.mkdirpSync('/usr/local/bin/'); - vol.symlinkSync(posix.join(Filepathes.kubectlInstallPath, 'v1.10.0', 'kubectl'), '/usr/local/bin/kubectl'); - }); - - afterEach(() => { - clearGlobalMocks(); - versionInfo.mockClear(); - }); - - afterAll(() => { - versionInfo.mockRestore(); - }); - - it('should ask the user if no semver version is provided', async () => { - ((prompt as any) as jest.Mock).mockResolvedValue({ version: '1.8.4' }); - await kubectlUseCommand.handler({} as any); - expect(prompt).toHaveBeenCalled(); - }); - - it('should exit when the version is not locally installed', async () => { - await kubectlUseCommand.handler({ semver: '2' } as any); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith( - 'The given semver is not locally available. Use the install command.', - ); - }); - - it('should create/redirect a new symlink', async () => { - expect(await readFile('/usr/local/bin/kubectl', 'utf8')).toBe('v1.10.0'); - await kubectlUseCommand.handler({ semver: '1.8' } as any); - expect(await readFile('/usr/local/bin/kubectl', 'utf8')).toBe('v1.8.4'); - }); -}); diff --git a/test/commands/kubectl/kubectl.utils.kubectl.spec.ts b/test/commands/kubectl/kubectl.utils.kubectl.spec.ts deleted file mode 100644 index 0614508..0000000 --- a/test/commands/kubectl/kubectl.utils.kubectl.spec.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { ensureFile } from 'fs-extra'; -import * as Got from 'got'; -import { vol } from 'memfs'; -import { EOL } from 'os'; -import { posix } from 'path'; -import * as Helpers from '../../../src/commands/kubectl/utils/kubectl'; -import { Filepathes } from '../../../src/utils/filepathes'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / kubectl / utils / kubectl', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - afterEach(() => { - clearGlobalMocks(); - }); - - describe('getLocalVersions()', () => { - it('should create the installation dir if it does not exist', async () => { - await Helpers.getLocalVersions(); - expect(Object.keys(vol.toJSON())).toContain(Filepathes.kubectlInstallPath); - }); - - it('should return the possible versions', async () => { - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.10.0')); - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.12.0')); - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.13.0')); - const result = await Helpers.getLocalVersions(); - expect(result).toEqual(['1.13.0', '1.12.0', '1.10.0']); - }); - - it('should filter files (only return directories)', async () => { - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.10.0')); - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.12.0')); - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.13.0')); - await ensureFile(posix.join(Filepathes.kubectlInstallPath, 'foobar')); - const result = await Helpers.getLocalVersions(); - expect(result).toEqual(['1.13.0', '1.12.0', '1.10.0']); - }); - - it('should filter invalid versions', async () => { - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.10.0')); - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.12.0')); - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'v1.13.0')); - vol.mkdirpSync(posix.join(Filepathes.kubectlInstallPath, 'miepmiep')); - const result = await Helpers.getLocalVersions(); - expect(result).toEqual(['1.13.0', '1.12.0', '1.10.0']); - }); - }); - - describe('downloadRemoteVersions()', () => { - let get: jest.SpyInstance; - - beforeAll(() => { - get = jest.spyOn(Got, 'get').mockResolvedValue({ - body: JSON.stringify([ - { - tag_name: 'v1.1.1', - }, - { - tag_name: 'v2.2.2', - }, - { - tag_name: 'v3.3.3', - }, - ]), - headers: { - link: '', - }, - }); - }); - - afterEach(() => { - get.mockClear(); - }); - - afterAll(() => { - get.mockRestore(); - }); - - it('should download all returned versions', async () => { - const versions = await Helpers.downloadRemoteVersions(); - expect(versions).toEqual(['1.1.1', '2.2.2', '3.3.3']); - }); - - it('should use the correct (parsed) urls', async () => { - get - .mockResolvedValueOnce({ - body: JSON.stringify([ - { - tag_name: 'v1.1.1', - }, - ]), - headers: { - link: - '; rel="next", ' + - '; rel="last"', - }, - }) - .mockResolvedValueOnce({ - body: JSON.stringify([ - { - tag_name: 'v2.2.2', - }, - ]), - headers: { - link: - '; rel="prev", ' + - '; rel="next", ' + - '; rel="last", ' + - '; rel="first"', - }, - }) - .mockResolvedValueOnce({ - body: JSON.stringify([ - { - tag_name: 'v3.3.3', - }, - ]), - headers: { - link: - '; rel="prev", ' + - '; rel="first"', - }, - }); - const versions = await Helpers.downloadRemoteVersions(); - expect(versions).toEqual(['1.1.1', '2.2.2', '3.3.3']); - expect(get).toHaveBeenCalledTimes(3); - - expect(get).nthCalledWith(1, 'https://api.github.com/repos/kubernetes/kubernetes/releases?per_page=100'); - expect(get).nthCalledWith(2, 'https://api.github.com/repositories/20580498/releases?per_page=100&page=2'); - expect(get).nthCalledWith(3, 'https://api.github.com/repositories/20580498/releases?per_page=100&page=3'); - }); - - it('should filter invalid versions', async () => { - get.mockResolvedValue({ - body: JSON.stringify([ - { - tag_name: 'v1.1.1', - }, - { - tag_name: 'vfoobar', - }, - ]), - headers: { - link: '', - }, - }); - const versions = await Helpers.downloadRemoteVersions(); - expect(versions).toEqual(['1.1.1']); - }); - }); - - describe('getRemoteVersions()', () => { - let get: jest.SpyInstance; - - beforeAll(() => { - get = jest.spyOn(Got, 'get').mockResolvedValue({ - body: JSON.stringify([ - { - tag_name: 'v1.1.1', - }, - { - tag_name: 'v2.2.2', - }, - { - tag_name: 'v3.3.3', - }, - ]), - headers: { - link: '', - }, - }); - }); - - afterEach(() => { - get.mockClear(); - }); - - afterAll(() => { - get.mockRestore(); - }); - - it('should return the versions file if it exists', async () => { - vol.fromJSON({ - [Filepathes.kubectlVersionsPath]: `["1.13.0-rc.1","1.10.11","1.11.5"]${EOL}`, - }); - const result = await Helpers.getRemoteVersions(); - expect(result).toEqual(['1.13.0-rc.1', '1.10.11', '1.11.5']); - }); - - it('should download the remove versions and write them to the disk', async () => { - const result = await Helpers.getRemoteVersions(); - expect(get).toHaveBeenCalled(); - expect(result).toEqual(['1.1.1', '2.2.2', '3.3.3']); - expect((vol.toJSON() as any)[Filepathes.kubectlVersionsPath]).toEqual(`["1.1.1","2.2.2","3.3.3"]${EOL}`); - }); - }); -}); diff --git a/test/commands/namespace/namespace.create.spec.ts b/test/commands/namespace/namespace.create.spec.ts deleted file mode 100644 index 845efca..0000000 --- a/test/commands/namespace/namespace.create.spec.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { prompt } from 'inquirer'; -import { vol } from 'memfs'; -import * as Kubectx from '../../../src/commands/context/utils/kubectx'; -import { namespaceCreateCommand } from '../../../src/commands/namespace/create'; -import { namespaceKubeConfigCommand } from '../../../src/commands/namespace/kube-config'; -import * as Kubens from '../../../src/commands/namespace/utils/kubens'; -import { exec } from '../../../src/utils/exec'; -import { Filepathes } from '../../../src/utils/filepathes'; -import { Logger } from '../../../src/utils/logger'; -import * as Confirm from '../../../src/utils/simple-confirm'; -import { spawn } from '../../../src/utils/spawn'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / namespace / create', () => { - let currentContext: jest.SpyInstance; - let namespaces: jest.SpyInstance; - let confirm: jest.SpyInstance; - let kubeConfigCommand: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - currentContext = jest.spyOn(Kubectx, 'getCurrentContext').mockResolvedValue('context'); - namespaces = jest.spyOn(Kubens, 'getNamespaces').mockResolvedValue(['ns1', 'ns2']); - confirm = jest.spyOn(Confirm, 'simpleConfirm').mockResolvedValue(true); - kubeConfigCommand = jest.spyOn(namespaceKubeConfigCommand, 'handler').mockResolvedValue(undefined); - }); - - afterEach(() => { - clearGlobalMocks(); - currentContext.mockClear(); - namespaces.mockClear(); - confirm.mockClear(); - kubeConfigCommand.mockClear(); - }); - - afterAll(() => { - currentContext.mockRestore(); - namespaces.mockRestore(); - confirm.mockRestore(); - kubeConfigCommand.mockRestore(); - }); - - it('should fail if the given name already exists', async () => { - await namespaceCreateCommand.handler({ name: 'ns1' } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith('The namespace "ns1" already exists.'); - }); - - it('should load the default role file if one exists', async () => { - vol.fromJSON({ - [Filepathes.namespaceDefaultRolePath]: 'foobar', - }); - await namespaceCreateCommand.handler({ name: 'ns3' } as any); - expect(((prompt as any) as jest.Mock).mock.calls[0][0].map((q: any) => q.default)[2]).toBe('foobar'); - }); - - it('should use the default role if no file exists', async () => { - await namespaceCreateCommand.handler({ name: 'ns3' } as any); - expect(((prompt as any) as jest.Mock).mock.calls[0][0].map((q: any) => q.default)[2]).toMatch(/kind: Role/g); - }); - - it('should ask the user for certain information', async () => { - await namespaceCreateCommand.handler({ name: 'ns3' } as any); - expect(prompt).toHaveBeenCalled(); - }); - - it('should use biased information when using no-interaction mode', async () => { - await namespaceCreateCommand.handler({ name: 'ns3', noInteraction: true } as any); - expect(prompt).not.toHaveBeenCalled(); - }); - - it('should write the default role file when user selects to save the role', async () => { - ((prompt as any) as jest.Mock).mockImplementationOnce(async () => ({ - createServiceAccount: true, - serviceAccountName: 'name', - saveRole: true, - role: 'myNewRole', - })); - await namespaceCreateCommand.handler({ name: 'ns3' } as any); - expect(vol.readFileSync(Filepathes.namespaceDefaultRolePath, 'utf8')).toBe('myNewRole'); - }); - - it('should abort if the user does not want to create the namespace', async () => { - confirm.mockResolvedValueOnce(false); - await namespaceCreateCommand.handler({ name: 'ns3' } as any); - expect((Logger as any).instance.info).toHaveBeenLastCalledWith('Aborting'); - }); - - it('should not ask the user to proceed if in no-interaction mode', async () => { - await namespaceCreateCommand.handler({ name: 'ns3', noInteraction: true } as any); - expect(confirm).not.toHaveBeenCalled(); - }); - - it('should create the namespace', async () => { - await namespaceCreateCommand.handler({ name: 'ns3', noInteraction: true } as any); - expect(spawn).toHaveBeenCalledWith('kubectl', ['create', 'ns', 'ns3']); - }); - - it('should fail if "create ns" failes', async () => { - (spawn as jest.Mock).mockResolvedValueOnce(1); - await namespaceCreateCommand.handler({ name: 'ns3', noInteraction: true } as any); - expect(process.exit).toHaveBeenCalledWith(1); - }); - - it('should fail if no role name is provided', async () => { - ((prompt as any) as jest.Mock).mockImplementationOnce(async () => ({ - createServiceAccount: true, - serviceAccountName: 'name', - saveRole: false, - role: 'myNewRole', - })); - await namespaceCreateCommand.handler({ name: 'ns3' } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenCalledWith('No valid role name provided. aborting.'); - }); - - it('should execute the creation of rolebindings and service accounts', async () => { - await namespaceCreateCommand.handler({ name: 'ns3', noInteraction: true } as any); - expect(exec).toHaveBeenCalled(); - }); - - it('should fail if exec kubectl throws an error', async () => { - (exec as jest.Mock).mockRejectedValueOnce('Error'); - await namespaceCreateCommand.handler({ name: 'ns3', noInteraction: true } as any); - expect(exec).toHaveBeenCalled(); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenCalledWith('Error: Error'); - }); - - it('should call namespace kubeconfig command to output the kubeconfig', async () => { - await namespaceCreateCommand.handler({ name: 'ns3', noInteraction: true } as any); - expect(kubeConfigCommand).toHaveBeenCalled(); - }); - - it.skip('TODO: should call namespace kubeconfig command with --ci mode', async () => {}); -}); diff --git a/test/commands/namespace/namespace.kube-config.spec.ts b/test/commands/namespace/namespace.kube-config.spec.ts deleted file mode 100644 index 26bfe7f..0000000 --- a/test/commands/namespace/namespace.kube-config.spec.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { prompt } from 'inquirer'; -import { EOL } from 'os'; -import * as Kubectx from '../../../src/commands/context/utils/kubectx'; -import { namespaceKubeConfigCommand } from '../../../src/commands/namespace/kube-config'; -import * as Kubens from '../../../src/commands/namespace/utils/kubens'; -import { exec } from '../../../src/utils/exec'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / namespace / kube-config', () => { - let currentNamespace: jest.SpyInstance; - let namespaces: jest.SpyInstance; - let serviceAccountsForNamespace: jest.SpyInstance; - let currentContext: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - currentNamespace = jest.spyOn(Kubens, 'getCurrentNamespace').mockResolvedValue('currentNs'); - namespaces = jest.spyOn(Kubens, 'getNamespaces').mockResolvedValue(['ns1', 'ns2']); - serviceAccountsForNamespace = jest.spyOn(Kubens, 'getServiceAccountsForNamespace').mockResolvedValue(['sa1', 'sa2']); - currentContext = jest.spyOn(Kubectx, 'getCurrentContext').mockResolvedValue('currentCtx'); - }); - - afterEach(() => { - clearGlobalMocks(); - currentNamespace.mockClear(); - namespaces.mockClear(); - serviceAccountsForNamespace.mockClear(); - currentContext.mockClear(); - }); - - afterAll(() => { - currentNamespace.mockRestore(); - namespaces.mockRestore(); - serviceAccountsForNamespace.mockRestore(); - currentContext.mockRestore(); - }); - - it('should return when called with completion args', async () => { - await namespaceKubeConfigCommand.handler({ - getYargsCompletions: true, - } as any); - expect((Logger as any).instance).toBeUndefined(); - }); - - it('should ask the user about the namespace if not given', async () => { - await namespaceKubeConfigCommand.handler({} as any); - expect(prompt).toHaveBeenCalled(); - }); - - it('should fail if the namespace does not exist', async () => { - await namespaceKubeConfigCommand.handler({ namespace: 'foobar' } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith('The namespace "foobar" does not exist.'); - }); - - it('should ask the user about the service account if not given', async () => { - await namespaceKubeConfigCommand.handler({ namespace: 'ns2' } as any); - expect(prompt).toHaveBeenCalled(); - }); - - it('should fail if the service account does not exist', async () => { - await namespaceKubeConfigCommand.handler({ - namespace: 'ns1', - serviceAccount: 'foobar', - } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith( - 'The service account "foobar" does not exist in namespace "ns1".', - ); - }); - - it('should fail if no token secret is found', async () => { - (exec as jest.Mock).mockResolvedValue('sa1;nope'); - await namespaceKubeConfigCommand.handler({ - namespace: 'ns1', - serviceAccount: 'sa1', - } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith( - 'Error while fetching the config: Error: No token secret found', - ); - }); - - it('should output the kube config', async () => { - const result = ` - -apiVersion: v1 -kind: Config -clusters: -- cluster: - server: address - certificate-authority-data: certificate - name: cluster -users: -- name: sa1 - user: - token: foobar -preferences: {} -contexts: -- context: - cluster: cluster - user: sa1 - namespace: ns1 - name: cluster-context -current-context: cluster-context - - -`; - - (exec as jest.Mock) - .mockResolvedValueOnce('sa1-token;service-account-token') - .mockResolvedValueOnce('Zm9vYmFy') - .mockResolvedValueOnce('cluster') - .mockResolvedValueOnce('address||certificate'); - await namespaceKubeConfigCommand.handler({ - namespace: 'ns1', - serviceAccount: 'sa1', - } as any); - expect((Logger as any).instance.output).toHaveBeenLastCalledWith(result); - }); - - it('should output the kube config base64 encoded', async () => { - const result = - `${EOL}${EOL}YXBpVmVyc2lvbjogdjEKa2luZDogQ29uZmlnCmNsdXN0ZXJzOgot` + - 'IGNsdXN0ZXI6CiAgICBzZXJ2ZXI6IGFkZHJlc3MKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kY' + - 'XRhOiBjZXJ0aWZpY2F0ZQogIG5hbWU6IGNsdXN0ZXIKdXNlcnM6Ci0gbmFtZTogc2ExCiAgdXNlcj' + - 'oKICAgIHRva2VuOiBmb29iYXIKcHJlZmVyZW5jZXM6IHt9CmNvbnRleHRzOgotIGNvbnRleHQ6CiA' + - 'gICBjbHVzdGVyOiBjbHVzdGVyCiAgICB1c2VyOiBzYTEKICAgIG5hbWVzcGFjZTogbnMxCiAgbmFt' + - `ZTogY2x1c3Rlci1jb250ZXh0CmN1cnJlbnQtY29udGV4dDogY2x1c3Rlci1jb250ZXh0Cg==${EOL}${EOL}`; - - (exec as jest.Mock) - .mockResolvedValueOnce('sa1-token;service-account-token') - .mockResolvedValueOnce('Zm9vYmFy') - .mockResolvedValueOnce('cluster') - .mockResolvedValueOnce('address||certificate'); - await namespaceKubeConfigCommand.handler({ - namespace: 'ns1', - serviceAccount: 'sa1', - base64: true, - } as any); - expect((Logger as any).instance.output).toHaveBeenLastCalledWith(result); - }); -}); diff --git a/test/commands/namespace/namespace.spec.ts b/test/commands/namespace/namespace.spec.ts deleted file mode 100644 index b010d3b..0000000 --- a/test/commands/namespace/namespace.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { prompt } from 'inquirer'; -import * as Kubectx from '../../../src/commands/context/utils/kubectx'; -import { namespaceCommand } from '../../../src/commands/namespace'; -import * as Kubens from '../../../src/commands/namespace/utils/kubens'; -import { exec } from '../../../src/utils/exec'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / namespace', () => { - let currentContext: jest.SpyInstance; - let currentNamespace: jest.SpyInstance; - let namespaces: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - currentContext = jest.spyOn(Kubectx, 'getCurrentContext').mockResolvedValue('context'); - currentNamespace = jest.spyOn(Kubens, 'getCurrentNamespace').mockResolvedValue('current'); - namespaces = jest.spyOn(Kubens, 'getNamespaces').mockResolvedValue(['ns1', 'ns2']); - }); - - afterEach(() => { - clearGlobalMocks(); - currentContext.mockClear(); - currentNamespace.mockClear(); - namespaces.mockClear(); - }); - - afterAll(() => { - currentContext.mockRestore(); - currentNamespace.mockRestore(); - namespaces.mockRestore(); - }); - - it('should return when called with completion args', async () => { - await namespaceCommand.handler({ - getYargsCompletions: true, - } as any); - expect((Logger as any).instance.debug).not.toHaveBeenCalled(); - }); - - it('should ask the user if no name was given', async () => { - await namespaceCommand.handler({} as any); - expect(prompt).toHaveBeenCalled(); - }); - - it('should do nothing if the selected is the same as current', async () => { - await namespaceCommand.handler({ name: 'current' } as any); - expect((Logger as any).instance.info).toHaveBeenLastCalledWith('No different namespace selected, exiting.'); - }); - - it('should fail if the namespace does not exist', async () => { - await namespaceCommand.handler({ name: 'foo' } as any); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith('The namespace "foo" does not exist.'); - expect(process.exit).toHaveBeenCalledWith(1); - }); - - it('should switch the namespace of the context', async () => { - await namespaceCommand.handler({ name: 'ns2' } as any); - expect(exec).toHaveBeenCalledWith('kubectl config set-context "context" --namespace="ns2"'); - }); -}); diff --git a/test/commands/namespace/namespace.utils.kubens.spec.ts b/test/commands/namespace/namespace.utils.kubens.spec.ts deleted file mode 100644 index 1622082..0000000 --- a/test/commands/namespace/namespace.utils.kubens.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import * as Kubectx from '../../../src/commands/context/utils/kubectx'; -import * as Kubens from '../../../src/commands/namespace/utils/kubens'; -import { exec } from '../../../src/utils/exec'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / namespace / utils / kubens', () => { - let currentContext: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - currentContext = jest.spyOn(Kubectx, 'getCurrentContext').mockResolvedValue('currentCtx'); - }); - - afterEach(() => { - clearGlobalMocks(); - currentContext.mockClear(); - }); - - afterAll(() => { - currentContext.mockRestore(); - }); - - describe('getCurrentNamespace()', () => { - it('should get the current contexts namespace', async () => { - await Kubens.getCurrentNamespace(); - expect(currentContext).toHaveBeenCalled(); - }); - - it('should call exec with the namespace command', async () => { - await Kubens.getCurrentNamespace(); - expect(exec).toHaveBeenCalledWith( - `kubectl config view -o=jsonpath='{.contexts[?(@.name=="currentCtx")].context.namespace}'`, - ); - }); - }); - - describe('getNamespaces()', () => { - it('should get all namespaces', async () => { - (exec as jest.Mock).mockResolvedValueOnce('\nbar\nfoo'); - const result = await Kubens.getNamespaces(); - expect(result).toEqual(['bar', 'foo']); - }); - - it('should filter empty values', async () => { - (exec as jest.Mock).mockResolvedValueOnce('foo\n\nbar\n\n'); - const result = await Kubens.getNamespaces(); - expect(result).toEqual(['bar', 'foo']); - }); - - it('should sort the list', async () => { - (exec as jest.Mock).mockResolvedValueOnce('foo\nbar'); - const result = await Kubens.getNamespaces(); - expect(result).toEqual(['bar', 'foo']); - }); - }); - - describe('getServiceAccountsForNamespace()', () => { - it('should get the service accounts of a namespace', async () => { - (exec as jest.Mock).mockResolvedValueOnce('svc1\nsvc2'); - const result = await Kubens.getServiceAccountsForNamespace(''); - expect(result).toEqual(['svc1', 'svc2']); - }); - - it('should filter empty values', async () => { - (exec as jest.Mock).mockResolvedValueOnce('svc1\n\nsvc2\n\n'); - const result = await Kubens.getServiceAccountsForNamespace(''); - expect(result).toEqual(['svc1', 'svc2']); - }); - - it('should sort the list', async () => { - (exec as jest.Mock).mockResolvedValueOnce('svc2\nsvc1'); - const result = await Kubens.getServiceAccountsForNamespace(''); - expect(result).toEqual(['svc1', 'svc2']); - }); - }); -}); diff --git a/test/commands/prepare/prepare.spec.ts b/test/commands/prepare/prepare.spec.ts deleted file mode 100644 index 3c3e9b4..0000000 --- a/test/commands/prepare/prepare.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { vol } from 'memfs'; -import { posix } from 'path'; - -import { prepareCommand } from '../../../src/commands/prepare'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / prepare', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - afterEach(() => { - clearGlobalMocks(); - }); - - it('should return when called with completion args', async () => { - await prepareCommand.handler({ - getYargsCompletions: true, - } as any); - expect((Logger as any).instance).toBeUndefined(); - }); - - it('should fail when the source folder not exists', async () => { - await prepareCommand.handler({ - sourceFolder: '/source', - destinationFolder: '/destination', - } as any); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith('Source directory does not exist. Aborting.'); - expect(process.exit).toHaveBeenCalledWith(1); - }); - - it('should warn if the destination folder already exists', async () => { - vol.fromJSON( - { - './source/foo': '', - './destination/foo': '', - }, - process.cwd(), - ); - await prepareCommand.handler({ - sourceFolder: './source', - destinationFolder: './destination', - } as any); - expect((Logger as any).instance.warn).toHaveBeenLastCalledWith( - 'Destination directory already exists, cleaning directory.', - ); - }); - - it('should write the files that are found (with nesting replaced by "-")', async () => { - vol.fromJSON( - { - './source/foo.yml': '', - './source/bar.yaml': '', - './source/blub/whatever.yml': '', - './source/blub/iaml.yaml': '', - }, - process.cwd(), - ); - await prepareCommand.handler({ - sourceFolder: './source', - destinationFolder: './destination', - } as any); - expect(Object.keys(vol.toJSON())).toContain(posix.join(process.cwd(), 'destination', 'bar.yaml')); - expect(Object.keys(vol.toJSON())).toContain(posix.join(process.cwd(), 'destination', 'foo.yml')); - expect(Object.keys(vol.toJSON())).toContain(posix.join(process.cwd(), 'destination', 'blub-whatever.yml')); - expect(Object.keys(vol.toJSON())).toContain(posix.join(process.cwd(), 'destination', 'blub-iaml.yaml')); - }); -}); diff --git a/test/commands/preview-deploy/__snapshots__/preview-deploy.spec.ts.snap b/test/commands/preview-deploy/__snapshots__/preview-deploy.spec.ts.snap deleted file mode 100644 index b80a3f2..0000000 --- a/test/commands/preview-deploy/__snapshots__/preview-deploy.spec.ts.snap +++ /dev/null @@ -1,11 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`commands / preview-deploy should create a namespace with the given name 1`] = ` -Object { - "apiVersion": "v1", - "kind": "Namespace", - "metadata": Object { - "name": "prev-foobar", - }, -} -`; diff --git a/test/commands/preview-deploy/preview-deploy.spec.ts b/test/commands/preview-deploy/preview-deploy.spec.ts deleted file mode 100644 index af1ac80..0000000 --- a/test/commands/preview-deploy/preview-deploy.spec.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { vol } from 'memfs'; - -import { previewDeployCommand } from '../../../src/commands/preview-deploy'; -import { exec } from '../../../src/utils/exec'; -import { KubernetesApi } from '../../../src/utils/kubernetes-api'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -function defaultFiles(): void { - vol.fromJSON({ - '/foo.yml': 'foo:\n bar: yaml', - '/bar.yml': 'bar:\n foo: yaml', - }); -} - -describe('commands / preview-deploy', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - beforeEach(() => { - (KubernetesApi as any).create(); - }); - - afterEach(() => { - clearGlobalMocks(); - }); - - it('should exit when the name is too long', async () => { - await previewDeployCommand.handler({ - name: '1234567890123456789012345678901234567890123456789012345678901234567890', - } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error.mock.calls[0][0]).toContain('Name of the namespace'); - }); - - it('should use the default kube config when no flag is set', async () => { - defaultFiles(); - const spy = jest.spyOn(KubernetesApi, 'fromDefault'); - await previewDeployCommand.handler({ - name: 'foobar', - prefix: 'prev-', - sourceFolder: '/', - } as any); - - try { - expect(spy).toHaveBeenCalled(); - } finally { - spy.mockRestore(); - } - }); - - it('should use the given kube config content when the flag is set', async () => { - defaultFiles(); - const spy = jest.spyOn(KubernetesApi, 'fromString'); - await previewDeployCommand.handler({ - name: 'foobar', - prefix: 'prev-', - sourceFolder: '/', - kubeConfig: 'yeeeehaaaw', - } as any); - - try { - expect(spy).toHaveBeenCalled(); - } finally { - spy.mockRestore(); - } - }); - - it('should create a namespace with the given name', async () => { - defaultFiles(); - (KubernetesApi as any).instance.core.readNamespace.mockRejectedValueOnce({ - response: { - statusCode: 404, - }, - }); - - await previewDeployCommand.handler({ - name: 'foobar', - prefix: 'prev-', - sourceFolder: '/', - } as any); - - expect((KubernetesApi as any).instance.core.createNamespace.mock.calls[0][0]).toMatchSnapshot(); - }); - - it('should not create the namespace when it already exists', async () => { - defaultFiles(); - await previewDeployCommand.handler({ - name: 'foobar', - prefix: 'prev-', - sourceFolder: '/', - } as any); - - expect((KubernetesApi as any).instance.core.createNamespace).not.toHaveBeenCalled(); - }); - - it('should execute kubectl with the found yamls', async () => { - defaultFiles(); - - await previewDeployCommand.handler({ - name: 'foobar', - prefix: 'prev-', - sourceFolder: '/', - } as any); - - expect(exec).toHaveBeenCalled(); - }); -}); diff --git a/test/commands/secret/__snapshots__/create.spec.ts.snap b/test/commands/secret/__snapshots__/create.spec.ts.snap deleted file mode 100644 index 19681dd..0000000 --- a/test/commands/secret/__snapshots__/create.spec.ts.snap +++ /dev/null @@ -1,18 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`commands / secret / create should create a namespaced secret 1`] = ` -Array [ - "default", - Object { - "apiVersion": "v1", - "data": Object { - "foo": "YmFy", - }, - "kind": "Secret", - "metadata": Object { - "name": "name", - }, - "type": "Opaque", - }, -] -`; diff --git a/test/commands/secret/basic-auth.spec.ts b/test/commands/secret/basic-auth.spec.ts deleted file mode 100644 index 254b57b..0000000 --- a/test/commands/secret/basic-auth.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { prompt } from 'inquirer'; -import { secretBasicAuthCommand as cmd } from '../../../src/commands/secret/basic-auth'; -import { secretCreateCommand } from '../../../src/commands/secret/create'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / secret / basic-auth', () => { - let create: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - create = jest.spyOn(secretCreateCommand, 'handler').mockResolvedValue(undefined); - }); - - afterEach(() => { - clearGlobalMocks(); - create.mockClear(); - }); - - afterAll(() => { - create.mockRestore(); - }); - - it('should ask for username when not given', async () => { - ((prompt as any) as jest.Mock).mockResolvedValueOnce({ - username: 'user', - password: 'pass', - }); - await cmd.handler({ name: 'secret' } as any); - expect((prompt as any) as jest.Mock).toHaveBeenCalled(); - }); - - it('should ask for password when not given', async () => { - ((prompt as any) as jest.Mock).mockResolvedValueOnce({ - password: 'pass', - }); - await cmd.handler({ name: 'secret', username: 'user' } as any); - expect((prompt as any) as jest.Mock).toHaveBeenCalled(); - }); - - it('should call secret create handler with specific data', async () => { - await cmd.handler({ name: 'secret', username: 'user', password: 'pass' } as any); - expect(create.mock.calls[0][0]).toHaveProperty('name', 'secret'); - expect(create.mock.calls[0][0]['data'][0]).toHaveProperty('name', 'auth'); - expect(create.mock.calls[0][0]['data'][0]['value']).toMatch(/user[:].*$/); - }); -}); diff --git a/test/commands/secret/create.spec.ts b/test/commands/secret/create.spec.ts deleted file mode 100644 index ea230e3..0000000 --- a/test/commands/secret/create.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { secretCreateCommand as cmd } from '../../../src/commands/secret/create'; -import { KubernetesApi } from '../../../src/utils/kubernetes-api'; -import { Logger } from '../../../src/utils/logger'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / secret / create', () => { - beforeAll(() => { - process.exit = jest.fn() as any; - }); - - beforeEach(() => { - (KubernetesApi as any).create(); - }); - - afterEach(() => { - clearGlobalMocks(); - }); - - it('should fail when no data is given', async () => { - await cmd.handler({ name: 'name', data: [] } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith( - 'No data given. Must be in format key=value or key="value value". Aborting.', - ); - }); - - it('should create a namespaced secret', async () => { - await cmd.handler({ name: 'name', data: [{ name: 'foo', value: 'bar' }] } as any); - expect(((KubernetesApi as any).instance.core.createNamespacedSecret as jest.Mock).mock.calls[0]).toMatchSnapshot(); - expect(process.exit).not.toHaveBeenCalled(); - }); - - it('should log the error on a failure', async () => { - ((KubernetesApi as any).instance.core.createNamespacedSecret as jest.Mock).mockRejectedValueOnce({ - body: { message: 'error' }, - }); - await cmd.handler({ name: 'name', data: [{ name: 'foo', value: 'bar' }] } as any); - expect(process.exit).toHaveBeenLastCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith('error'); - }); -}); diff --git a/test/commands/secret/secret.docker-registry.create.spec.ts b/test/commands/secret/secret.docker-registry.create.spec.ts deleted file mode 100644 index 0ca5817..0000000 --- a/test/commands/secret/secret.docker-registry.create.spec.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { prompt } from 'inquirer'; -import { vol } from 'memfs'; -import { posix } from 'path'; -import { secretDockerRegistryCreateCommand as cmd } from '../../../src/commands/secret/docker-registry/create'; -import { Crypto } from '../../../src/utils/crypto'; -import { exec } from '../../../src/utils/exec'; -import { Filepathes } from '../../../src/utils/filepathes'; -import { Logger } from '../../../src/utils/logger'; -import * as Confirm from '../../../src/utils/simple-confirm'; -import { spawn } from '../../../src/utils/spawn'; -import { clearGlobalMocks } from '../../helpers'; - -describe('commands / secret / docker-registry / create', () => { - let cLoad: jest.SpyInstance; - let cSave: jest.SpyInstance; - let confirm: jest.SpyInstance; - - beforeAll(() => { - process.exit = jest.fn() as any; - cLoad = jest.spyOn(Crypto, 'load').mockResolvedValue({ - server: 'server', - user: 'user', - email: 'email', - password: 'password', - }); - cSave = jest.spyOn(Crypto, 'save').mockResolvedValue(undefined); - confirm = jest.spyOn(Confirm, 'simpleConfirm').mockResolvedValue(true); - }); - - afterEach(() => { - clearGlobalMocks(); - cLoad.mockClear(); - cSave.mockClear(); - confirm.mockClear(); - }); - - afterAll(() => { - cLoad.mockRestore(); - cSave.mockRestore(); - confirm.mockRestore(); - }); - - it('should fail if the secret already exists', async () => { - (exec as jest.Mock).mockResolvedValue('foobar\nblub'); - await cmd.handler({ name: 'foobar' } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith('The secret "foobar" already exists.'); - }); - - it('should only warn and return when the secret exists in CI mode', async () => { - (exec as jest.Mock).mockResolvedValue('foobar\nblub'); - await cmd.handler({ name: 'foobar', ci: true } as any); - expect(process.exit).not.toHaveBeenCalled(); - expect((Logger as any).instance.warn).toHaveBeenLastCalledWith('CI Mode: existing secret does not fail command.'); - }); - - it('should load a secret from the filesystem when --from is defined', async () => { - vol.fromJSON({ - [posix.join(Filepathes.dockerSecretPath, 'from')]: 'foo', - }); - await cmd.handler({ name: 'mynewsecret', from: 'from', ci: true } as any); - expect(cLoad).toHaveBeenCalledWith(posix.join(Filepathes.dockerSecretPath, 'from')); - }); - - it('should log an error message when secret in --from does not exist', async () => { - await cmd.handler({ name: 'mynewsecret', from: 'from', ci: true } as any); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith( - `The file ${posix.join(Filepathes.dockerSecretPath, 'from')} does not exist. Cannot use template.`, - ); - }); - - it('should ask the user if he wants to use a template', async () => { - ((prompt as any) as jest.Mock).mockResolvedValueOnce({ file: 'foobar' }); - await cmd.handler({ name: 'mynewsecret' } as any); - expect(prompt).toHaveBeenCalled(); - }); - - it('should not ask the user if no-interaction is flagged', async () => { - ((prompt as any) as jest.Mock).mockResolvedValueOnce({ file: 'foobar' }); - await cmd.handler({ name: 'mynewsecret', noInteraction: true } as any); - expect(prompt).not.toHaveBeenCalled(); - }); - - it.skip('should load the given secret if the user selects one', async () => { - vol.fromJSON({ - [posix.join(Filepathes.dockerSecretPath, 'from')]: 'foo', - }); - ((prompt as any) as jest.Mock).mockResolvedValueOnce({ file: 'from' }); - await cmd.handler({ name: 'mynewsecret' } as any); - expect(cLoad).toHaveBeenCalledWith(posix.join(Filepathes.dockerSecretPath, 'from')); - }); - - it('should error when no interaction mode is on and not all arguments are given', async () => { - ((prompt as any) as jest.Mock).mockResolvedValueOnce({ file: 'new' }); - await cmd.handler({ name: 'mynewsecret', noInteraction: true } as any); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith( - 'No interaction mode used but not all information present (server, user, mail, password).', - ); - expect(process.exit).toHaveBeenCalledWith(1); - }); - - it('should ask the user for missing information', async () => { - ((prompt as any) as jest.Mock).mockResolvedValueOnce({ file: 'new' }); - await cmd.handler({ name: 'mynewsecret' } as any); - expect(prompt).toHaveBeenCalledTimes(2); - }); - - it('should create a docker registry secret with the given information', async () => { - await cmd.handler({ name: 'mynewsecret' } as any); - expect(spawn).toHaveBeenCalledWith('kubectl', [ - 'create', - 'secret', - 'docker-registry', - 'mynewsecret', - '--docker-server=undefined', - '--docker-username=undefined', - '--docker-email=undefined', - '--docker-password=undefined', - ]); - }); - - it('should exit if kubectl errors', async () => { - (spawn as jest.Mock).mockResolvedValue(1); - ((prompt as any) as jest.Mock).mockResolvedValueOnce({ file: 'new' }); - await cmd.handler({ name: 'mynewsecret' } as any); - expect(process.exit).toHaveBeenCalledWith(1); - expect((Logger as any).instance.error).toHaveBeenLastCalledWith( - 'An error happend during the kubectl create secret command.', - ); - }); -}); diff --git a/test/helpers.ts b/test/helpers.ts deleted file mode 100644 index 35de6cb..0000000 --- a/test/helpers.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { write } from 'clipboardy'; -import { prompt, registerPrompt } from 'inquirer'; -import { vol } from 'memfs'; - -import { exec } from '../src/utils/exec'; -import { KubernetesApi } from '../src/utils/kubernetes-api'; -import { Logger } from '../src/utils/logger'; -import { spawn } from '../src/utils/spawn'; - -export function clearGlobalMocks(): void { - (process as any).exit.mockClear(); - (spawn as any as jest.Mock).mockClear(); - (exec as jest.Mock).mockClear(); - (write as jest.Mock).mockClear(); - (prompt as any as jest.Mock).mockClear(); - (registerPrompt as jest.Mock).mockClear(); - (Logger as any).instance = undefined; - (KubernetesApi as any).instance = undefined; - vol.reset(); -} diff --git a/test/setup.ts b/test/setup.ts deleted file mode 100644 index d0f4b54..0000000 --- a/test/setup.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { CoreV1Api, V1Namespace, V1Secret } from '@kubernetes/client-node'; -import 'clipboardy'; -import 'inquirer'; -import '../src/utils/exec'; -import '../src/utils/extensions'; -import '../src/utils/kubernetes-api'; -import '../src/utils/logger'; -import '../src/utils/spawn'; - -jest.mock('fs'); -jest.mock('../src/utils/spawn', () => ({ - spawn: jest.fn(() => 0), -})); -jest.mock('../src/utils/exec', () => ({ - exec: jest.fn(), -})); -jest.mock('../src/utils/logger', () => ({ - LogLevel: {}, - Logger: class FakeLogger { - public static instance: FakeLogger; - - public debug: jest.Mock = jest.fn(); - public info: jest.Mock = jest.fn(); - public output: jest.Mock = jest.fn(); - public success: jest.Mock = jest.fn(); - public warn: jest.Mock = jest.fn(); - public error: jest.Mock = jest.fn(); - public startSpinner: jest.Mock = jest.fn(); - public stopSpinner: jest.Mock = jest.fn(); - public setSpinnerText: jest.Mock = jest.fn(); - public spinnerSuccess: jest.Mock = jest.fn(); - public spinnerFail: jest.Mock = jest.fn(); - - constructor() { - FakeLogger.instance = this; - } - }, -})); -jest.mock('clipboardy', () => ({ - write: jest.fn(), -})); -jest.mock('inquirer', () => ({ - registerPrompt: jest.fn(), - Separator: jest.fn(() => ({})), - prompt: jest - .fn() - .mockImplementation(async (questions: any[]) => questions.map(q => (q.default !== undefined ? q.default : q.name))), -})); - -jest.mock('../src/utils/kubernetes-api', () => ({ - KubernetesApi: class FakeKubernetesApi { - public static instance: FakeKubernetesApi; - - public currentNamespace: string = 'default'; - - public core: CoreV1Api = ({ - createNamespacedSecret: jest.fn().mockImplementation(async (_ns: string, secret: V1Secret) => ({ body: secret })), - readNamespace: jest.fn().mockResolvedValue({}), - createNamespace: jest.fn().mockImplementation(async (_ns: string, namespace: V1Namespace) => ({ body: namespace })), - } as unknown) as CoreV1Api; - - private constructor() {} - - public static create(): void { - FakeKubernetesApi.instance = new FakeKubernetesApi(); - } - - public static fromDefault(): FakeKubernetesApi { - return FakeKubernetesApi.instance; - } - - public static fromString(): FakeKubernetesApi { - return FakeKubernetesApi.instance; - } - }, -})); diff --git a/test/utils/env-trim-prefix.spec.ts b/test/utils/env-trim-prefix.spec.ts deleted file mode 100644 index d7e734c..0000000 --- a/test/utils/env-trim-prefix.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { envTrimPrefix } from '../../src/utils/env-trim-prefix'; - -describe('util / envTrimPrefix', () => { - describe('envTrimPrefix()', () => { - beforeAll(() => { - process.env['STA_FOO'] = 'hello foo'; - process.env['BAR'] = 'hello bar'; - }); - - afterAll(() => { - delete process.env.STA_FOO; - delete process.env.FOO; - delete process.env.BAR; - }); - - it('should trim prefix from env vars', () => { - envTrimPrefix('STA_'); - - expect(process.env.STA_FOO).toBe('hello foo'); - expect(process.env.FOO).toBe('hello foo'); - expect(process.env.BAR).toBe('hello bar'); - }); - - it('should trim prefix from env vars and override existing vars', () => { - process.env.FOO = 'hello existing foo'; - - envTrimPrefix('STA_'); - - expect(process.env.STA_FOO).toBe('hello foo'); - expect(process.env.FOO).toBe('hello foo'); - expect(process.env.BAR).toBe('hello bar'); - }); - - it('should should not touch env vars with a nonsense prefix', () => { - envTrimPrefix('STAXX_'); - - expect(process.env.STA_FOO).toBe('hello foo'); - expect(process.env.FOO).toBe('hello foo'); - expect(process.env.BAR).toBe('hello bar'); - }); - - }); -}); diff --git a/test/utils/envsubst.spec.ts b/test/utils/envsubst.spec.ts deleted file mode 100644 index 7a7d730..0000000 --- a/test/utils/envsubst.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { datasubst, envsubst } from '../../src/utils/envsubst'; - -describe('util / envsubst', () => { - describe('envsubst()', () => { - beforeAll(() => { - process.env['FOOBAR'] = 'hello world'; - }); - - afterAll(() => { - delete process.env.FOOBAR; - }); - - it('should replace an environment variable with ${NAME}', () => { - expect(envsubst('This content: ${FOOBAR}')).toBe( - 'This content: hello world', - ); - }); - - it('should replace an environment variable with $NAME', () => { - expect(envsubst('This content: $FOOBAR')).toBe( - 'This content: hello world', - ); - }); - - it('should not replace a variable if not present for ${NAME}', () => { - expect(envsubst('This content: ${FOO}')).toBe('This content: ${FOO}'); - }); - - it('should not replace a variable if not present for $NAME', () => { - expect(envsubst('This content: $FOO')).toBe('This content: $FOO'); - }); - }); - describe('datasubst()', () => { - it('should replace a data element variable with ${NAME}', () => { - expect( - datasubst('This content: ${FOOBAR}', { FOOBAR: 'hello world' }), - ).toBe('This content: hello world'); - }); - - it('should replace a data element variable with $NAME', () => { - expect( - datasubst('This content: $FOOBAR', { FOOBAR: 'hello world' }), - ).toBe('This content: hello world'); - }); - - it('should not replace a data element variable if not present for ${NAME}', () => { - expect(datasubst('This content: ${FOOBAR}', {})).toBe( - 'This content: ${FOOBAR}', - ); - }); - - it('should not replace a data element variable if not present for $NAME', () => { - expect(datasubst('This content: $FOOBAR', {})).toBe( - 'This content: $FOOBAR', - ); - }); - }); -}); diff --git a/test/utils/extensions.spec.ts b/test/utils/extensions.spec.ts deleted file mode 100644 index 9668d48..0000000 --- a/test/utils/extensions.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import '../../src/utils/extensions'; - -describe('util / extensions', () => { - describe('string prototype', () => { - describe('isBase64()', () => { - it('should return true for base64 content', () => { - expect('Zm9vYmFy'.isBase64()).toBe(true); - }); - - it('should return false for non base64 content', () => { - expect('foobar'.isBase64()).toBe(false); - }); - }); - - describe('base64Encode()', () => { - it('should correctly encode a string', () => { - expect('foobar'.base64Encode()).toBe('Zm9vYmFy'); - }); - }); - - describe('base64Decode()', () => { - it('should correctly decode a string', () => { - expect('Zm9vYmFy'.base64Decode()).toBe('foobar'); - }); - }); - }); -}); diff --git a/test/utils/logger.spec.ts b/test/utils/logger.spec.ts deleted file mode 100644 index 30e83f8..0000000 --- a/test/utils/logger.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -jest.unmock('../../src/utils/logger'); - -const { Logger, LogLevel } = require('../../src/utils/logger'); - -describe('util / logger', () => { - const original: { - [key: string]: (message?: any, ...optionalParams: any[]) => void; - } = {}; - const mocks: { [key: string]: jest.Mock } = {}; - let logger: any; - - beforeAll(() => { - original['debug'] = console.debug; - original['info'] = console.info; - original['warn'] = console.warn; - original['error'] = console.error; - - console.debug = mocks['debug'] = jest.fn(); - console.info = mocks['info'] = jest.fn(); - console.warn = mocks['warn'] = jest.fn(); - console.error = mocks['error'] = jest.fn(); - }); - - beforeEach(() => { - logger = new Logger(); - }); - - afterEach(() => { - mocks['debug'].mockClear(); - mocks['info'].mockClear(); - mocks['warn'].mockClear(); - mocks['error'].mockClear(); - }); - - afterAll(() => { - console.debug = original['debug']; - console.info = original['info']; - console.warn = original['warn']; - console.error = original['error']; - - Logger.level = 10; - }); - - const levels = ['debug', 'info', 'warn', 'error']; - for (const level of levels) { - it(`should send a ${level} message`, () => { - Logger.level = LogLevel[level as any] as any; - (logger as any)[level]('test'); - - expect(mocks[level]).toHaveBeenCalled(); - }); - - it(`should not send a ${level} message when level higher`, () => { - Logger.level = LogLevel.output; - (logger as any)[level]('test'); - - expect(mocks[level]).not.toHaveBeenCalled(); - }); - } - - it('should send an output message', () => { - Logger.level = LogLevel.error; - logger.output('test'); - expect(mocks['info']).toHaveBeenCalledWith('test'); - }); -}); diff --git a/test/utils/rc-file.spec.ts b/test/utils/rc-file.spec.ts deleted file mode 100644 index 19f4afe..0000000 --- a/test/utils/rc-file.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { RcFile } from '../../src/utils/rc-file'; - -describe('util / rc-file', () => { - it('should add context arguments if set', () => { - expect( - RcFile.getKubectlCtxArguments({ context: 'foobar' } as any, []), - ).toEqual(['--context', 'foobar']); - }); - - it('should add namespace arguments if set', () => { - expect( - RcFile.getKubectlNsArguments({ namespace: 'foobar' } as any, []), - ).toEqual(['--namespace', 'foobar']); - }); - - it('should add kubectl arguments if set', () => { - expect( - RcFile.getKubectlArguments({ context: 'ctx', namespace: 'ns' } as any, []), - ).toEqual(['--namespace', 'ns', '--context', 'ctx']); - }); -}); diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index d3f76a8..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./config/tsconfig.base.json", - "compilerOptions": { - "watch": true, - "sourceMap": true - } -} diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 817a494..0000000 --- a/tslint.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "@smartive/tslint-config" -}