├── .husky ├── .gitignore └── pre-commit ├── deploy-k8s ├── .gitignore ├── set-namespace.sh ├── extras │ ├── new-image.sh │ └── new-workspace.sh ├── images │ ├── frontend │ │ └── Dockerfile │ ├── base │ │ └── Dockerfile │ └── devops │ │ └── Dockerfile ├── workspaces │ ├── skyler.yaml │ ├── maria.yaml │ ├── jordan.yaml │ └── ben.yaml ├── provision-workspaces.sh ├── README.md ├── init.sh ├── get-deployments.sh └── build-images.sh ├── .gitignore ├── cli ├── .prettierignore ├── .prettierrc ├── README.md ├── src │ ├── index.ts │ ├── lib │ │ └── digitalOcean.ts │ └── deploys │ │ └── deployDigitalOcean.ts ├── tsconfig.json ├── package.json └── yarn.lock ├── heroku.yml ├── img ├── .DS_Store ├── logo │ ├── coder.png │ ├── heroku.png │ ├── linode.png │ ├── vultr.png │ ├── aws-ec2.png │ ├── railway.png │ ├── oracle-logo.png │ ├── digitalocean.png │ └── azure-app-service.png ├── launch-railway.gif ├── heroku-app-create.png ├── railway-connected.png ├── code-server-aws-ec2.png ├── code-server-railway.png ├── rclone-vscode-tasks.png ├── add-script-digitalocean.png ├── modify-github-template.png ├── linode-launch-code-server.gif ├── linode-stackscripts-sidebar.png └── digitalocean-launch-code-server.gif ├── deploy-container ├── myTool │ └── test.sh ├── settings.json ├── rclone-tasks.json ├── entrypoint.sh └── README.md ├── package.json ├── app.json ├── .github └── workflows │ └── to-dockerhub.yml ├── LICENSE.txt ├── deploy-vm ├── launch-code-server.sh ├── README.md └── launch-code-server-linode.sh ├── Dockerfile ├── guides ├── digitalocean.md ├── linode.md ├── aws-ec2.md ├── heroku.md └── railway.md ├── README.md └── yarn.lock /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /deploy-k8s/.gitignore: -------------------------------------------------------------------------------- 1 | code-server/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | bin 3 | -------------------------------------------------------------------------------- /cli/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | bin 3 | yarn.lock 4 | -------------------------------------------------------------------------------- /heroku.yml: -------------------------------------------------------------------------------- 1 | build: 2 | docker: 3 | web: Dockerfile 4 | -------------------------------------------------------------------------------- /cli/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false 4 | } 5 | -------------------------------------------------------------------------------- /img/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/.DS_Store -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /img/logo/coder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/coder.png -------------------------------------------------------------------------------- /img/logo/heroku.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/heroku.png -------------------------------------------------------------------------------- /img/logo/linode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/linode.png -------------------------------------------------------------------------------- /img/logo/vultr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/vultr.png -------------------------------------------------------------------------------- /img/logo/aws-ec2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/aws-ec2.png -------------------------------------------------------------------------------- /img/logo/railway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/railway.png -------------------------------------------------------------------------------- /img/launch-railway.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/launch-railway.gif -------------------------------------------------------------------------------- /img/logo/oracle-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/oracle-logo.png -------------------------------------------------------------------------------- /img/heroku-app-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/heroku-app-create.png -------------------------------------------------------------------------------- /img/logo/digitalocean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/digitalocean.png -------------------------------------------------------------------------------- /img/railway-connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/railway-connected.png -------------------------------------------------------------------------------- /img/code-server-aws-ec2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/code-server-aws-ec2.png -------------------------------------------------------------------------------- /img/code-server-railway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/code-server-railway.png -------------------------------------------------------------------------------- /img/rclone-vscode-tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/rclone-vscode-tasks.png -------------------------------------------------------------------------------- /img/add-script-digitalocean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/add-script-digitalocean.png -------------------------------------------------------------------------------- /img/logo/azure-app-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/logo/azure-app-service.png -------------------------------------------------------------------------------- /img/modify-github-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/modify-github-template.png -------------------------------------------------------------------------------- /img/linode-launch-code-server.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/linode-launch-code-server.gif -------------------------------------------------------------------------------- /deploy-container/myTool/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "This is a demo tool that could be brought into the code-server workspace" -------------------------------------------------------------------------------- /img/linode-stackscripts-sidebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/linode-stackscripts-sidebar.png -------------------------------------------------------------------------------- /img/digitalocean-launch-code-server.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder/deploy-code-server/HEAD/img/digitalocean-launch-code-server.gif -------------------------------------------------------------------------------- /deploy-k8s/set-namespace.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Pretty lame, but helpful command :) 4 | # kubens is cool too. 5 | 6 | # ex: ./set-namespace.sh dev-envs 7 | 8 | kubectl config set-context --current --namespace=$1 -------------------------------------------------------------------------------- /deploy-container/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "workbench.colorTheme": "Default Dark+", 3 | "git.postCommitCommand": "sync", 4 | "git.enableSmartCommit": true, 5 | "git.confirmSync": false, 6 | "git.autofetch": true 7 | } 8 | -------------------------------------------------------------------------------- /deploy-k8s/extras/new-image.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This creates a new image folder and opens it in 4 | # VS Code, if you have it installed 5 | 6 | cp -r images/frontend images/new 7 | 8 | if command -v code &> /dev/null; then 9 | code images/new/Dockerfile 10 | fi -------------------------------------------------------------------------------- /deploy-k8s/extras/new-workspace.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This creates a new workspace file and opens it in 4 | # VS Code, if you have it installed 5 | 6 | cp workspaces/ben.yaml workspaces/new.yaml 7 | 8 | if command -v code &> /dev/null; then 9 | code workspaces/new.yaml 10 | fi -------------------------------------------------------------------------------- /cli/README.md: -------------------------------------------------------------------------------- 1 | # dcs-cli 2 | 3 | Provision a code-server instance from your terminal. 4 | 5 | ## Development 6 | 7 | ```console 8 | git clone git@github.com:cdr/deploy-code-server.git 9 | cd deploy-code-server/cli 10 | npm install && npm run build:watch 11 | 12 | # in another session: 13 | node bin/index.js 14 | ``` 15 | -------------------------------------------------------------------------------- /deploy-k8s/images/frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM bencdr/dev-env-base:latest 2 | 3 | USER root 4 | 5 | # Install Node.js 6 | ARG NODE_VERSION=14 7 | RUN curl -sL "https://deb.nodesource.com/setup_$NODE_VERSION.x" | bash - 8 | RUN DEBIAN_FRONTEND="noninteractive" apt-get install -y nodejs 9 | 10 | # Install yarn 11 | RUN npm install -g yarn 12 | 13 | USER coder 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "cli:format": "prettier --config ./cli/.prettierrc --ignore-path ./cli/.prettierignore --write ./cli", 4 | "prepare": "husky install" 5 | }, 6 | "devDependencies": { 7 | "husky": ">=6", 8 | "lint-staged": ">=10", 9 | "prettier": "^2.3.2" 10 | }, 11 | "lint-staged": { 12 | "./cli/*.{js,css,md}": "yarn cli:format" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /deploy-k8s/images/base/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM codercom/code-server:3.12.0 2 | 3 | # Install Homebrew, must be as a non-root user 4 | RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 5 | ENV PATH /home/linuxbrew/.linuxbrew/bin:${PATH} 6 | 7 | USER root 8 | 9 | RUN apt-get update && \ 10 | apt-get install -y python3 python3-pip 11 | 12 | USER coder 13 | -------------------------------------------------------------------------------- /cli/src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { program } from "commander"; 4 | import { deployDigitalOcean } from "./deploys/deployDigitalOcean"; 5 | import packageJson from "../package.json"; 6 | 7 | const main = async () => { 8 | program.version(packageJson.version).description(packageJson.description); 9 | program.parse(); 10 | await deployDigitalOcean(); 11 | process.exit(0); 12 | }; 13 | 14 | main(); 15 | -------------------------------------------------------------------------------- /cli/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2017", 5 | "lib": ["es2015"], 6 | "moduleResolution": "node", 7 | "sourceMap": true, 8 | "outDir": "bin", 9 | "baseUrl": ".", 10 | "paths": { 11 | "*": ["node_modules/*", "src/types/*"] 12 | }, 13 | "esModuleInterop": true, 14 | "resolveJsonModule": true 15 | }, 16 | "include": ["src/**/*"] 17 | } 18 | -------------------------------------------------------------------------------- /deploy-k8s/workspaces/skyler.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 1 2 | 3 | hostnameOverride: "skyler-dev" 4 | 5 | image: 6 | repository: bencdr/dev-env-frontend 7 | tag: "latest" 8 | pullPolicy: Always 9 | 10 | resources: 11 | limits: 12 | cpu: 4000m 13 | memory: 8000Mi 14 | requests: 15 | cpu: 1000m 16 | memory: 2000Mi 17 | 18 | persistence: 19 | enabled: true 20 | accessMode: ReadWriteOnce 21 | size: 10Gi 22 | annotations: {} 23 | 24 | volumePermissions: 25 | enabled: true 26 | securityContext: 27 | runAsUser: 0 28 | 29 | service: 30 | type: LoadBalancer 31 | port: 8082 32 | -------------------------------------------------------------------------------- /deploy-k8s/provision-workspaces.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This will create/update helm deployments based 4 | # on the charts in your workspaces folder. 5 | 6 | # To create a new deployment: clone a chart, 7 | # modify accordingly, and run this script. 8 | 9 | for file in workspaces/*.yaml; do 10 | basename=$(basename -- "$file") 11 | name=${basename%.*} 12 | helm upgrade --install $name-dev code-server/ci/helm-chart --values $file 13 | 14 | # restart the pods to grab the latest version 15 | # this is not needed if you version-control images 16 | kubectl rollout restart deployment $name-dev-code-server 17 | echo "---" 18 | done -------------------------------------------------------------------------------- /deploy-k8s/README.md: -------------------------------------------------------------------------------- 1 | # deploy-k8s 2 | 3 | Some helper scripts and example images for deploying to Kubernetes. These are still a work in progress and the images do not have CI/CD set up. 4 | 5 | Note: This is a quick way to get up and running with code-server Helm charts. We recommend managing these workspaces with something other than bash scripts 😂 6 | 7 | 1. Ensure you have kubectl, helm, installed and your kube context is pointed at an active cluster. 8 | 1. Clone this repo and run `init.sh` to clone code-server 9 | 1. Build the images with `build-images.sh`. 10 | 1. Edit the examples in `workspaces/` to use your images 11 | 1. Run `provision-workspaces.sh` and then `get-deployments.sh` -------------------------------------------------------------------------------- /deploy-k8s/init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This will create a namespace on your cluster 4 | # and ensure you have the proper commands. 5 | 6 | # It will also clone code server so that you 7 | # can use the helmchart :) 8 | 9 | NAMESPACE=${NAMESPACE:-dev-envs} 10 | 11 | git clone https://github.com/cdr/code-server 12 | kubectl create namespace $NAMESPACE 13 | 14 | ./set-namespace.sh $NAMESPACE 15 | 16 | if ! command -v helm &> /dev/null; then 17 | echo "! Please install the helm: https://helm.sh/docs/intro/install/" 18 | exit 19 | fi 20 | 21 | if ! command -v jq &> /dev/null; then 22 | echo "! Please install the jq command: https://stedolan.github.io/jq/" 23 | exit 24 | fi 25 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "code-server-heroku", 3 | "description": "A code-server environment designed to run in your Heroku", 4 | "repository": "https://github.com/cdr/deploy-code-server", 5 | "logo": "https://avatars.githubusercontent.com/u/1375?s=200&v=4", 6 | "keywords": [ 7 | "node", 8 | "express", 9 | "code-server", 10 | "cloud-development", 11 | "heroku-api" 12 | ], 13 | "env": { 14 | "GIT_REPO": { 15 | "description": "URL of a git repo to clone (optional)", 16 | "required": false 17 | }, 18 | "PASSWORD": { 19 | "description": "Create a password to log in to code-server with", 20 | "required": true 21 | } 22 | }, 23 | "stack": "container" 24 | } 25 | -------------------------------------------------------------------------------- /deploy-k8s/get-deployments.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This will look in your workspaces/ folder and 4 | # look up the helm deployments in a basic manner 5 | 6 | get_deployment() { 7 | name=$1 8 | ip=$(kubectl get svc $name-dev-code-server -o jsonpath='{.status.loadBalancer.ingress[0].ip}') 9 | port=$(kubectl get svc $name-dev-code-server -o jsonpath='{.spec.ports[0].port}') 10 | image=$(helm get values $name-dev -o json | jq .image.repository) 11 | echo "$name (image: $image)" 12 | echo "http://$ip:$port" 13 | echo $(kubectl get secret $name-dev-code-server -o jsonpath="{.data.password}" | base64 --decode) 14 | echo "---" 15 | } 16 | 17 | 18 | for file in workspaces/*.yaml; do 19 | basename=$(basename -- "$file") 20 | name=${basename%.*} 21 | get_deployment $name 22 | done -------------------------------------------------------------------------------- /deploy-container/rclone-tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "push_remote", 6 | "type": "shell", 7 | "command": "sh /home/coder/push_remote.sh", 8 | "presentation": { 9 | "reveal": "always" 10 | }, 11 | "problemMatcher": [], 12 | "options": { 13 | "statusbar": { 14 | "label": "$(repo-push) rclone: push" 15 | } 16 | } 17 | }, 18 | { 19 | "label": "pull_remote", 20 | "type": "shell", 21 | "command": "sh /home/coder/pull_remote.sh", 22 | "presentation": { 23 | "reveal": "always" 24 | }, 25 | "problemMatcher": [], 26 | "options": { 27 | "statusbar": { 28 | "label": "$(repo-pull) rclone: pull" 29 | } 30 | } 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /.github/workflows/to-dockerhub.yml: -------------------------------------------------------------------------------- 1 | name: Publish to Docker Hub 2 | on: 3 | push: 4 | branches: 5 | - main 6 | jobs: 7 | push_to_registry: 8 | name: Push Docker image to Docker Hub 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Check out the repo 12 | uses: actions/checkout@v2 13 | - name: Login to DockerHub 14 | uses: docker/login-action@v1 15 | with: 16 | username: ${{ secrets.DOCKER_USERNAME }} 17 | password: ${{ secrets.DOCKER_PASSWORD }} 18 | - name: Build and push 19 | id: docker_build 20 | uses: docker/build-push-action@v2 21 | with: 22 | push: true 23 | tags: bencdr/code-server-deploy-container:latest 24 | - name: Image digest 25 | run: echo ${{ steps.docker_build.outputs.digest }} 26 | -------------------------------------------------------------------------------- /cli/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@coder/deploy-code-server", 3 | "version": "0.1.0", 4 | "repository": "cdr/deploy-code-server", 5 | "homepage": "https://github.com/cdr/deploy-code-server", 6 | "description": "CLI to deploy code-server", 7 | "main": "bin/index.js", 8 | "bin": "bin/index.js", 9 | "scripts": { 10 | "build": "tsc", 11 | "build:watch": "tsc -w", 12 | "prepare": "yarn build" 13 | }, 14 | "keywords": ["code-server", "coder"], 15 | "author": "coder", 16 | "publishConfig": { 17 | "access": "public" 18 | }, 19 | "license": "ISC", 20 | "devDependencies": { 21 | "@types/inquirer": "^7.3.3", 22 | "@types/node": "^14.14.20", 23 | "typescript": "^4.1.3" 24 | }, 25 | "dependencies": { 26 | "async-wait-until": "^2.0.7", 27 | "chalk": "^4.1.2", 28 | "commander": "^8.1.0", 29 | "got": "^11.8.2", 30 | "inquirer": "^8.1.2", 31 | "ora": "^5.4.1" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /deploy-k8s/build-images.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This will build and push public images in the images/ folder to 4 | # DockerHub based on your Docker username with the 5 | # format: $username/dev-env-$folder:latest 6 | 7 | set -e 8 | 9 | docker_username=$(docker-credential-$(jq -r .credsStore ~/.docker/config.json) list | jq -r '. | to_entries[] | select(.key | contains("docker.io")) | last(.value)') 10 | 11 | build_and_push() { 12 | folder=$1 13 | basename=$(basename -- "$folder") 14 | name=${basename%.*} 15 | docker build $folder -t bencdr/dev-env-$name:latest 16 | docker push $docker_username/dev-env-$name:latest 17 | } 18 | 19 | build_and_push "images/base" 20 | 21 | # Build all other images in the images/ folder 22 | # note: if you have multiple base images or heirchal images 23 | # you'll want to build them in a controlled order above and 24 | # exclude them. can be comma or space seperated :) 25 | exclude="images/base" 26 | 27 | for folder in images/*; do 28 | if [[ ! "$exclude" == *"$folder"* ]]; then 29 | build_and_push $folder 30 | fi 31 | done -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Trung Tran 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /deploy-vm/launch-code-server.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # install code-server service system-wide 4 | export HOME=/root 5 | curl -fsSL https://code-server.dev/install.sh | sh 6 | 7 | # add our helper server to redirect to the proper URL for --link 8 | git clone https://github.com/bpmct/coder-cloud-redirect-server 9 | cd coder-cloud-redirect-server 10 | cp coder-cloud-redirect.service /etc/systemd/system/ 11 | cp coder-cloud-redirect.py /usr/bin/ 12 | 13 | # create a code-server user 14 | adduser --disabled-password --gecos "" coder 15 | echo "coder ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/coder 16 | usermod -aG sudo coder 17 | 18 | # copy ssh keys from root 19 | cp -r /root/.ssh /home/coder/.ssh 20 | chown -R coder:coder /home/coder/.ssh 21 | 22 | # configure code-server to use --link with the "coder" user 23 | mkdir -p /home/coder/.config/code-server 24 | touch /home/coder/.config/code-server/config.yaml 25 | echo "link: true" > /home/coder/.config/code-server/config.yaml 26 | chown -R coder:coder /home/coder/.config 27 | 28 | # start and enable code-server and our helper service 29 | systemctl enable --now code-server@coder 30 | systemctl enable --now coder-cloud-redirect -------------------------------------------------------------------------------- /deploy-k8s/workspaces/maria.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 1 2 | 3 | hostnameOverride: "maria-dev" 4 | 5 | image: 6 | repository: bencdr/dev-env-frontend 7 | tag: "latest" 8 | pullPolicy: Always 9 | 10 | resources: 11 | limits: 12 | cpu: 4000m 13 | memory: 8000Mi 14 | requests: 15 | cpu: 1000m 16 | memory: 2000Mi 17 | 18 | persistence: 19 | enabled: true 20 | accessMode: ReadWriteOnce 21 | size: 10Gi 22 | annotations: {} 23 | 24 | volumePermissions: 25 | enabled: true 26 | securityContext: 27 | runAsUser: 0 28 | 29 | securityContext: 30 | enabled: true 31 | fsGroup: 1000 32 | runAsUser: 1000 33 | 34 | service: 35 | type: LoadBalancer 36 | port: 8081 37 | 38 | ingress: 39 | enabled: false 40 | #annotations: 41 | # kubernetes.io/ingress.class: nginx 42 | # kubernetes.io/tls-acme: "true" 43 | #hosts: 44 | # - host: code-server.example.loc 45 | # paths: 46 | # - / 47 | 48 | #tls: 49 | # - secretName: code-server 50 | # hosts: 51 | # - code-server.example.loc 52 | 53 | extraArgs: [] 54 | 55 | nodeSelector: {} 56 | 57 | tolerations: [] 58 | 59 | affinity: {} 60 | 61 | extraSecretMounts: [] 62 | 63 | extraVolumeMounts: [] 64 | 65 | hostPath: "" 66 | 67 | extraConfigmapMounts: [] 68 | 69 | serviceAccount: 70 | create: false 71 | -------------------------------------------------------------------------------- /deploy-k8s/workspaces/jordan.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 1 2 | 3 | hostnameOverride: "jordan-dev" 4 | 5 | image: 6 | repository: bencdr/dev-env-frontend 7 | tag: "latest" 8 | pullPolicy: Always 9 | 10 | resources: 11 | limits: 12 | cpu: 4000m 13 | memory: 8000Mi 14 | requests: 15 | cpu: 1000m 16 | memory: 2000Mi 17 | 18 | persistence: 19 | enabled: true 20 | accessMode: ReadWriteOnce 21 | size: 10Gi 22 | annotations: {} 23 | 24 | volumePermissions: 25 | enabled: true 26 | securityContext: 27 | runAsUser: 0 28 | 29 | securityContext: 30 | enabled: true 31 | fsGroup: 1000 32 | runAsUser: 1000 33 | 34 | service: 35 | type: LoadBalancer 36 | port: 8083 37 | 38 | ingress: 39 | enabled: false 40 | #annotations: 41 | # kubernetes.io/ingress.class: nginx 42 | # kubernetes.io/tls-acme: "true" 43 | #hosts: 44 | # - host: code-server.example.loc 45 | # paths: 46 | # - / 47 | 48 | #tls: 49 | # - secretName: code-server 50 | # hosts: 51 | # - code-server.example.loc 52 | 53 | extraArgs: [] 54 | 55 | nodeSelector: {} 56 | 57 | tolerations: [] 58 | 59 | affinity: {} 60 | 61 | extraSecretMounts: [] 62 | 63 | extraVolumeMounts: [] 64 | 65 | hostPath: "" 66 | 67 | extraConfigmapMounts: [] 68 | 69 | serviceAccount: 70 | create: false 71 | -------------------------------------------------------------------------------- /cli/src/lib/digitalOcean.ts: -------------------------------------------------------------------------------- 1 | import got from "got"; 2 | 3 | const DIGITALOCEAN_API_URL = "https://api.digitalocean.com/v2"; 4 | 5 | export type DropletV4Network = { 6 | ip_address: string; 7 | type: "private" | "public"; 8 | }; 9 | export type Droplet = { 10 | id: string; 11 | name: string; 12 | networks: { v4: DropletV4Network[] }; 13 | status: "new" | "active"; 14 | }; 15 | 16 | type CreateDropletOptions = { 17 | userData: string; 18 | token: string; 19 | }; 20 | 21 | export const createDroplet = async ({ 22 | token, 23 | userData, 24 | }: CreateDropletOptions) => { 25 | return got 26 | .post(`${DIGITALOCEAN_API_URL}/droplets`, { 27 | json: { 28 | name: "code-server", 29 | region: "nyc3", 30 | size: "s-1vcpu-1gb", 31 | image: "ubuntu-20-10-x64", 32 | user_data: userData, 33 | }, 34 | headers: { 35 | Authorization: `Bearer ${token}`, 36 | }, 37 | }) 38 | .json<{ droplet: Droplet }>() 39 | .then((data) => data.droplet); 40 | }; 41 | 42 | type GetDropletOptions = { 43 | id: string; 44 | token: string; 45 | }; 46 | 47 | export const getDroplet = async ({ token, id }: GetDropletOptions) => { 48 | return got(`${DIGITALOCEAN_API_URL}/droplets/${id}`, { 49 | headers: { 50 | Authorization: `Bearer ${token}`, 51 | }, 52 | }) 53 | .json<{ droplet: Droplet }>() 54 | .then((data) => data.droplet); 55 | }; 56 | -------------------------------------------------------------------------------- /deploy-k8s/images/devops/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM bencdr/dev-env-base:latest 2 | 3 | USER root 4 | 5 | RUN apt-get update 6 | RUN apt-get install -y apt-transport-https gnupg 7 | 8 | # Install kubectl 9 | RUN curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg && \ 10 | echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list && \ 11 | apt-get update && apt-get install -y kubectl 12 | 13 | # Install helm 14 | RUN curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash 15 | 16 | # Install gcloud 17 | RUN curl -fsSLo /usr/share/keyrings/cloud.google.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg && \ 18 | echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \ 19 | apt-get update && apt-get install -y google-cloud-sdk 20 | 21 | # Install AWS CLI 22 | RUN pip3 install awscli 23 | 24 | USER coder 25 | 26 | # Install terraform 27 | RUN brew tap hashicorp/tap && \ 28 | brew install hashicorp/tap/terraform 29 | 30 | # Install kubectx 31 | RUN brew install kubectl 32 | 33 | # Install Docker 34 | RUN sudo apt-get install -y docker.io systemd systemd-sysv 35 | RUN systemctl enable docker 36 | 37 | USER coder -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Start from the code-server Debian base image 2 | FROM codercom/code-server:4.9.0 3 | 4 | USER coder 5 | 6 | # Apply VS Code settings 7 | COPY deploy-container/settings.json .local/share/code-server/User/settings.json 8 | 9 | # Use bash shell 10 | ENV SHELL=/bin/bash 11 | 12 | # Install unzip + rclone (support for remote filesystem) 13 | RUN sudo apt-get update && sudo apt-get install unzip -y 14 | RUN curl https://rclone.org/install.sh | sudo bash 15 | 16 | # Copy rclone tasks to /tmp, to potentially be used 17 | COPY deploy-container/rclone-tasks.json /tmp/rclone-tasks.json 18 | 19 | # Fix permissions for code-server 20 | RUN sudo chown -R coder:coder /home/coder/.local 21 | 22 | # You can add custom software and dependencies for your environment below 23 | # ----------- 24 | 25 | # Install a VS Code extension: 26 | # Note: we use a different marketplace than VS Code. See https://github.com/cdr/code-server/blob/main/docs/FAQ.md#differences-compared-to-vs-code 27 | # RUN code-server --install-extension esbenp.prettier-vscode 28 | 29 | # Install apt packages: 30 | # RUN sudo apt-get install -y ubuntu-make 31 | 32 | # Copy files: 33 | # COPY deploy-container/myTool /home/coder/myTool 34 | 35 | # ----------- 36 | 37 | # Port 38 | ENV PORT=8080 39 | 40 | # Use our custom entrypoint script first 41 | COPY deploy-container/entrypoint.sh /usr/bin/deploy-container-entrypoint.sh 42 | ENTRYPOINT ["/usr/bin/deploy-container-entrypoint.sh"] 43 | -------------------------------------------------------------------------------- /guides/digitalocean.md: -------------------------------------------------------------------------------- 1 | # deploying `code-server` on DigitalOcean 2 | 3 | > ⚠️ The deploy script referenced in this guide uses the code-server --link service which is now deprecated. If this solution does not work for you, we recommend following our guide to use [LetsEncrypt with Caddy](https://coder.com/docs/code-server/latest/guide#using-lets-encrypt-with-caddy) to securely connect to code-server on your VM. 4 | 5 | 6 | [DigitalOcean](https://digitalocean.com) is an developer-friendly platform with cloud servers. Here is the easiest way to launch code-server on DigitalOcean: 7 | 8 | --- 9 | 10 | 1. Log into DigitalOcean and create a new Ubuntu 20.10 droplet with any size, in any region 11 | 1. Under "Select additional options," check `User data`. This will allow you to specify a script that will run on first boot. 12 | 1. Paste in the contents of [launch-code-server.sh](../deploy-vm/launch-code-server.sh) to the textarea. 13 | 1. Create your server. Feel free to add SSH keys or other preferences. 14 | 1. Once your server starts, you can simply navigate to the IP address and get forwarded to a secure version of code-server, which will be proxied behind your GitHub account. For information on how this works, see [code-server --link](https://github.com/cdr/code-server#cloud-program-%EF%B8%8F). 15 | 16 | DigitalOcean launch code-server 17 | 18 | See our [troubleshooting guide](../deploy-vm#troubleshooting) if you are unable to connect after some time. 19 | -------------------------------------------------------------------------------- /deploy-vm/README.md: -------------------------------------------------------------------------------- 1 | # Deploying `code-server` on a VM 2 | 3 | A simple startup script to run code-server with --link on a VM, designed to run on Ubuntu 20.10. 4 | 5 | > ⚠️ The deploy script referenced uses the code-server --link service which is now deprecated. If this solution does not work for you, we recommend following our guide to use [LetsEncrypt with Caddy](https://coder.com/docs/code-server/latest/guide#using-lets-encrypt-with-caddy) to securely connect to code-server on your VM. 6 | 7 | ## In this repo 8 | 9 | - [launch-code-server.sh](./launch-code-server.sh) - Command tested on Ubuntu machines (uses --link) 10 | - [launch-linode.sh](./launch-linode.sh) - launch-code-server.sh adapted for Linode 11 | 12 | ## Troubleshooting 13 | 14 | - Ensure you have port 80 open on your server's firewall 15 | 16 | - SSH or use the built-in console to connect to your machine 17 | 18 | 1. Check the code-server status 19 | 20 | ```console 21 | systemctl status code-server@coder 22 | 23 | # if not working: 24 | systemctl restart code-server@coder 25 | ``` 26 | 27 | 1. Ensure journalctl is capturing logs 28 | 29 | ```console 30 | journalctl -u code-server@coder 31 | ``` 32 | 33 | 1. Ensure the HTTP redirect server is working 34 | 35 | ```console 36 | systemctl status coder-cloud-redirect 37 | 38 | # systemctl restart coder-cloud-redirect 39 | ``` 40 | 41 | ## Other scripts 42 | 43 | - [code-server, CloudFlare, and Caddy](https://github.com/alec-hs/coder-cloudflare-setup): Sets up code-server and configures CloudFlare DNS 44 | -------------------------------------------------------------------------------- /deploy-vm/launch-code-server-linode.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # allow us to access systemd logs to see the status of --link 4 | sed -i.bak 's/#Storage=auto/Storage=persistent/' /etc/systemd/journald.conf 5 | mkdir -p /var/log/journal 6 | systemctl force-reload systemd-journald 7 | systemctl restart systemd-journald 8 | 9 | # install code-server service system-wide 10 | export HOME=/root 11 | curl -fsSL https://code-server.dev/install.sh | sh 12 | 13 | # add our helper server to redirect to the proper URL for --link 14 | git clone https://github.com/bpmct/coder-cloud-redirect-server 15 | cd coder-cloud-redirect-server 16 | cp coder-cloud-redirect.service /etc/systemd/system/ 17 | cp coder-cloud-redirect.py /usr/bin/ 18 | 19 | # create a code-server user 20 | adduser --disabled-password --gecos "" coder 21 | echo "coder ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/coder 22 | usermod -aG sudo coder 23 | 24 | # copy ssh keys from root 25 | cp -r /root/.ssh /home/coder/.ssh 26 | chown -R coder:coder /home/coder/.ssh 27 | 28 | # use a more unique hostname (for Linode) 29 | sudo hostnamectl set-hostname linode-$LINODE_ID 30 | source /root/.bashrc 31 | 32 | # configure code-server to use --link with the "coder" user 33 | mkdir -p /home/coder/.config/code-server 34 | touch /home/coder/.config/code-server/config.yaml 35 | echo "link: true" > /home/coder/.config/code-server/config.yaml 36 | chown -R coder:coder /home/coder/.config 37 | 38 | # start and enable code-server and our helper service 39 | systemctl enable code-server@coder 40 | systemctl enable coder-cloud-redirect 41 | systemctl start code-server@coder && systemctl start coder-cloud-redirect -------------------------------------------------------------------------------- /guides/linode.md: -------------------------------------------------------------------------------- 1 | # deploying `code-server` on Linode 2 | 3 | > ⚠️ The deploy script referenced in this guide uses the code-server --link service which is now deprecated. If this solution does not work for you, we recommend following our guide to use [LetsEncrypt with Caddy](https://coder.com/docs/code-server/latest/guide#using-lets-encrypt-with-caddy) to securely connect to code-server on your VM. 4 | 5 | [Linode](https://linode.com) is a developer-friendly platform with cloud servers. Here is the easiest way to launch code-server on Linode. 6 | 7 | 1. Log in to Linode and go to the "StackScripts" section in the sidebar 8 | 9 | Linode StackScripts 10 | 11 | 1. Navigate to "Community Scripts" and use `bencdr/code-server` or create your own based on [launch-code-server-linode.sh](../deploy-vm/launch-code-server-linode.sh). 12 | 13 | 1. Give your server a label and deploy with Ubuntu 20.10 and any size. Once your server starts, you can simply navigate to the IP address and get forwarded to a secure version of code-server, which will be proxied behind your GitHub account. For information on how this works, see [code-server --link](https://github.com/cdr/code-server#cloud-program-%EF%B8%8F). 14 | 15 | Linode launch code-server 16 | 17 | 1. Optional: To change the URL in the address bar from `linode-[xxxx]` to something more descriptive, you just need to change your hostname and restart code-server: 18 | 19 | ```sh 20 | sudo hostnamectl set-hostname bens-devbox 21 | sudo systemctl restart code-server@coder 22 | ``` 23 | 24 | See our [troubleshooting guide](../deploy-vm#troubleshooting) if you are unable to connect after some time. 25 | -------------------------------------------------------------------------------- /deploy-k8s/workspaces/ben.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 1 2 | 3 | hostnameOverride: "ben-dev" 4 | 5 | image: 6 | repository: bencdr/dev-env-devops 7 | tag: "latest" 8 | pullPolicy: Always 9 | 10 | resources: 11 | limits: 12 | cpu: 2000m 13 | memory: 8000Mi 14 | requests: 15 | cpu: 500m 16 | memory: 1000Mi 17 | 18 | persistence: 19 | enabled: true 20 | accessMode: ReadWriteOnce 21 | size: 10Gi 22 | annotations: {} 23 | 24 | extraContainers: | 25 | - name: docker-dind 26 | image: docker:20.10-dind 27 | imagePullPolicy: IfNotPresent 28 | resources: 29 | requests: 30 | cpu: 250m 31 | memory: 256M 32 | securityContext: 33 | privileged: true 34 | procMount: Default 35 | env: 36 | - name: DOCKER_TLS_CERTDIR 37 | value: "" 38 | - name: DOCKER_DRIVER 39 | value: "overlay2" 40 | 41 | volumePermissions: 42 | enabled: true 43 | securityContext: 44 | runAsUser: 0 45 | 46 | securityContext: 47 | enabled: true 48 | fsGroup: 1000 49 | runAsUser: 1000 50 | 51 | service: 52 | type: LoadBalancer 53 | port: 8080 54 | 55 | ingress: 56 | enabled: false 57 | #annotations: 58 | # kubernetes.io/ingress.class: nginx 59 | # kubernetes.io/tls-acme: "true" 60 | #hosts: 61 | # - host: code-server.example.loc 62 | # paths: 63 | # - / 64 | 65 | #tls: 66 | # - secretName: code-server 67 | # hosts: 68 | # - code-server.example.loc 69 | 70 | extraArgs: [] 71 | extraVars: 72 | - name: DOCKER_HOST 73 | value: tcp://localhost:2375 74 | 75 | nodeSelector: {} 76 | 77 | tolerations: [] 78 | 79 | affinity: {} 80 | 81 | extraSecretMounts: [] 82 | 83 | extraVolumeMounts: [] 84 | 85 | hostPath: "" 86 | 87 | extraConfigmapMounts: [] 88 | 89 | serviceAccount: 90 | create: false 91 | -------------------------------------------------------------------------------- /guides/aws-ec2.md: -------------------------------------------------------------------------------- 1 | # deploying `code-server` on AWS EC2 2 | 3 | > ⚠️ The deploy script referenced in this guide uses the code-server --link service which is now deprecated. If this solution does not work for you, we recommend following our guide to use [LetsEncrypt with Caddy](https://coder.com/docs/code-server/latest/guide#using-lets-encrypt-with-caddy) to securely connect to code-server on your VM. 4 | 5 | ![code-server and AWS EC2](../img/code-server-aws-ec2.png) 6 | 7 | [AWS EC2](https://aws.amazon.com/ec2/) is a popular way to manage and launch virtual machines. Here is a fast way to launch a code-server machine with AWS EC2: 8 | 9 | 1. Log into AWS and head over to the [EC2 dashboard](https://us-west-2.console.aws.amazon.com/ec2/v2/home?region=us-west-2). Launch a new instance. 10 | 11 | 2. Use the "Ubuntu Server 20.04 LTS" 64-bit (x86) Quick Start. 12 | 13 | 3. Choose `t2.micro` instance type or larger. 14 | 15 | 4. Click `Next: Configure Instance Details` to add the code-server script. 16 | 17 | 5. Under `User data`, copy & paste the [launch-code-server.sh](../deploy-vm/launch-code-server.sh) script. 18 | 19 | 6. Expand your storage, if necessary under the "Add Storage" section. 20 | 21 | 7. Under "Security Groups," ensure you have rows for "SSH" (:22) and "HTTP" (:80) 22 | 23 | 8. Add any SSH keys, if necessary, and launch the instance. 24 | 25 | 9. Once your instance starts, you can simply navigate to the public IP address and get forwarded to a secure version of code-server, which will be proxied behind your GitHub account (the first one you log in with). For information on how this works, see [code-server --link](https://github.com/cdr/code-server#cloud-program-%EF%B8%8F). 26 | 27 | 10. Optional: To change the URL in the address bar from `ip-[xxxx]` to something more descriptive, you just need to change your hostname and restart code-server: 28 | 29 | ```sh 30 | sudo hostnamectl set-hostname bens-devbox 31 | sudo systemctl restart code-server@coder 32 | ``` 33 | 34 | See our [troubleshooting guide](../deploy-vm#troubleshooting) if you are unable to connect after some time. 35 | -------------------------------------------------------------------------------- /guides/heroku.md: -------------------------------------------------------------------------------- 1 | # Guide: Launching `code-server` on Heroku 2 | 3 | Heroku is a managed app hosting platform. 4 | 5 | Launch code-server on Heroku to get on-demand dev environments that turn off when you don't need them! 💵 6 | 7 | ![code-server and Heroku](../img/heroku-app-create.png) 8 | 9 | ## Step 1: Click to deploy 10 | 11 | [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://dashboard.heroku.com/new?template=https://github.com/cdr/deploy-code-server) 12 | 13 | --- 14 | 15 | ## Step 2: Configure & deploy your environment 16 | 17 | `App name`: The URL and you can access code-server with 18 | 19 | `PASSWORD`: A password you can use to log in 20 | 21 | `GIT_REPO`: The HTTPS URL of a git repo you'd like to use in code-server. (optional) 22 | 23 | After it has built, you can access it by pressing "View" or "Open app." 24 | 25 | ## Step 3: Create a new GitHub repo with this template 26 | 27 | Modify GitHub template 28 | 29 | Press the button in the top right of the repo, or or click to [use this template](https://github.com/bpmct/deploy-code-server/generate). 30 | 31 | ## Step 4: Set up automatic builds with this repo 32 | 33 | 1. In Heroku, navigate to `Deploy -> Deployment Method" 34 | 1. Link it with the GitHub repo you just created. 35 | 1. Open the repo in GitHub and edit the `Dockerfile` 36 | 1. Add some custom tools (like NodeJS) and commit to the main branch: 37 | 38 | ```Dockerfile 39 | # You can add custom software and dependencies for your environment here. Some examples: 40 | 41 | # RUN code-server --install-extension esbenp.prettier-vscode 42 | # RUN sudo apt-get install -y build-essential 43 | # RUN COPY myTool /home/coder/myTool 44 | 45 | # Install NodeJS 46 | RUN sudo curl -fsSL https://deb.nodesource.com/setup_15.x | sudo bash - 47 | RUN sudo apt-get install -y nodejs 48 | ``` 49 | 50 | 1. Head back to Heroku and notice a new deployment has started. After it has completed, you can use these tools in your environment. 51 | 52 | 1. (Optional): [Configure rclone](https://github.com/cdr/deploy-code-server/tree/main/deploy-container#-persist-your-filesystem-with-rclone) so that you can save your VS Code config and files without commiting 53 | 54 | See the [deploy-container README](../deploy-container) for other config vars for your environment. 55 | 56 | --- 57 | 58 | To update your code-server version, modify the version number on line 2 in your Dockerfile. See the [list of tags](https://hub.docker.com/r/codercom/code-server/tags?page=1&ordering=last_updated) for the latest version. 59 | -------------------------------------------------------------------------------- /guides/railway.md: -------------------------------------------------------------------------------- 1 | # Guide: Launching `code-server` on railway.app 2 | 3 | [Railway](https://railway.app) is a new cloud development platform! ☁️ 4 | 5 | Use Railway + code-server to get a dev environment that you can access from any device. 6 | 7 | ![code-server and railway.app](../img/code-server-railway.png) 8 | 9 | ## Step 1: Click button to deploy 10 | 11 | [![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/new/template?template=https%3A%2F%2Fgithub.com%2Fcoder%2Fdeploy-code-server&envs=PASSWORD%2CGIT_REPO&optionalEnvs=GIT_REPO&PASSWORDDesc=Your+password+to+log+in+to+code-server&GIT_REPODesc=A+git+repo+to+auto-clone+and+open+in+code-server+%28e.g+https%3A%2F%2Fgithub.com%2Fcoder%2Fdocs%29) 12 | 13 | ## Step 2: Configure & launch your environment 14 | 15 | You'll need to make a new repository which will contain your code-server configuration. If you push changes to this repo (to install NodeJS, for example), it will re-deploy code-server. 16 | 17 | Connected git repo 18 | 19 | You also need to specity a `PASSWORD` and a `GIT_REPO` to clone in your environment :) 20 | 21 | ## Step 3: Modify your environment to add additional tools 22 | 23 | 1. In Railway, go to `Deployments -> Triggers` to see your source repo. 24 | 25 | Connected git repo 26 | 27 | 1. Open the source repo in GitHub and edit the `Dockerfile` 28 | 1. Add some custom tools (like NodeJS) and push to the main branch: 29 | 30 | ```Dockerfile 31 | # You can add custom software and dependencies for your environment here. Some examples: 32 | 33 | # RUN code-server --install-extension esbenp.prettier-vscode 34 | # RUN sudo apt-get install -y build-essential 35 | # RUN COPY myTool /home/coder/myTool 36 | 37 | # Install NodeJS 38 | RUN sudo curl -fsSL https://deb.nodesource.com/setup_15.x | sudo bash - 39 | RUN sudo apt-get install -y nodejs 40 | ``` 41 | 42 | 1. Head back to Railway and notice a new deployment was created. After it has completed, you can use these tools in your environment. 43 | 44 | 1. (Optional): [Configure rclone](https://github.com/cdr/deploy-code-server/tree/main/deploy-container#-persist-your-filesystem-with-rclone) so that you can save your VS Code config and files without commiting 45 | 46 | See the [deploy-container README](../deploy-container) for other config vars for your environment. These variables, such as your password, can be managed in the "Variables" section of your project in railway. 47 | 48 | --- 49 | 50 | To update your code-server version, modify the version number on line 2 in your Dockerfile. See the [list of tags](https://hub.docker.com/r/codercom/code-server/tags?page=1&ordering=last_updated) for the latest version. 51 | -------------------------------------------------------------------------------- /deploy-container/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | START_DIR="${START_DIR:-/home/coder/project}" 4 | 5 | PREFIX="deploy-code-server" 6 | 7 | mkdir -p $START_DIR 8 | 9 | # function to clone the git repo or add a user's first file if no repo was specified. 10 | project_init () { 11 | [ -z "${GIT_REPO}" ] && echo "[$PREFIX] No GIT_REPO specified" && echo "Example file. Have questions? Join us at https://community.coder.com" > $START_DIR/coder.txt || git clone $GIT_REPO $START_DIR 12 | } 13 | 14 | # add rclone config and start rclone, if supplied 15 | if [[ -z "${RCLONE_DATA}" ]]; then 16 | echo "[$PREFIX] RCLONE_DATA is not specified. Files will not persist" 17 | 18 | # start the project 19 | project_init 20 | 21 | else 22 | echo "[$PREFIX] Copying rclone config..." 23 | mkdir -p /home/coder/.config/rclone/ 24 | touch /home/coder/.config/rclone/rclone.conf 25 | echo $RCLONE_DATA | base64 -d > /home/coder/.config/rclone/rclone.conf 26 | 27 | # default to true 28 | RCLONE_VSCODE_TASKS="${RCLONE_VSCODE_TASKS:-true}" 29 | RCLONE_AUTO_PUSH="${RCLONE_AUTO_PUSH:-true}" 30 | RCLONE_AUTO_PULL="${RCLONE_AUTO_PULL:-true}" 31 | 32 | if [ $RCLONE_VSCODE_TASKS = "true" ]; then 33 | # copy our tasks config to VS Code 34 | echo "[$PREFIX] Applying VS Code tasks for rclone" 35 | cp /tmp/rclone-tasks.json /home/coder/.local/share/code-server/User/tasks.json 36 | # install the extension to add to menu bar 37 | code-server --install-extension actboy168.tasks& 38 | else 39 | # user specified they don't want to apply the tasks 40 | echo "[$PREFIX] Skipping VS Code tasks for rclone" 41 | fi 42 | 43 | 44 | 45 | # Full path to the remote filesystem 46 | RCLONE_REMOTE_PATH=${RCLONE_REMOTE_NAME:-code-server-remote}:${RCLONE_DESTINATION:-code-server-files} 47 | RCLONE_SOURCE_PATH=${RCLONE_SOURCE:-$START_DIR} 48 | echo "rclone sync $RCLONE_SOURCE_PATH $RCLONE_REMOTE_PATH $RCLONE_FLAGS -vv" > /home/coder/push_remote.sh 49 | echo "rclone sync $RCLONE_REMOTE_PATH $RCLONE_SOURCE_PATH $RCLONE_FLAGS -vv" > /home/coder/pull_remote.sh 50 | chmod +x push_remote.sh pull_remote.sh 51 | 52 | if rclone ls $RCLONE_REMOTE_PATH; then 53 | 54 | if [ $RCLONE_AUTO_PULL = "true" ]; then 55 | # grab the files from the remote instead of running project_init() 56 | echo "[$PREFIX] Pulling existing files from remote..." 57 | /home/coder/pull_remote.sh& 58 | else 59 | # user specified they don't want to apply the tasks 60 | echo "[$PREFIX] Auto-pull is disabled" 61 | fi 62 | 63 | else 64 | 65 | if [ $RCLONE_AUTO_PUSH = "true" ]; then 66 | # we need to clone the git repo and sync 67 | echo "[$PREFIX] Pushing initial files to remote..." 68 | project_init 69 | /home/coder/push_remote.sh& 70 | else 71 | # user specified they don't want to apply the tasks 72 | echo "[$PREFIX] Auto-push is disabled" 73 | fi 74 | 75 | fi 76 | 77 | fi 78 | 79 | # Add dotfiles, if set 80 | if [ -n "$DOTFILES_REPO" ]; then 81 | # grab the files from the remote instead of running project_init() 82 | echo "[$PREFIX] Cloning dotfiles..." 83 | mkdir -p $HOME/dotfiles 84 | git clone $DOTFILES_REPO $HOME/dotfiles 85 | 86 | DOTFILES_SYMLINK="${RCLONE_AUTO_PULL:-true}" 87 | 88 | # symlink repo to $HOME 89 | if [ $DOTFILES_SYMLINK = "true" ]; then 90 | shopt -s dotglob 91 | ln -sf source_file $HOME/dotfiles/* $HOME 92 | fi 93 | 94 | # run install script, if it exists 95 | [ -f "$HOME/dotfiles/install.sh" ] && $HOME/dotfiles/install.sh 96 | fi 97 | 98 | echo "[$PREFIX] Starting code-server..." 99 | # Now we can run code-server with the default entrypoint 100 | /usr/bin/entrypoint.sh --bind-addr 0.0.0.0:8080 $START_DIR -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # deploy-code-server 🚀 2 | 3 | A collection of one-click buttons and scripts for deploying [code-server](https://github.com/cdr/code-server) to various cloud hosting platforms. The fastest way to get a code-server environment! ☁️ 4 | 5 | | | Name | Type | Lowest-Price Plan | Deploy | 6 | | --------------------------------------------------------------------------------------------------------------- | ----------------- | ------------- | ----------------------------- | ------------------------------------------------------- | 7 | | [![Coder](img/logo/coder.png)](https://coder.com/?utm_source=github.com/coder/deploy-code-server&utm_medium=github&utm_campaign=readme.md) | Coder | Anything | Open Source | [read the docs](https://coder.com/docs/coder-oss/latest?utm_source=github.com/coder/deploy-code-server&utm_medium=github&utm_campaign=readme.md) | 8 | | [![AWS EC2](img/logo/aws-ec2.png)](https://aws.amazon.com/ec2) | AWS EC2 | VM | Free Tier, 1 CPU, 1 GB RAM | [see guide](guides/aws-ec2.md) | 9 | | [![DigitalOcean](img/logo/digitalocean.png)](https://digitalocean.com) | DigitalOcean | VM | $5/mo, 1 CPU, 1 GB RAM | [see guide](guides/digitalocean.md) | 10 | | [![Vultr](img/logo/vultr.png)](https://vultr.com) | Vultr | VM | $3.50/mo, 1 CPU, 512 MB RAM | coming soon | 11 | | [![Linode](img/logo/linode.png)](https://linode.com) | Linode | VM | $5/mo, 1 CPU, 1 GB RAM | [see guide](guides/linode.md) | 12 | | [![Railway](img/logo/railway.png)](https://railway.app) | Railway | Container | Free, Shared CPU, 1 GB RAM 🚀 | [see guide](guides/railway.md) | 13 | | [![Heroku](img/logo/heroku.png)](https://heroku.com) | Heroku | Container | Free, 1 CPU, 512 MB RAM | [see guide](guides/heroku.md) | 14 | | [![Azure App Service](img/logo/azure-app-service.png)](https://azure.microsoft.com/en-us/services/app-service/) | Azure App Service | Container | Free, 1 CPU, 1 GB RAM | [see guide](https://github.com/bpmct/code-server-azure) | 15 | | [![Oracle Cloud](img/logo/oracle-logo.png)](https://www.oracle.com/cloud/) | Oracle Cloud | Terraform / OCI | Free Tier Support | [see guide](https://github.com/oracle-devrel/terraform-oci-code-server) | 16 | 17 | --- 18 | 19 | ## code-server on a VM vs. a Container 20 | 21 | - VMs are deployed once, and then can be modified to install new software 22 | - You need to save "snapshots" to use your latest images 23 | - Storage is always persistent, and you can usually add extra volumes 24 | - VMs can support many workloads, such as running Docker or Kubernetes clusters 25 | - [👀 Docs for the VM install script](deploy-vm/) 26 | - Deployed containers do not persist, and are often rebuilt 27 | - Containers can shut down when you are not using them, saving you money 28 | - All software and dependencies need to be defined in the `Dockerfile` or install script so they aren't destroyed on a rebuild. This is great if you want to have a new, clean environment every time you code 29 | - Most app platforms do not support running docker or virtual volume mounts in the container. 30 | - Storage may not be persistent. You may have to use [rclone](https://rclone.org/) to store your filesystem on a cloud service. Documented below: 31 | - [📄 Docs for code-server-deploy-container](deploy-container/) 32 | -------------------------------------------------------------------------------- /cli/src/deploys/deployDigitalOcean.ts: -------------------------------------------------------------------------------- 1 | import inquirer from "inquirer"; 2 | import got from "got"; 3 | import ora from "ora"; 4 | import chalk from "chalk"; 5 | import { 6 | createDroplet, 7 | Droplet, 8 | DropletV4Network, 9 | getDroplet, 10 | } from "../lib/digitalOcean"; 11 | import waitUntil from "async-wait-until"; 12 | 13 | const getUserDataScript = async () => 14 | got( 15 | "https://raw.githubusercontent.com/cdr/deploy-code-server/main/deploy-vm/launch-code-server.sh" 16 | ).text(); 17 | 18 | const isPermissionError = (error: unknown) => { 19 | return error instanceof got.HTTPError && error.response.statusCode === 401; 20 | }; 21 | 22 | const getPublicIp = (droplet: Droplet) => { 23 | const network = droplet.networks.v4.find( 24 | (network) => network.type === "public" 25 | ); 26 | return network?.ip_address; 27 | }; 28 | 29 | const isCodeServerLive = async (droplet: Droplet) => { 30 | try { 31 | const response = await got(`http://${getPublicIp(droplet)}`, { retry: 0 }); 32 | return response.statusCode === 200; 33 | } catch { 34 | return false; 35 | } 36 | }; 37 | 38 | const handleErrorLog = (error: unknown) => { 39 | if (isPermissionError(error)) { 40 | console.log( 41 | chalk.red( 42 | chalk.bold("Invalid token."), 43 | "Please, verify your token and try again." 44 | ) 45 | ); 46 | } else { 47 | console.log(chalk.red.bold("Something wrong happened")); 48 | console.log( 49 | chalk.red( 50 | "You may have to delete the droplet manually on your Digital Ocean dashboard." 51 | ) 52 | ); 53 | } 54 | }; 55 | 56 | const oneMinute = 1000 * 60; 57 | const fiveMinutes = oneMinute * 5; 58 | 59 | const waitUntilBeActive = (droplet: Droplet, token: string) => { 60 | return waitUntil( 61 | async () => { 62 | const dropletInfo = await getDroplet({ token, id: droplet.id }); 63 | return dropletInfo.status === "active"; 64 | }, 65 | { timeout: fiveMinutes, intervalBetweenAttempts: oneMinute / 2 } 66 | ); 67 | }; 68 | 69 | const waitUntilHasPublicIp = (droplet: Droplet, token: string) => { 70 | return waitUntil( 71 | async () => { 72 | const dropletInfo = await getDroplet({ token, id: droplet.id }); 73 | const ip = getPublicIp(dropletInfo); 74 | return ip !== undefined; 75 | }, 76 | { timeout: fiveMinutes, intervalBetweenAttempts: oneMinute / 2 } 77 | ); 78 | }; 79 | 80 | const waitUntilCodeServerIsLive = (droplet: Droplet, token: string) => { 81 | return waitUntil( 82 | async () => { 83 | const dropletInfo = await getDroplet({ token, id: droplet.id }); 84 | return isCodeServerLive(dropletInfo); 85 | }, 86 | { timeout: fiveMinutes * 2, intervalBetweenAttempts: oneMinute / 2 } 87 | ); 88 | }; 89 | 90 | export const deployDigitalOcean = async () => { 91 | let spinner: ora.Ora; 92 | 93 | console.log( 94 | chalk.blue( 95 | "You can create a token on", 96 | chalk.bold("https://cloud.digitalocean.com/account/api/tokens") 97 | ) 98 | ); 99 | const { token } = await inquirer.prompt([ 100 | { name: "token", message: "Your Digital Ocean token:", type: "password" }, 101 | ]); 102 | 103 | try { 104 | let spinner = ora("Creating droplet and installing code-server").start(); 105 | let droplet = await createDroplet({ 106 | userData: await getUserDataScript(), 107 | token, 108 | }); 109 | spinner.stop(); 110 | console.log(chalk.green("✅ Droplet created")); 111 | 112 | spinner = ora("Waiting droplet to be active").start(); 113 | await waitUntilBeActive(droplet, token); 114 | spinner.stop(); 115 | console.log(chalk.green("✅ Droplet active")); 116 | 117 | spinner = ora("Waiting droplet to have a public IP").start(); 118 | await waitUntilHasPublicIp(droplet, token); 119 | spinner.stop(); 120 | console.log(chalk.green("✅ Public IP is available")); 121 | 122 | spinner = ora( 123 | "Waiting code-server to be live. It can take up to 5 minutes." 124 | ).start(); 125 | await waitUntilCodeServerIsLive(droplet, token); 126 | droplet = await getDroplet({ token, id: droplet.id }); 127 | spinner.stop(); 128 | console.log( 129 | chalk.green( 130 | `🚀 Your code-server is live. You can access it on`, 131 | chalk.bold(`http://${getPublicIp(droplet)}`) 132 | ) 133 | ); 134 | } catch (error) { 135 | spinner.stop(); 136 | handleErrorLog(error); 137 | } 138 | }; 139 | -------------------------------------------------------------------------------- /deploy-container/README.md: -------------------------------------------------------------------------------- 1 | # code-server-deploy-container 2 | 3 | An container image built for deploying code-server. 4 | 5 | ## Guides 6 | 7 | - [Deploy on Railway](../guides/railway.md) 8 | - [Deploy on Heroku](../guides/heroku.md) 9 | 10 | Docker Hub: `bencdr/code-server-deploy-container` 11 | 12 | To run the container locally, you can use: 13 | 14 | ```console 15 | docker run -p 127.0.0.1:8080:8080 \ 16 | -v "$PWD/project:/home/coder/project" \ 17 | -u "$(id -u):$(id -g)" \ 18 | -e "DOCKER_USER=$USER" \ 19 | -e "PASSWORD=12345" \ 20 | -it bencdr/code-server-deploy-container:latest 21 | ``` 22 | 23 | ## Modifying your code-server environment 24 | 25 | To update your code-server version, modify the version number on line 2 in your Dockerfile. See the [list of tags](https://hub.docker.com/r/codercom/code-server/tags?page=1&ordering=last_updated) for the latest version. 26 | 27 | We've included some examples on how to add additional dependencies in the root-level [Dockerfile](../Dockerfile): 28 | 29 | ```Dockerfile 30 | # Install a VS Code extension: 31 | # Note: we use a different marketplace than VS Code. See https://github.com/cdr/code-server/blob/main/docs/FAQ.md#differences-compared-to-vs-code 32 | RUN code-server --install-extension esbenp.prettier-vscode 33 | 34 | # Install apt packages: 35 | RUN sudo apt-get install -y ubuntu-make 36 | 37 | # Copy files: 38 | COPY deploy-container/myTool /home/coder/myTool 39 | ``` 40 | 41 | --- 42 | 43 | ## Environment variables 44 | 45 | | Variable Name | Description | Default Value | 46 | | ------------------ | -------------------------------------------------------------------------------------------------- | ------------------- | 47 | | `PASSWORD` | Password for code-server | | 48 | | `HASHED_PASSWORD` | Overrrides PASSWORD. [SHA-256 hash](https://xorbin.com/tools/sha256-hash-calculator) of password | 49 | | `USE_LINK` | Use code-server --link instead of a password (coming soon) | false | 50 | | `GIT_REPO` | A git repository to clone | | 51 | | `DOTFILES_REPO` | A [dotfiles](https://dotfiles.github.io/) repo to save preferences. Runs install.sh, if it exists. | | 52 | | `DOTFILES_SYMLINK` | Symlinks dotfiles repo to $HOME, if exits. | true | 53 | | `START_DIR` | The directory code-server opens (and clones repos in) | /home/coder/project | 54 | 55 | --- 56 | 57 | Other code-server environment variables (such as `CODE_SERVER_CONFIG` ) can also be used. See the [code-server FAQ](https://github.com/cdr/code-server/blob/main/docs/FAQ.md) for details. 58 | 59 | ## 💾 Persist your filesystem with `rclone` 60 | 61 | This image has built-in support for [rclone](https://rclone.org/) so that your files don't get lost when code-server is re-deployed. 62 | 63 | You can generate the rclone config on any machine, but it works great on the code-server environment itself, or Google Cloud Shell :) 64 | 65 | ```sh 66 | # 1. install rclone 67 | # see https://rclone.org/install/ for other install options 68 | $ curl https://rclone.org/install.sh | sudo bash 69 | 70 | # 2. create a new rclone remote with your favorite storage provider ☁️ 71 | $ rclone config 72 | 73 | # 3. Encode your rclone config and copy to your clipboard 74 | $ cat $(rclone config file | sed -n 2p) | base64 --wrap=0 # Linux 75 | $ cat $(rclone config file | sed -n 2p) | base64 --b 0 # MacOS 76 | ``` 77 | 78 | Now, you can add the following the environment variables in the code-server cloud app: 79 | 80 | | Environment Variable | Description | Default Value | Required | 81 | | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | -------- | 82 | | RCLONE_DATA | the encoded rclone config you copied in step 3 | n/a | ✅ | 83 | | RCLONE_REMOTE_NAME | the name of the remote you added in step 2.
check with `$ rclone listremotes` | code-server-remote | | 84 | | RCLONE_SOURCE | source directory to sync files in the code-server container | the project directory: `/home/coder/project` | | 85 | | RCLONE_DESTINATION | the path in the remote that rclone syncs to. change this if you have multiple code-server environments, or if you want to better organize your files. | code-server-files | | 86 | | RCLONE_VSCODE_TASKS | import push and pull shortcuts into VS Code ![rclone screenshot from VS Code](../img/rclone-vscode-tasks.png) | true | 87 | | RCLONE_AUTO_PUSH | automatically push files on startup if the rclone remote is empty (environment -> rclone remote) | true | | 88 | | RCLONE_AUTO_PULL | automatically pull files on startup if the rclone remote is not empty (rclone -> environment remote) | true | | 89 | | RCLONE_FLAGS | additional flags to attach to the push and pull script.
type `$ rclone help flags` for a list. | | | 90 | 91 | ```sh 92 | 93 | # --- How to use --- 94 | 95 | # Terminal: 96 | $ sh /home/coder/push_remote.sh # save your uncomitted files to the remote 97 | $ sh /home/coder/pull_remote.sh # get latest files from the remote 98 | 99 | # In VS Code: 100 | # use items in bottom bar or ctrl + P, run task: push_remote or pull_remote or 101 | ``` 102 | 103 | ### Popular rclone flags 104 | 105 | To avoid syncing unnecessary directories, add this to `RCLONE_FLAGS` : 106 | 107 | ```none 108 | --exclude "node_modules/**" --exclude ".git/**" 109 | ``` 110 | 111 | --- 112 | 113 | ## Todo 114 | 115 | - [ ] Make `push_remote` and `pull_remote` commands in path 116 | - [ ] Impliment file watcher or auto file sync in VS Code 117 | - [ ] Attach a "push" on a git stash?? 118 | - [ ] Add support for SSH / VS Code remote access 119 | - [ ] Make rclone logs visible in environment for debugging 120 | -------------------------------------------------------------------------------- /cli/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sindresorhus/is@^4.0.0": 6 | version "4.0.1" 7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5" 8 | integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g== 9 | 10 | "@szmarczak/http-timer@^4.0.5": 11 | version "4.0.6" 12 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" 13 | integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== 14 | dependencies: 15 | defer-to-connect "^2.0.0" 16 | 17 | "@types/cacheable-request@^6.0.1": 18 | version "6.0.2" 19 | resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" 20 | integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== 21 | dependencies: 22 | "@types/http-cache-semantics" "*" 23 | "@types/keyv" "*" 24 | "@types/node" "*" 25 | "@types/responselike" "*" 26 | 27 | "@types/http-cache-semantics@*": 28 | version "4.0.1" 29 | resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" 30 | integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== 31 | 32 | "@types/inquirer@^7.3.3": 33 | version "7.3.3" 34 | resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-7.3.3.tgz#92e6676efb67fa6925c69a2ee638f67a822952ac" 35 | integrity sha512-HhxyLejTHMfohAuhRun4csWigAMjXTmRyiJTU1Y/I1xmggikFMkOUoMQRlFm+zQcPEGHSs3io/0FAmNZf8EymQ== 36 | dependencies: 37 | "@types/through" "*" 38 | rxjs "^6.4.0" 39 | 40 | "@types/keyv@*": 41 | version "3.1.2" 42 | resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.2.tgz#5d97bb65526c20b6e0845f6b0d2ade4f28604ee5" 43 | integrity sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg== 44 | dependencies: 45 | "@types/node" "*" 46 | 47 | "@types/node@*": 48 | version "16.7.1" 49 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.1.tgz#c6b9198178da504dfca1fd0be9b2e1002f1586f0" 50 | integrity sha512-ncRdc45SoYJ2H4eWU9ReDfp3vtFqDYhjOsKlFFUDEn8V1Bgr2RjYal8YT5byfadWIRluhPFU6JiDOl0H6Sl87A== 51 | 52 | "@types/node@^14.14.20": 53 | version "14.17.11" 54 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.11.tgz#82d266d657aec5ff01ca59f2ffaff1bb43f7bf0f" 55 | integrity sha512-n2OQ+0Bz6WEsUjrvcHD1xZ8K+Kgo4cn9/w94s1bJS690QMUWfJPW/m7CCb7gPkA1fcYwL2UpjXP/rq/Eo41m6w== 56 | 57 | "@types/responselike@*", "@types/responselike@^1.0.0": 58 | version "1.0.0" 59 | resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" 60 | integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== 61 | dependencies: 62 | "@types/node" "*" 63 | 64 | "@types/through@*": 65 | version "0.0.30" 66 | resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" 67 | integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== 68 | dependencies: 69 | "@types/node" "*" 70 | 71 | ansi-escapes@^4.2.1: 72 | version "4.3.2" 73 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" 74 | integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== 75 | dependencies: 76 | type-fest "^0.21.3" 77 | 78 | ansi-regex@^5.0.0: 79 | version "5.0.0" 80 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 81 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 82 | 83 | ansi-styles@^4.1.0: 84 | version "4.3.0" 85 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 86 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 87 | dependencies: 88 | color-convert "^2.0.1" 89 | 90 | async-wait-until@^2.0.7: 91 | version "2.0.7" 92 | resolved "https://registry.yarnpkg.com/async-wait-until/-/async-wait-until-2.0.7.tgz#ed4ccfe076850105c1de555381630b9fad882f5d" 93 | integrity sha512-SjHxM2f5ev4o87gYppr8HmWPjOHw06Pg5KZvkSl6FMqa3TTHzDGIWCZx61XWjxO5ArPcZBuJYbAa809FNyx3QQ== 94 | 95 | base64-js@^1.3.1: 96 | version "1.5.1" 97 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 98 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 99 | 100 | bl@^4.1.0: 101 | version "4.1.0" 102 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 103 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 104 | dependencies: 105 | buffer "^5.5.0" 106 | inherits "^2.0.4" 107 | readable-stream "^3.4.0" 108 | 109 | buffer@^5.5.0: 110 | version "5.7.1" 111 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 112 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 113 | dependencies: 114 | base64-js "^1.3.1" 115 | ieee754 "^1.1.13" 116 | 117 | cacheable-lookup@^5.0.3: 118 | version "5.0.4" 119 | resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" 120 | integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== 121 | 122 | cacheable-request@^7.0.2: 123 | version "7.0.2" 124 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" 125 | integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== 126 | dependencies: 127 | clone-response "^1.0.2" 128 | get-stream "^5.1.0" 129 | http-cache-semantics "^4.0.0" 130 | keyv "^4.0.0" 131 | lowercase-keys "^2.0.0" 132 | normalize-url "^6.0.1" 133 | responselike "^2.0.0" 134 | 135 | chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: 136 | version "4.1.2" 137 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 138 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 139 | dependencies: 140 | ansi-styles "^4.1.0" 141 | supports-color "^7.1.0" 142 | 143 | chardet@^0.7.0: 144 | version "0.7.0" 145 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 146 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 147 | 148 | cli-cursor@^3.1.0: 149 | version "3.1.0" 150 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 151 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 152 | dependencies: 153 | restore-cursor "^3.1.0" 154 | 155 | cli-spinners@^2.5.0: 156 | version "2.6.0" 157 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" 158 | integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== 159 | 160 | cli-width@^3.0.0: 161 | version "3.0.0" 162 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" 163 | integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== 164 | 165 | clone-response@^1.0.2: 166 | version "1.0.2" 167 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 168 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 169 | dependencies: 170 | mimic-response "^1.0.0" 171 | 172 | clone@^1.0.2: 173 | version "1.0.4" 174 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 175 | integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= 176 | 177 | color-convert@^2.0.1: 178 | version "2.0.1" 179 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 180 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 181 | dependencies: 182 | color-name "~1.1.4" 183 | 184 | color-name@~1.1.4: 185 | version "1.1.4" 186 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 187 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 188 | 189 | commander@^8.1.0: 190 | version "8.1.0" 191 | resolved "https://registry.yarnpkg.com/commander/-/commander-8.1.0.tgz#db36e3e66edf24ff591d639862c6ab2c52664362" 192 | integrity sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA== 193 | 194 | decompress-response@^6.0.0: 195 | version "6.0.0" 196 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" 197 | integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== 198 | dependencies: 199 | mimic-response "^3.1.0" 200 | 201 | defaults@^1.0.3: 202 | version "1.0.3" 203 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 204 | integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= 205 | dependencies: 206 | clone "^1.0.2" 207 | 208 | defer-to-connect@^2.0.0: 209 | version "2.0.1" 210 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" 211 | integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== 212 | 213 | emoji-regex@^8.0.0: 214 | version "8.0.0" 215 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 216 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 217 | 218 | end-of-stream@^1.1.0: 219 | version "1.4.4" 220 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 221 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 222 | dependencies: 223 | once "^1.4.0" 224 | 225 | escape-string-regexp@^1.0.5: 226 | version "1.0.5" 227 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 228 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 229 | 230 | external-editor@^3.0.3: 231 | version "3.1.0" 232 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 233 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 234 | dependencies: 235 | chardet "^0.7.0" 236 | iconv-lite "^0.4.24" 237 | tmp "^0.0.33" 238 | 239 | figures@^3.0.0: 240 | version "3.2.0" 241 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 242 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 243 | dependencies: 244 | escape-string-regexp "^1.0.5" 245 | 246 | get-stream@^5.1.0: 247 | version "5.2.0" 248 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 249 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 250 | dependencies: 251 | pump "^3.0.0" 252 | 253 | got@^11.8.2: 254 | version "11.8.5" 255 | resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" 256 | integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== 257 | dependencies: 258 | "@sindresorhus/is" "^4.0.0" 259 | "@szmarczak/http-timer" "^4.0.5" 260 | "@types/cacheable-request" "^6.0.1" 261 | "@types/responselike" "^1.0.0" 262 | cacheable-lookup "^5.0.3" 263 | cacheable-request "^7.0.2" 264 | decompress-response "^6.0.0" 265 | http2-wrapper "^1.0.0-beta.5.2" 266 | lowercase-keys "^2.0.0" 267 | p-cancelable "^2.0.0" 268 | responselike "^2.0.0" 269 | 270 | has-flag@^4.0.0: 271 | version "4.0.0" 272 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 273 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 274 | 275 | http-cache-semantics@^4.0.0: 276 | version "4.1.0" 277 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 278 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 279 | 280 | http2-wrapper@^1.0.0-beta.5.2: 281 | version "1.0.3" 282 | resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" 283 | integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== 284 | dependencies: 285 | quick-lru "^5.1.1" 286 | resolve-alpn "^1.0.0" 287 | 288 | iconv-lite@^0.4.24: 289 | version "0.4.24" 290 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 291 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 292 | dependencies: 293 | safer-buffer ">= 2.1.2 < 3" 294 | 295 | ieee754@^1.1.13: 296 | version "1.2.1" 297 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 298 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 299 | 300 | inherits@^2.0.3, inherits@^2.0.4: 301 | version "2.0.4" 302 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 303 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 304 | 305 | inquirer@^8.1.2: 306 | version "8.1.2" 307 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.2.tgz#65b204d2cd7fb63400edd925dfe428bafd422e3d" 308 | integrity sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q== 309 | dependencies: 310 | ansi-escapes "^4.2.1" 311 | chalk "^4.1.1" 312 | cli-cursor "^3.1.0" 313 | cli-width "^3.0.0" 314 | external-editor "^3.0.3" 315 | figures "^3.0.0" 316 | lodash "^4.17.21" 317 | mute-stream "0.0.8" 318 | ora "^5.3.0" 319 | run-async "^2.4.0" 320 | rxjs "^7.2.0" 321 | string-width "^4.1.0" 322 | strip-ansi "^6.0.0" 323 | through "^2.3.6" 324 | 325 | is-fullwidth-code-point@^3.0.0: 326 | version "3.0.0" 327 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 328 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 329 | 330 | is-interactive@^1.0.0: 331 | version "1.0.0" 332 | resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" 333 | integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== 334 | 335 | is-unicode-supported@^0.1.0: 336 | version "0.1.0" 337 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 338 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 339 | 340 | json-buffer@3.0.1: 341 | version "3.0.1" 342 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 343 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 344 | 345 | keyv@^4.0.0: 346 | version "4.0.3" 347 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" 348 | integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== 349 | dependencies: 350 | json-buffer "3.0.1" 351 | 352 | lodash@^4.17.21: 353 | version "4.17.21" 354 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 355 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 356 | 357 | log-symbols@^4.1.0: 358 | version "4.1.0" 359 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 360 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 361 | dependencies: 362 | chalk "^4.1.0" 363 | is-unicode-supported "^0.1.0" 364 | 365 | lowercase-keys@^2.0.0: 366 | version "2.0.0" 367 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 368 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 369 | 370 | mimic-fn@^2.1.0: 371 | version "2.1.0" 372 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 373 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 374 | 375 | mimic-response@^1.0.0: 376 | version "1.0.1" 377 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 378 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 379 | 380 | mimic-response@^3.1.0: 381 | version "3.1.0" 382 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" 383 | integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== 384 | 385 | mute-stream@0.0.8: 386 | version "0.0.8" 387 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 388 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 389 | 390 | normalize-url@^6.0.1: 391 | version "6.1.0" 392 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" 393 | integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== 394 | 395 | once@^1.3.1, once@^1.4.0: 396 | version "1.4.0" 397 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 398 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 399 | dependencies: 400 | wrappy "1" 401 | 402 | onetime@^5.1.0: 403 | version "5.1.2" 404 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 405 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 406 | dependencies: 407 | mimic-fn "^2.1.0" 408 | 409 | ora@^5.3.0, ora@^5.4.1: 410 | version "5.4.1" 411 | resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" 412 | integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== 413 | dependencies: 414 | bl "^4.1.0" 415 | chalk "^4.1.0" 416 | cli-cursor "^3.1.0" 417 | cli-spinners "^2.5.0" 418 | is-interactive "^1.0.0" 419 | is-unicode-supported "^0.1.0" 420 | log-symbols "^4.1.0" 421 | strip-ansi "^6.0.0" 422 | wcwidth "^1.0.1" 423 | 424 | os-tmpdir@~1.0.2: 425 | version "1.0.2" 426 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 427 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 428 | 429 | p-cancelable@^2.0.0: 430 | version "2.1.1" 431 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" 432 | integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== 433 | 434 | pump@^3.0.0: 435 | version "3.0.0" 436 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 437 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 438 | dependencies: 439 | end-of-stream "^1.1.0" 440 | once "^1.3.1" 441 | 442 | quick-lru@^5.1.1: 443 | version "5.1.1" 444 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" 445 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== 446 | 447 | readable-stream@^3.4.0: 448 | version "3.6.0" 449 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 450 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 451 | dependencies: 452 | inherits "^2.0.3" 453 | string_decoder "^1.1.1" 454 | util-deprecate "^1.0.1" 455 | 456 | resolve-alpn@^1.0.0: 457 | version "1.2.0" 458 | resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.0.tgz#058bb0888d1cd4d12474e9a4b6eb17bdd5addc44" 459 | integrity sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA== 460 | 461 | responselike@^2.0.0: 462 | version "2.0.0" 463 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" 464 | integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== 465 | dependencies: 466 | lowercase-keys "^2.0.0" 467 | 468 | restore-cursor@^3.1.0: 469 | version "3.1.0" 470 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 471 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 472 | dependencies: 473 | onetime "^5.1.0" 474 | signal-exit "^3.0.2" 475 | 476 | run-async@^2.4.0: 477 | version "2.4.1" 478 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 479 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 480 | 481 | rxjs@^6.4.0: 482 | version "6.6.7" 483 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" 484 | integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== 485 | dependencies: 486 | tslib "^1.9.0" 487 | 488 | rxjs@^7.2.0: 489 | version "7.3.0" 490 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6" 491 | integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw== 492 | dependencies: 493 | tslib "~2.1.0" 494 | 495 | safe-buffer@~5.2.0: 496 | version "5.2.1" 497 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 498 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 499 | 500 | "safer-buffer@>= 2.1.2 < 3": 501 | version "2.1.2" 502 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 503 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 504 | 505 | signal-exit@^3.0.2: 506 | version "3.0.3" 507 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 508 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 509 | 510 | string-width@^4.1.0: 511 | version "4.2.2" 512 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 513 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 514 | dependencies: 515 | emoji-regex "^8.0.0" 516 | is-fullwidth-code-point "^3.0.0" 517 | strip-ansi "^6.0.0" 518 | 519 | string_decoder@^1.1.1: 520 | version "1.3.0" 521 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 522 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 523 | dependencies: 524 | safe-buffer "~5.2.0" 525 | 526 | strip-ansi@^6.0.0: 527 | version "6.0.0" 528 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 529 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 530 | dependencies: 531 | ansi-regex "^5.0.0" 532 | 533 | supports-color@^7.1.0: 534 | version "7.2.0" 535 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 536 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 537 | dependencies: 538 | has-flag "^4.0.0" 539 | 540 | through@^2.3.6: 541 | version "2.3.8" 542 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 543 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 544 | 545 | tmp@^0.0.33: 546 | version "0.0.33" 547 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 548 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 549 | dependencies: 550 | os-tmpdir "~1.0.2" 551 | 552 | tslib@^1.9.0: 553 | version "1.14.1" 554 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 555 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 556 | 557 | tslib@~2.1.0: 558 | version "2.1.0" 559 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" 560 | integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== 561 | 562 | type-fest@^0.21.3: 563 | version "0.21.3" 564 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" 565 | integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== 566 | 567 | typescript@^4.1.3: 568 | version "4.3.5" 569 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" 570 | integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== 571 | 572 | util-deprecate@^1.0.1: 573 | version "1.0.2" 574 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 575 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 576 | 577 | wcwidth@^1.0.1: 578 | version "1.0.1" 579 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 580 | integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= 581 | dependencies: 582 | defaults "^1.0.3" 583 | 584 | wrappy@1: 585 | version "1.0.2" 586 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 587 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 588 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.14.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" 8 | integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== 9 | dependencies: 10 | "@babel/highlight" "^7.14.5" 11 | 12 | "@babel/helper-validator-identifier@^7.14.5": 13 | version "7.14.9" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" 15 | integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== 16 | 17 | "@babel/highlight@^7.14.5": 18 | version "7.14.5" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" 20 | integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.14.5" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@types/parse-json@^4.0.0": 27 | version "4.0.0" 28 | resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" 29 | integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== 30 | 31 | aggregate-error@^3.0.0: 32 | version "3.1.0" 33 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" 34 | integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 35 | dependencies: 36 | clean-stack "^2.0.0" 37 | indent-string "^4.0.0" 38 | 39 | ansi-colors@^4.1.1: 40 | version "4.1.1" 41 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 42 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 43 | 44 | ansi-escapes@^4.3.0: 45 | version "4.3.2" 46 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" 47 | integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== 48 | dependencies: 49 | type-fest "^0.21.3" 50 | 51 | ansi-regex@^5.0.0: 52 | version "5.0.0" 53 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 54 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 55 | 56 | ansi-styles@^3.2.1: 57 | version "3.2.1" 58 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 59 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 60 | dependencies: 61 | color-convert "^1.9.0" 62 | 63 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 64 | version "4.3.0" 65 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 66 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 67 | dependencies: 68 | color-convert "^2.0.1" 69 | 70 | astral-regex@^2.0.0: 71 | version "2.0.0" 72 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 73 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 74 | 75 | braces@^3.0.1: 76 | version "3.0.2" 77 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 78 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 79 | dependencies: 80 | fill-range "^7.0.1" 81 | 82 | callsites@^3.0.0: 83 | version "3.1.0" 84 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 85 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 86 | 87 | chalk@^2.0.0: 88 | version "2.4.2" 89 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 90 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 91 | dependencies: 92 | ansi-styles "^3.2.1" 93 | escape-string-regexp "^1.0.5" 94 | supports-color "^5.3.0" 95 | 96 | chalk@^4.1.0, chalk@^4.1.1: 97 | version "4.1.2" 98 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 99 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 100 | dependencies: 101 | ansi-styles "^4.1.0" 102 | supports-color "^7.1.0" 103 | 104 | clean-stack@^2.0.0: 105 | version "2.2.0" 106 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 107 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 108 | 109 | cli-cursor@^3.1.0: 110 | version "3.1.0" 111 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 112 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 113 | dependencies: 114 | restore-cursor "^3.1.0" 115 | 116 | cli-truncate@^2.1.0: 117 | version "2.1.0" 118 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" 119 | integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== 120 | dependencies: 121 | slice-ansi "^3.0.0" 122 | string-width "^4.2.0" 123 | 124 | color-convert@^1.9.0: 125 | version "1.9.3" 126 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 127 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 128 | dependencies: 129 | color-name "1.1.3" 130 | 131 | color-convert@^2.0.1: 132 | version "2.0.1" 133 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 134 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 135 | dependencies: 136 | color-name "~1.1.4" 137 | 138 | color-name@1.1.3: 139 | version "1.1.3" 140 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 141 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 142 | 143 | color-name@~1.1.4: 144 | version "1.1.4" 145 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 146 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 147 | 148 | colorette@^1.2.2: 149 | version "1.3.0" 150 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" 151 | integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== 152 | 153 | commander@^7.2.0: 154 | version "7.2.0" 155 | resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" 156 | integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== 157 | 158 | cosmiconfig@^7.0.0: 159 | version "7.0.1" 160 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" 161 | integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== 162 | dependencies: 163 | "@types/parse-json" "^4.0.0" 164 | import-fresh "^3.2.1" 165 | parse-json "^5.0.0" 166 | path-type "^4.0.0" 167 | yaml "^1.10.0" 168 | 169 | cross-spawn@^7.0.3: 170 | version "7.0.3" 171 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 172 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 173 | dependencies: 174 | path-key "^3.1.0" 175 | shebang-command "^2.0.0" 176 | which "^2.0.1" 177 | 178 | debug@^4.3.1: 179 | version "4.3.2" 180 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 181 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 182 | dependencies: 183 | ms "2.1.2" 184 | 185 | emoji-regex@^8.0.0: 186 | version "8.0.0" 187 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 188 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 189 | 190 | enquirer@^2.3.6: 191 | version "2.3.6" 192 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" 193 | integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 194 | dependencies: 195 | ansi-colors "^4.1.1" 196 | 197 | error-ex@^1.3.1: 198 | version "1.3.2" 199 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 200 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 201 | dependencies: 202 | is-arrayish "^0.2.1" 203 | 204 | escape-string-regexp@^1.0.5: 205 | version "1.0.5" 206 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 207 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 208 | 209 | execa@^5.0.0: 210 | version "5.1.1" 211 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 212 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 213 | dependencies: 214 | cross-spawn "^7.0.3" 215 | get-stream "^6.0.0" 216 | human-signals "^2.1.0" 217 | is-stream "^2.0.0" 218 | merge-stream "^2.0.0" 219 | npm-run-path "^4.0.1" 220 | onetime "^5.1.2" 221 | signal-exit "^3.0.3" 222 | strip-final-newline "^2.0.0" 223 | 224 | fill-range@^7.0.1: 225 | version "7.0.1" 226 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 227 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 228 | dependencies: 229 | to-regex-range "^5.0.1" 230 | 231 | get-own-enumerable-property-symbols@^3.0.0: 232 | version "3.0.2" 233 | resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" 234 | integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== 235 | 236 | get-stream@^6.0.0: 237 | version "6.0.1" 238 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 239 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 240 | 241 | has-flag@^3.0.0: 242 | version "3.0.0" 243 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 244 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 245 | 246 | has-flag@^4.0.0: 247 | version "4.0.0" 248 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 249 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 250 | 251 | human-signals@^2.1.0: 252 | version "2.1.0" 253 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 254 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 255 | 256 | husky@>=6: 257 | version "7.0.1" 258 | resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.1.tgz#579f4180b5da4520263e8713cc832942b48e1f1c" 259 | integrity sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA== 260 | 261 | import-fresh@^3.2.1: 262 | version "3.3.0" 263 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 264 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 265 | dependencies: 266 | parent-module "^1.0.0" 267 | resolve-from "^4.0.0" 268 | 269 | indent-string@^4.0.0: 270 | version "4.0.0" 271 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 272 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 273 | 274 | is-arrayish@^0.2.1: 275 | version "0.2.1" 276 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 277 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 278 | 279 | is-fullwidth-code-point@^3.0.0: 280 | version "3.0.0" 281 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 282 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 283 | 284 | is-number@^7.0.0: 285 | version "7.0.0" 286 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 287 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 288 | 289 | is-obj@^1.0.1: 290 | version "1.0.1" 291 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 292 | integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= 293 | 294 | is-regexp@^1.0.0: 295 | version "1.0.0" 296 | resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" 297 | integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= 298 | 299 | is-stream@^2.0.0: 300 | version "2.0.1" 301 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 302 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 303 | 304 | is-unicode-supported@^0.1.0: 305 | version "0.1.0" 306 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 307 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 308 | 309 | isexe@^2.0.0: 310 | version "2.0.0" 311 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 312 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 313 | 314 | js-tokens@^4.0.0: 315 | version "4.0.0" 316 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 317 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 318 | 319 | json-parse-even-better-errors@^2.3.0: 320 | version "2.3.1" 321 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 322 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 323 | 324 | lines-and-columns@^1.1.6: 325 | version "1.1.6" 326 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" 327 | integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= 328 | 329 | lint-staged@>=10: 330 | version "11.1.2" 331 | resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.1.2.tgz#4dd78782ae43ee6ebf2969cad9af67a46b33cd90" 332 | integrity sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w== 333 | dependencies: 334 | chalk "^4.1.1" 335 | cli-truncate "^2.1.0" 336 | commander "^7.2.0" 337 | cosmiconfig "^7.0.0" 338 | debug "^4.3.1" 339 | enquirer "^2.3.6" 340 | execa "^5.0.0" 341 | listr2 "^3.8.2" 342 | log-symbols "^4.1.0" 343 | micromatch "^4.0.4" 344 | normalize-path "^3.0.0" 345 | please-upgrade-node "^3.2.0" 346 | string-argv "0.3.1" 347 | stringify-object "^3.3.0" 348 | 349 | listr2@^3.8.2: 350 | version "3.11.0" 351 | resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.11.0.tgz#9771b02407875aa78e73d6e0ff6541bbec0aaee9" 352 | integrity sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ== 353 | dependencies: 354 | cli-truncate "^2.1.0" 355 | colorette "^1.2.2" 356 | log-update "^4.0.0" 357 | p-map "^4.0.0" 358 | rxjs "^6.6.7" 359 | through "^2.3.8" 360 | wrap-ansi "^7.0.0" 361 | 362 | log-symbols@^4.1.0: 363 | version "4.1.0" 364 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 365 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 366 | dependencies: 367 | chalk "^4.1.0" 368 | is-unicode-supported "^0.1.0" 369 | 370 | log-update@^4.0.0: 371 | version "4.0.0" 372 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" 373 | integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== 374 | dependencies: 375 | ansi-escapes "^4.3.0" 376 | cli-cursor "^3.1.0" 377 | slice-ansi "^4.0.0" 378 | wrap-ansi "^6.2.0" 379 | 380 | merge-stream@^2.0.0: 381 | version "2.0.0" 382 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 383 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 384 | 385 | micromatch@^4.0.4: 386 | version "4.0.4" 387 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 388 | integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== 389 | dependencies: 390 | braces "^3.0.1" 391 | picomatch "^2.2.3" 392 | 393 | mimic-fn@^2.1.0: 394 | version "2.1.0" 395 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 396 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 397 | 398 | ms@2.1.2: 399 | version "2.1.2" 400 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 401 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 402 | 403 | normalize-path@^3.0.0: 404 | version "3.0.0" 405 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 406 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 407 | 408 | npm-run-path@^4.0.1: 409 | version "4.0.1" 410 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 411 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 412 | dependencies: 413 | path-key "^3.0.0" 414 | 415 | onetime@^5.1.0, onetime@^5.1.2: 416 | version "5.1.2" 417 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 418 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 419 | dependencies: 420 | mimic-fn "^2.1.0" 421 | 422 | p-map@^4.0.0: 423 | version "4.0.0" 424 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" 425 | integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== 426 | dependencies: 427 | aggregate-error "^3.0.0" 428 | 429 | parent-module@^1.0.0: 430 | version "1.0.1" 431 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 432 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 433 | dependencies: 434 | callsites "^3.0.0" 435 | 436 | parse-json@^5.0.0: 437 | version "5.2.0" 438 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" 439 | integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== 440 | dependencies: 441 | "@babel/code-frame" "^7.0.0" 442 | error-ex "^1.3.1" 443 | json-parse-even-better-errors "^2.3.0" 444 | lines-and-columns "^1.1.6" 445 | 446 | path-key@^3.0.0, path-key@^3.1.0: 447 | version "3.1.1" 448 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 449 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 450 | 451 | path-type@^4.0.0: 452 | version "4.0.0" 453 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 454 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 455 | 456 | picomatch@^2.2.3: 457 | version "2.3.0" 458 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 459 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 460 | 461 | please-upgrade-node@^3.2.0: 462 | version "3.2.0" 463 | resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" 464 | integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== 465 | dependencies: 466 | semver-compare "^1.0.0" 467 | 468 | prettier@^2.3.2: 469 | version "2.3.2" 470 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" 471 | integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== 472 | 473 | resolve-from@^4.0.0: 474 | version "4.0.0" 475 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 476 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 477 | 478 | restore-cursor@^3.1.0: 479 | version "3.1.0" 480 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 481 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 482 | dependencies: 483 | onetime "^5.1.0" 484 | signal-exit "^3.0.2" 485 | 486 | rxjs@^6.6.7: 487 | version "6.6.7" 488 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" 489 | integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== 490 | dependencies: 491 | tslib "^1.9.0" 492 | 493 | semver-compare@^1.0.0: 494 | version "1.0.0" 495 | resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 496 | integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= 497 | 498 | shebang-command@^2.0.0: 499 | version "2.0.0" 500 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 501 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 502 | dependencies: 503 | shebang-regex "^3.0.0" 504 | 505 | shebang-regex@^3.0.0: 506 | version "3.0.0" 507 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 508 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 509 | 510 | signal-exit@^3.0.2, signal-exit@^3.0.3: 511 | version "3.0.3" 512 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 513 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 514 | 515 | slice-ansi@^3.0.0: 516 | version "3.0.0" 517 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" 518 | integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== 519 | dependencies: 520 | ansi-styles "^4.0.0" 521 | astral-regex "^2.0.0" 522 | is-fullwidth-code-point "^3.0.0" 523 | 524 | slice-ansi@^4.0.0: 525 | version "4.0.0" 526 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" 527 | integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 528 | dependencies: 529 | ansi-styles "^4.0.0" 530 | astral-regex "^2.0.0" 531 | is-fullwidth-code-point "^3.0.0" 532 | 533 | string-argv@0.3.1: 534 | version "0.3.1" 535 | resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" 536 | integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== 537 | 538 | string-width@^4.1.0, string-width@^4.2.0: 539 | version "4.2.2" 540 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 541 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 542 | dependencies: 543 | emoji-regex "^8.0.0" 544 | is-fullwidth-code-point "^3.0.0" 545 | strip-ansi "^6.0.0" 546 | 547 | stringify-object@^3.3.0: 548 | version "3.3.0" 549 | resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" 550 | integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== 551 | dependencies: 552 | get-own-enumerable-property-symbols "^3.0.0" 553 | is-obj "^1.0.1" 554 | is-regexp "^1.0.0" 555 | 556 | strip-ansi@^6.0.0: 557 | version "6.0.0" 558 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 559 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 560 | dependencies: 561 | ansi-regex "^5.0.0" 562 | 563 | strip-final-newline@^2.0.0: 564 | version "2.0.0" 565 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 566 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 567 | 568 | supports-color@^5.3.0: 569 | version "5.5.0" 570 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 571 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 572 | dependencies: 573 | has-flag "^3.0.0" 574 | 575 | supports-color@^7.1.0: 576 | version "7.2.0" 577 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 578 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 579 | dependencies: 580 | has-flag "^4.0.0" 581 | 582 | through@^2.3.8: 583 | version "2.3.8" 584 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 585 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 586 | 587 | to-regex-range@^5.0.1: 588 | version "5.0.1" 589 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 590 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 591 | dependencies: 592 | is-number "^7.0.0" 593 | 594 | tslib@^1.9.0: 595 | version "1.14.1" 596 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 597 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 598 | 599 | type-fest@^0.21.3: 600 | version "0.21.3" 601 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" 602 | integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== 603 | 604 | which@^2.0.1: 605 | version "2.0.2" 606 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 607 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 608 | dependencies: 609 | isexe "^2.0.0" 610 | 611 | wrap-ansi@^6.2.0: 612 | version "6.2.0" 613 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 614 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 615 | dependencies: 616 | ansi-styles "^4.0.0" 617 | string-width "^4.1.0" 618 | strip-ansi "^6.0.0" 619 | 620 | wrap-ansi@^7.0.0: 621 | version "7.0.0" 622 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 623 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 624 | dependencies: 625 | ansi-styles "^4.0.0" 626 | string-width "^4.1.0" 627 | strip-ansi "^6.0.0" 628 | 629 | yaml@^1.10.0: 630 | version "1.10.2" 631 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" 632 | integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== 633 | --------------------------------------------------------------------------------