diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e4012c608 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node-helpers +virtual-machine +deploytest +.DS_Store +*.retry +startVagrant.sh +minishift diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..ef3c63aed --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "javascript.validate.enable": false +} \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 000000000..b7c4805f6 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,83 @@ +node { + def docker_compose = "docker run -t --rm -v \$WORKSPACE:\$WORKSPACE -v /var/run/docker.sock:/var/run/docker.sock -w \$WORKSPACE docker/compose:1.13.0 -p lagoon" + + + deleteDir() + + stage ('Checkout') { + checkout scm + } + + lock('minishift') { + try { + ansiColor('xterm') { + stage ('checkout services') { + sshagent (credentials: ['lagoon-ci']) { + sh "./initGit.sh" + } + } + + parallel ( + 'start services': { + stage ('start services') { + sh "${docker_compose} up -d --force" + } + }, + 'start openshift': { + stage ('start openshift') { + sh './startOpenShift.sh' + } + } + ) + + + parallel ( + '_tests': { + stage ('run tests') { + sh "${docker_compose} exec tests ansible-playbook /ansible/playbooks/node.yaml" + cleanup(docker_compose) + } + }, + 'webhook-handler logs': { + stage ('webhook-handler') { + sh "${docker_compose} logs -f webhook-handler" + } + }, + 'webhooks2tasks logs': { + stage ('webhooks2tasks') { + sh "${docker_compose} logs -f webhooks2tasks" + } + }, + 'openshiftdeploy logs': { + stage ('openshiftdeploy') { + sh "${docker_compose} logs -f openshiftdeploy" + } + }, + 'openshiftremove logs': { + stage ('openshiftremove') { + sh "${docker_compose} logs -f openshiftremove" + } + }, + 'all logs': { + stage ('all') { + sh "${docker_compose} logs -f " + } + } + ) + } + } catch (e) { + echo "Something went wrong, trying to cleanup" + cleanup(docker_compose) + throw e + } + } +} + +def cleanup(docker_compose) { + try { + sh "${docker_compose} down -v" + sh "./minishift/minishift delete" + } catch (error) { + echo "cleanup failed, ignoring this." + } +} \ No newline at end of file diff --git a/Jenkinsfile.testing-develop b/Jenkinsfile.testing-develop new file mode 100644 index 000000000..3debdde57 --- /dev/null +++ b/Jenkinsfile.testing-develop @@ -0,0 +1,16 @@ +node { + + def docker_compose = "docker run -t --rm -v \$WORKSPACE:\$WORKSPACE -v /var/run/docker.sock:/var/run/docker.sock -w \$WORKSPACE docker/compose:1.13.0" + + + stage ('Checkout') { + checkout scm + } + + ansiColor('xterm') { + stage ('run test') { + sh "${docker_compose} -f tests/docker-compose.yaml run --rm tests-develop ansible-playbook /ansible/playbooks/node.yaml" + } + } + +} \ No newline at end of file diff --git a/Jenkinsfile.testing-master b/Jenkinsfile.testing-master new file mode 100644 index 000000000..f9697eabf --- /dev/null +++ b/Jenkinsfile.testing-master @@ -0,0 +1,16 @@ +node { + + def docker_compose = "docker run -t --rm -v \$WORKSPACE:\$WORKSPACE -v /var/run/docker.sock:/var/run/docker.sock -w \$WORKSPACE docker/compose:1.13.0" + + + stage ('Checkout') { + checkout scm + } + + ansiColor('xterm') { + stage ('run test') { + sh "${docker-compose} -f tests/docker-compose.yaml run --rm tests-master ansible-playbook /ansible/playbooks/node.yaml" + } + } + +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..4fff7ccec --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# amazee.io Lagoon - where the cool microservices hang out! + +The amazee.io lagoon is the amazee.io deployment system, completely independent from any servers running. Perfect for local development, testing new features and taking over the world. + +- Schema: [https://www.lucidchart.com/documents/edit/a3cf0c4f-1bc1-438f-977d-4b26f235ceac](https://www.lucidchart.com/documents/edit/a3cf0c4f-1bc1-438f-977d-4b26f235ceac) +- Workshop Videos: [https://drive.google.com/drive/u/0/folders/0B7z7DpdobBRcY2pnS2FUVTNIVzg](https://drive.google.com/drive/u/0/folders/0B7z7DpdobBRcY2pnS2FUVTNIVzg) + +Please take into account that currently, multi-stage dockerfiles only work with [Docker CE Edge](https://docs.docker.com/edge/). + +## Start Services + +1. clone me +1. init git + + ./initGit.sh + +1. start Lagoon Services + + docker-compose up -d + +1. Follow the Services logs + + docker-compose logs -f + +## Start & Test OpenShift + +1. start OpenShift + + ./startOpenShift.sh + +1. test Openshift Node Deployment + + docker-compose exec tests ansible-playbook /ansible/playbooks/node.yaml diff --git a/TESTS.md b/TESTS.md new file mode 100644 index 000000000..cc831c90b --- /dev/null +++ b/TESTS.md @@ -0,0 +1,57 @@ +# amazee.io Lagoon testing + +Our tests are all written with Ansible and mostly follow this approach: + +1. They create a new git repository +2. Add and commit some files from a list of files (in `tests/files`) into this git repo +3. Push this git repo into a git server (either locally or on Github) +4. Send a Webhook to the Webhook Handler which is the same as a real webhook that would be sent +5. Starts to monitor the URL that the test would expect something to happen (like deploying a nodejs app that has the git branch as an HTML text) +6. Compares the result on the URL with the expected result + +Lagoon is mostly tested in 3 different ways: + +## 1. Locally + +During local development the best and easiest is to test locally. For that you need all microservices running `docker-compose up -d` and the MiniShift OpenShift running as well: `./startOpenShift.sh`. + +Now you can run tests, via ansible: + + docker-compose exec tests ansible-playbook /ansible/playbooks/node.yaml + +This would run all tests defined in `tests/playbooks/node.yaml`. If you like only to run a subset of the tests, it's best to shortly comment out the tests in these files you don't like to run. + +Sometimes you just would like to create another push webhook, without to wait for the git repo to be initialized and beeing pushed. For this case there is a small helper script `tests/playbooks/helpers/just-push.yaml` that will get the current head of the git repo and push a webhook push. It needs to know which git repo you would like to check and push: + + docker-compose exec tests ansible-playbook /ansible/playbooks/helpers/just-push.yaml -e git_repo_name=node.git + +In order to actually see what is happening inside the microservices, we can use `docker-compose logs`: + + docker-compose logs -f + +Or only for a specific service: + + docker-compose logs -f webhook-handler + +Sometimes you would like to see what is happening inside the Jenkins, it can be found here: http://localhost:8888/ (`admin`:`admin`) + +## 2. Automated integration testing + +In order to test branches and pull requests. There is an full automatic integration test running on Jenkins. It is defined inside the `Jenkinsfile` and runs automatically for every pull request that is opened. + +This Jenkins Job will start a minishift and all services inside the Jenkins and run all tests against it. + + +## 3. Real World Testing + +To make sure that our services also work in the real work (eg deployed on OpenShift with real URLs, real git repos and stuff), we also have tests for this. Currently we only deploy the `develop` and `master` branches to a real OpenShift infrastructure. + +For these tests we use the exact same ansible scripts like the local or the automated testing, we just push to an actual Github Repo https://github.com/amazeeio-ci-testing and send webhooks to the webhook-handler that are running OpenShift. + +The tests are defined in `Jenkinsfile.testing-develop` and `Jenkinsfile.testing-master`. They get their testing infrastructure (endpoints, etc.) from a docker-compose.yaml file within the `tests` folder. + +Beside of that it's exactly the same. + +The tests can be found here: +- `develop` branch: https://lagoon-ci.amazeeio.cloud/job/lagoon-test-develop/ +- `master` branch: https://lagoon-ci.amazeeio.cloud/job/lagoon-test-master/ diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 000000000..b3fed641a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,179 @@ +version: '2' +services: + webhook-handler: + build: services/webhook-handler + command: yarn run dev + ports: + - "7777:7777" + links: + - rabbitmq + environment: + - RABBITMQ_HOST=rabbitmq + volumes: + - ./services/webhook-handler/src:/app/src + rabbitmq: + build: services/rabbitmq + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + - HOSTNAME=rabbitmq + ports: + - "15672:15672" + - "5672:5672" +# gitpush2ansibledeploy: +# build: services/gitpush2ansibledeploy +# command: yarn run dev +# links: +# - rabbitmq +# - api +# - jenkins +# environment: +# - RABBITMQ_HOST=rabbitmq +# - AMAZEEIO_API_HOST=http://api:8080 +# - JENKINS_URL=http://admin:admin@jenkins:8080 +# - DOCKER_RUN_PARAM=--add-host deploytest1.compact.amazee.io:172.28.128.99 +# - ANSIBLE_IMAGE_LOCATION=absolute +# volumes: +# - ./services/gitpush2ansibledeploy/src:/app/src + openshiftremove: + build: services/openShiftRemove + command: yarn run dev + links: + - rabbitmq + - api + - jenkins + environment: + - RABBITMQ_HOST=rabbitmq + - AMAZEEIO_API_HOST=http://api:8080 + - JENKINS_URL=http://admin:admin@jenkins:8080 + volumes: + - ./services/openShiftRemove/src:/app/src + openshiftdeploy: + build: services/openShiftDeploy + command: yarn run dev + links: + - rabbitmq + - api + - jenkins + environment: + - RABBITMQ_HOST=rabbitmq + - AMAZEEIO_API_HOST=http://api:8080 + - JENKINS_URL=http://admin:admin@jenkins:8080 + - OC_BUILD_DEPLOY_IMAGE_LOCATION=absolute + - DOCKER_RUN_PARARM=--network=lagoon_default + volumes: + - ./services/openShiftDeploy/src:/app/src + logs2slack: + build: services/logs2slack + command: yarn run dev + links: + - rabbitmq + - api + - jenkins + environment: + - RABBITMQ_HOST=rabbitmq + - AMAZEEIO_API_HOST=http://api:8080 + volumes: + - ./services/logs2slack/src:/app/src + webhooks2tasks: + build: services/webhooks2tasks + command: yarn run dev + links: + - rabbitmq + - api + environment: + - RABBITMQ_HOST=rabbitmq + - AMAZEEIO_API_HOST=http://api:8080 + volumes: + - ./services/webhooks2tasks/src:/app/src + rest2tasks: + build: services/rest2tasks + command: yarn run dev + links: + - rabbitmq + environment: + - RABBITMQ_HOST=rabbitmq + volumes: + - ./services/rest2tasks/src:/app/src + ports: + - "5555:8000" + api: + build: services/api + command: yarn run dev + environment: + - GIT_REPOSITORY=file:///hiera + - GIT_BRANCH_PULL=ci-local + volumes: + - ./services/api/src:/app/src + - ./hiera:/hiera + ports: + - "8080:8080" + jenkins: + build: services/jenkins + environment: + - ADMIN_PASSWORD=admin + ports: + - "8888:8080" + jenkins-slave: + build: services/jenkins-slave + user: root + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./docker-executors/ansible-drupal-deploy:/ansible-drupal-deploy + - ./docker-executors/docker-oc-build-deploy:/docker-oc-build-deploy + links: + - jenkins + environment: + - JENKINS_MASTER_CREDENTIALS=admin:admin + - JENKINS_MASTER_URL=http://jenkins:8080 + - JENKINS_SLAVE_NAME=alpha + tests: + build: tests + links: + - webhook-handler + - git + environment: + - WEBHOOK_HOST=webhook-handler + - WEBHOOK_PORT=7777 + - WEBHOOK_PROTOCOL=http + - REST2TASKS_HOST=rest2tasks + - REST2TASKS_PORT=8000 + - REST2TASKS_PROTOCOL=http + - OPENSHIFT_ROUTE_SUFFIX=192.168.77.100.nip.io + - GIT_REPO_PREFIX=git@git:/git/ + - SSH_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\nMIIJKQIBAAKCAgEAuW/QMG+osFkc9c/kA8C5Ur7acYP+6Ue0X/pCU95IUBoi7l+E\nJNmgwq7dXyp3Y8lLo+eaHEXPDpRMawPBT32W6Z32jV31YfU5cm4YyFlB7S23PYIg\nqA7oldkxG+mVv3rCpVbVqJs32P548DwLlxFNot4+WMVULmdMvgDeMnGuFdcu8tgZ\nVDr6eakr8//D3ASXoGqHrEkrhaUFgke/PP4tLFESYmhuvrWTfmxlUpyYLW10Cb3N\nK+OWrtzy+Y8jHAKWxzgg0FCIlsguoqVthCGE1AVTvNEFRI8ppgWaWREJf9A0DxMw\nXagouF+MJsIaGp+4UCUO3TXapkS/luC++cjzcp4DYCVTU5SFzh13r6TbJB//x1Jc\nBKeFjx7k++gWU93KtUQmrZ+ojLBYsKREpPccg2xFT38SgK++3EaRSB7iXe2pg405\nO/yj9D05YjtlYgsow7nYmo8DYe15mNGamK4RyNenm00hEg7JYdGtCZWb1pWGuMQw\nSrSsHyDUa3K2JrmFM0he8J+xdaOOXB2dpLn7YqDkISzYMdC6s7UTJ90QaHht0B28\nZr/Vnzv9IR2uBXZECxKxHcxDPSUeFnsEZ4dOHXI3o19XWlim6Nl/J3WgnNAb3TQy\n/x6UoKnwpydjZauKTOj6JpL3aecE1qWcAow5dPFILbQBa0MI2KAcvVKVJg0CAwEA\nAQKCAgEAnoFv8GcRRyP0+DyqR3buMkeHCy7rrtWm3b9aALxpDWc54o3ss17+5kp4\nWQdApCAFMuYeOfqF4Y1rwLGmBF9ypuBqRi5BOGlXoHNxZZe+HZFNJxta9KxBrQzI\nyHYilVjGlnOiEAwVcbsa/yYkNg4JUaUsn86UhVGxLFwrkezQBEU6EUQcan47adDs\nDBXcge2++dT1gZPNyt/i1JilY+pUDKSD1XA08XjdyVu4RCQsg/AiFs2RWemg/HlK\ni30JYsDnxwQ4MDgWeORF0Ksc8KuCEYU4LZZxLUg+LnZtl6JTf1gll5ksZ3H81JR/\nhQW3MHjEIGV8ziNhcWwkZEBZncNiK2tNYuY6LiLJuGWLNZm+iySW6FnO8UE1wOg4\nt9n+D37A7dAbm39c92oej2uOWilbXjhuHJUFUPtgMDZJAvLxMtPliF9dFG5l8Kly\nuvYaTg1L5DuekOP8HjNuWwV3Wb21jeW0A/RUf7h/VKq/q/F3BbQE6wyxDUVofsMF\n9fwYqrrOMKIXPsnhk46i43TW2r3ygaYv2q56B2uM0mhfeHbrHjqnUwUS/l9cp8YC\ncsOsTn8AYCHe5fo1zv7Xto/C83wV6qQLwqOpWVkvaVYoGwhBFeTYHpV1/ata4UKA\nOtO6cAC/M9DrnWHKjhdmEshqni/G2niab8OkZkMZvRuBtD5r9bUCggEBAN5QRWnk\nBG8SRcPq87eul1pTSwoIDj1ya3CPxdI7YFCiwblYbg7dfsuEK+iSVRQCl4vGs1gR\nVLwyVNBYvl9AInKvH1zeBVXLKOwafz/ddPElbMkhjsKIc7ipvQ5HIY4rPaJCklol\nuhDD0315rmd62fh3B1fSZaJ8ARwRraavmpaMsZvaDLIeA7iiG7mm+YYsjI6G2HW3\nHR7V7sTBq/yIY5YJUtBjZRxi5E0hkRmX3xmy/rEaBsyFhTBBqrHzlfun1dr1nJbh\naTocMdvPb1uByy+PQ/u6V1k3asEAUDEBSDAQWGylivINObXJ7SRQD9UibsqA6J9j\nwrXLkkTINSP6JJsCggEBANWJD4T60kGZC8A5Fhz7wgBh/NNKxIY4eYkQCWSud0iW\ncZ7TChIcBj5V/WQiVt8IGc4c7cPkvhHu66ZPBChUNj0BG5xNzBkpILi3zn3x5qRB\ntiISFI6DOoHNfma05Ok9KJI2v4vS6e1BLIF34Npi0KoxOfycJVb3N4jQLBc5eZSr\nbvyD74/3BByWFNvr4sE1PpTo6Hs5WOzTXzi0qinhOPDc4TwCbr4ggiKzsQAzqU4z\nEXY37pUeH7CTHSBidCaW47m428T5VJSL3TFKwYcuE7ZkprjQT0FiLgea4/+KQ0US\nMFUM6OO/4qtKcuocDGe+Mrut3T0kCmnSosIxx3g/hncCggEAYB/TM6r8483Bzqmb\ngdOC6/JR4t+C0LzVidEQlwtHZPZKz0pWJCVPes4GckQ7dzB7uFtNFoo/2jPlCkUk\n42iGvJHN/MifA+6ZHiWC2el2dAJbnEffQ2vepXz3GuJUtvUpbCxevY3Mew1BN+LS\nLzomX1GQIj/95Bi8Hhfivsz1CZ2B+kJ49NcXgtDNLiPthj9i8wmJNLTdaYTU/cxE\nAigy7x/O5/3iLTjxQAyAgdFyDNmhWJBJWkttQGVUWidZtXtnc4p5j5+dcRvZzxJN\nMwLXCRRoL8Ltm8zjYtow0k+cl/OpWCjoACsJxfmuiOH5Ro3h27uLWce33AVOlGEA\n4TJ6ewKCAQAScrryhDDyFeTcAJKWgnGqUszi/EyqQ+rMGqSVHDWWAdljHVx7YAxy\nCj/QDN9weWSxV/J6wCJjrj6RqbX0PgJJlvTpthbx/YmkK80dOG7ytfKkUuePwGqn\nmDdZbDtyoyQELdKyo9At/Tl5HgBBHdRlP8eAuYTIVKdpnIKSpxaH75+xFTz3NSIX\nzieTMHfwtUbo2o5rRvMV0tUhMwqYf6rJtGuJIbSrnGdh1CBwogX4iZTyn7ZvD6Ex\nQiR8DcV3KAYYn43tIJVcGBFOFuVNZn+xfFSjFuwh+/d6FLmp9CoHp6ChWHIuav+M\nSOxQqYew1s/PQyAgDiMQLXB+UoqnKuXVAoIBAQCBRcSjXWseY+/Uvqj+41kKcEFL\nT7AuJcrb9fpN0EYbrTlaU1yVDfYxnRn4Pw2de1XE/S2dngvriraFHrY/fnyRqM5C\ns/1QnzAjb+y/Vvvt/RaDYXwpm8KpSrd3vqwj7TsoYgWiSvmbjYOg6Gt8QJZNmfhS\nYexGNfR/Zr8jdK9ZC6Tqwt2yUuBtVS3wWmX7Dqz3/kAfJ+tNp7CQNGw7TOMXH071\nfU/ZNna8w+9G3mxSRWM+wxIg7pPZ4floXVJGTcYl6+pG8a1saUNRwx72+pt3XUMD\nXYS+IJhFCIXCuehmfDIp7Fe8Ed2s1QDbF/vdc+icTah12SF/XhZ+6clY8j2Y\n-----END RSA PRIVATE KEY----- + volumes: + - ./tests:/ansible + git: + build: local-git-server + environment: + - GIT_AUTHORIZED_KEYS=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC5b9Awb6iwWRz1z+QDwLlSvtpxg/7pR7Rf+kJT3khQGiLuX4Qk2aDCrt1fKndjyUuj55ocRc8OlExrA8FPfZbpnfaNXfVh9TlybhjIWUHtLbc9giCoDuiV2TEb6ZW/esKlVtWomzfY/njwPAuXEU2i3j5YxVQuZ0y+AN4yca4V1y7y2BlUOvp5qSvz/8PcBJegaoesSSuFpQWCR788/i0sURJiaG6+tZN+bGVSnJgtbXQJvc0r45au3PL5jyMcApbHOCDQUIiWyC6ipW2EIYTUBVO80QVEjymmBZpZEQl/0DQPEzBdqCi4X4wmwhoan7hQJQ7dNdqmRL+W4L75yPNyngNgJVNTlIXOHXevpNskH//HUlwEp4WPHuT76BZT3cq1RCatn6iMsFiwpESk9xyDbEVPfxKAr77cRpFIHuJd7amDjTk7/KP0PTliO2ViCyjDudiajwNh7XmY0ZqYrhHI16ebTSESDslh0a0JlZvWlYa4xDBKtKwfINRrcrYmuYUzSF7wn7F1o45cHZ2kuftioOQhLNgx0LqztRMn3RBoeG3QHbxmv9WfO/0hHa4FdkQLErEdzEM9JR4WewRnh04dcjejX1daWKbo2X8ndaCc0BvdNDL/HpSgqfCnJ2Nlq4pM6Pomkvdp5wTWpZwCjDl08UgttAFrQwjYoBy9UpUmDQ== ansible-testing + expose: + - "22" + elasticsearch: + build: services/elasticsearch + user: '1000' + environment: + - ES_JAVA_OPTS=-Xms200m -Xmx200m + ports: + - "9200:9200" + kibana: + build: services/kibana + links: + - elasticsearch + environment: + - ELASTICSEARCH_URL=http://elasticsearch:9200 + ports: + - "5601:5601" + logstash: + build: services/logstash + user: '1111722' + links: + - elasticsearch + - rabbitmq + environment: + - RABBITMQ_HOST=rabbitmq + - RABBITMQ_USER=guest + - RABBITMQ_PASSWORD=guest + - ELASTICSEARCH_URL=http://elasticsearch:9200 + - XPACK_MONITORING_ELASTICSEARCH_URL=http://elasticsearch:9200 \ No newline at end of file diff --git a/docker-executors/docker-oc-build-deploy/.dockerignore b/docker-executors/docker-oc-build-deploy/.dockerignore new file mode 100644 index 000000000..412c25747 --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/.dockerignore @@ -0,0 +1 @@ +docker-compose.yml \ No newline at end of file diff --git a/docker-executors/docker-oc-build-deploy/Dockerfile b/docker-executors/docker-oc-build-deploy/Dockerfile new file mode 100644 index 000000000..803a92209 --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/Dockerfile @@ -0,0 +1,20 @@ +FROM amazeeio/oc + +RUN apk add --no-cache bash git openssh docker + +RUN mkdir -p /git + +WORKDIR /git + +# Saving the upstream entrypoint in another file, so we can reuse it in our entrypoint +RUN cp /usr/sbin/container-entrypoint /usr/sbin/parent-container-entrypoint + +COPY docker-entrypoint.sh /usr/sbin/docker-entrypoint +COPY git-checkout-pull.sh /usr/sbin/git-checkout-pull +COPY build-deploy.sh /usr/sbin/build-deploy +COPY os-project.sh /usr/sbin/os-project +COPY openshift-templates /openshift-templates + +ENTRYPOINT ["docker-entrypoint"] + +CMD build-deploy \ No newline at end of file diff --git a/docker-executors/docker-oc-build-deploy/README.md b/docker-executors/docker-oc-build-deploy/README.md new file mode 100644 index 000000000..ceaa9ddce --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/README.md @@ -0,0 +1,14 @@ +# amazeeio oc-build-deploy + +## Development + +1. adapt docker-compose.yml +2. Start container and connect to bash + + docker-compose run oc-build-deploy bash + +3. Run deployment with + + build-deploy + +4. Edit scripts from outside of container, they are mounted into so you can just run the commands again \ No newline at end of file diff --git a/docker-executors/docker-oc-build-deploy/build-deploy.sh b/docker-executors/docker-oc-build-deploy/build-deploy.sh new file mode 100755 index 000000000..81712ea11 --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/build-deploy.sh @@ -0,0 +1,43 @@ +#!/bin/bash -xe + +git-checkout-pull $GIT_REPO $GIT_REF + +pushd $OPENSHIFT_FOLDER + +if [ -f .amazeeio.Dockerfile ]; then + DOCKERFILE=".amazeeio.Dockerfile" +else + DOCKERFILE="Dockerfile" +fi + +AMAZEEIO_GIT_SHA=`git rev-parse HEAD` + +docker build --build-arg AMAZEEIO_GIT_SHA=$AMAZEEIO_GIT_SHA --build-arg AMAZEEIO_GIT_BRANCH=$BRANCH -t $IMAGE -f $DOCKERFILE . + +# If the given OpenShift Template exists from within the Git Repo +if [ -f ".amazeeio.app.yml" ]; then + OPENSHIFT_TEMPLATE=".amazeeio.app.yml" +# If the given OpenShift Template exists, in our template folder, we use that, if not we assume it's an URL to download from +elif [ -f "/openshift-templates/${OPENSHIFT_TEMPLATE}" ]; then + OPENSHIFT_TEMPLATE="/openshift-templates/${OPENSHIFT_TEMPLATE}" +fi + +OPENSHIFT_PROJECT=`os-project ${SITEGROUP}-${BRANCH}` + +oc project --insecure-skip-tls-verify $OPENSHIFT_PROJECT || oc new-project --insecure-skip-tls-verify $OPENSHIFT_PROJECT --display-name="${SITEGROUP} / ${BRANCH}" + +oc process --insecure-skip-tls-verify \ + -n ${OPENSHIFT_PROJECT} \ + -f ${OPENSHIFT_TEMPLATE} \ + -v TAG=${TAG} \ + -v NAME=${NAME} \ + -v SHORT_NAME=${SHORT_NAME} \ + -v SITEGROUP=${SITEGROUP} \ + -v ROUTER_URL=${OPENSHIFT_ROUTER_URL} \ + | oc apply --insecure-skip-tls-verify -n ${OPENSHIFT_PROJECT} -f - + +docker tag ${IMAGE} ${OPENSHIFT_REGISTRY}/${OPENSHIFT_PROJECT}/${SITEGROUP}:${TAG} +docker login -u=jenkins -p="${OPENSHIFT_TOKEN}" ${OPENSHIFT_REGISTRY} + +for i in {1..2}; do docker push ${OPENSHIFT_REGISTRY}/${OPENSHIFT_PROJECT}/${SITEGROUP}:${TAG} && break || sleep 5; done + diff --git a/docker-executors/docker-oc-build-deploy/docker-compose.yml b/docker-executors/docker-oc-build-deploy/docker-compose.yml new file mode 100644 index 000000000..e14513b05 --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/docker-compose.yml @@ -0,0 +1,12 @@ +version: '2' +services: + oc-build-deploy: + build: . + volumes: + - ./docker-entrypoint.sh:/usr/sbin/docker-entrypoint + - ./git-checkout-pull.sh:/usr/sbin/git-checkout-pull + - ./build-deploy.sh:/usr/sbin/build-deploy + environment: + - SSH_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\nMIIJKQIBAAKCAgEAuW/QMG+osFkc9c/kA8C5Ur7acYP+6Ue0X/pCU95IUBoi7l+E\nJNmgwq7dXyp3Y8lLo+eaHEXPDpRMawPBT32W6Z32jV31YfU5cm4YyFlB7S23PYIg\nqA7oldkxG+mVv3rCpVbVqJs32P548DwLlxFNot4+WMVULmdMvgDeMnGuFdcu8tgZ\nVDr6eakr8//D3ASXoGqHrEkrhaUFgke/PP4tLFESYmhuvrWTfmxlUpyYLW10Cb3N\nK+OWrtzy+Y8jHAKWxzgg0FCIlsguoqVthCGE1AVTvNEFRI8ppgWaWREJf9A0DxMw\nXagouF+MJsIaGp+4UCUO3TXapkS/luC++cjzcp4DYCVTU5SFzh13r6TbJB//x1Jc\nBKeFjx7k++gWU93KtUQmrZ+ojLBYsKREpPccg2xFT38SgK++3EaRSB7iXe2pg405\nO/yj9D05YjtlYgsow7nYmo8DYe15mNGamK4RyNenm00hEg7JYdGtCZWb1pWGuMQw\nSrSsHyDUa3K2JrmFM0he8J+xdaOOXB2dpLn7YqDkISzYMdC6s7UTJ90QaHht0B28\nZr/Vnzv9IR2uBXZECxKxHcxDPSUeFnsEZ4dOHXI3o19XWlim6Nl/J3WgnNAb3TQy\n/x6UoKnwpydjZauKTOj6JpL3aecE1qWcAow5dPFILbQBa0MI2KAcvVKVJg0CAwEA\nAQKCAgEAnoFv8GcRRyP0+DyqR3buMkeHCy7rrtWm3b9aALxpDWc54o3ss17+5kp4\nWQdApCAFMuYeOfqF4Y1rwLGmBF9ypuBqRi5BOGlXoHNxZZe+HZFNJxta9KxBrQzI\nyHYilVjGlnOiEAwVcbsa/yYkNg4JUaUsn86UhVGxLFwrkezQBEU6EUQcan47adDs\nDBXcge2++dT1gZPNyt/i1JilY+pUDKSD1XA08XjdyVu4RCQsg/AiFs2RWemg/HlK\ni30JYsDnxwQ4MDgWeORF0Ksc8KuCEYU4LZZxLUg+LnZtl6JTf1gll5ksZ3H81JR/\nhQW3MHjEIGV8ziNhcWwkZEBZncNiK2tNYuY6LiLJuGWLNZm+iySW6FnO8UE1wOg4\nt9n+D37A7dAbm39c92oej2uOWilbXjhuHJUFUPtgMDZJAvLxMtPliF9dFG5l8Kly\nuvYaTg1L5DuekOP8HjNuWwV3Wb21jeW0A/RUf7h/VKq/q/F3BbQE6wyxDUVofsMF\n9fwYqrrOMKIXPsnhk46i43TW2r3ygaYv2q56B2uM0mhfeHbrHjqnUwUS/l9cp8YC\ncsOsTn8AYCHe5fo1zv7Xto/C83wV6qQLwqOpWVkvaVYoGwhBFeTYHpV1/ata4UKA\nOtO6cAC/M9DrnWHKjhdmEshqni/G2niab8OkZkMZvRuBtD5r9bUCggEBAN5QRWnk\nBG8SRcPq87eul1pTSwoIDj1ya3CPxdI7YFCiwblYbg7dfsuEK+iSVRQCl4vGs1gR\nVLwyVNBYvl9AInKvH1zeBVXLKOwafz/ddPElbMkhjsKIc7ipvQ5HIY4rPaJCklol\nuhDD0315rmd62fh3B1fSZaJ8ARwRraavmpaMsZvaDLIeA7iiG7mm+YYsjI6G2HW3\nHR7V7sTBq/yIY5YJUtBjZRxi5E0hkRmX3xmy/rEaBsyFhTBBqrHzlfun1dr1nJbh\naTocMdvPb1uByy+PQ/u6V1k3asEAUDEBSDAQWGylivINObXJ7SRQD9UibsqA6J9j\nwrXLkkTINSP6JJsCggEBANWJD4T60kGZC8A5Fhz7wgBh/NNKxIY4eYkQCWSud0iW\ncZ7TChIcBj5V/WQiVt8IGc4c7cPkvhHu66ZPBChUNj0BG5xNzBkpILi3zn3x5qRB\ntiISFI6DOoHNfma05Ok9KJI2v4vS6e1BLIF34Npi0KoxOfycJVb3N4jQLBc5eZSr\nbvyD74/3BByWFNvr4sE1PpTo6Hs5WOzTXzi0qinhOPDc4TwCbr4ggiKzsQAzqU4z\nEXY37pUeH7CTHSBidCaW47m428T5VJSL3TFKwYcuE7ZkprjQT0FiLgea4/+KQ0US\nMFUM6OO/4qtKcuocDGe+Mrut3T0kCmnSosIxx3g/hncCggEAYB/TM6r8483Bzqmb\ngdOC6/JR4t+C0LzVidEQlwtHZPZKz0pWJCVPes4GckQ7dzB7uFtNFoo/2jPlCkUk\n42iGvJHN/MifA+6ZHiWC2el2dAJbnEffQ2vepXz3GuJUtvUpbCxevY3Mew1BN+LS\nLzomX1GQIj/95Bi8Hhfivsz1CZ2B+kJ49NcXgtDNLiPthj9i8wmJNLTdaYTU/cxE\nAigy7x/O5/3iLTjxQAyAgdFyDNmhWJBJWkttQGVUWidZtXtnc4p5j5+dcRvZzxJN\nMwLXCRRoL8Ltm8zjYtow0k+cl/OpWCjoACsJxfmuiOH5Ro3h27uLWce33AVOlGEA\n4TJ6ewKCAQAScrryhDDyFeTcAJKWgnGqUszi/EyqQ+rMGqSVHDWWAdljHVx7YAxy\nCj/QDN9weWSxV/J6wCJjrj6RqbX0PgJJlvTpthbx/YmkK80dOG7ytfKkUuePwGqn\nmDdZbDtyoyQELdKyo9At/Tl5HgBBHdRlP8eAuYTIVKdpnIKSpxaH75+xFTz3NSIX\nzieTMHfwtUbo2o5rRvMV0tUhMwqYf6rJtGuJIbSrnGdh1CBwogX4iZTyn7ZvD6Ex\nQiR8DcV3KAYYn43tIJVcGBFOFuVNZn+xfFSjFuwh+/d6FLmp9CoHp6ChWHIuav+M\nSOxQqYew1s/PQyAgDiMQLXB+UoqnKuXVAoIBAQCBRcSjXWseY+/Uvqj+41kKcEFL\nT7AuJcrb9fpN0EYbrTlaU1yVDfYxnRn4Pw2de1XE/S2dngvriraFHrY/fnyRqM5C\ns/1QnzAjb+y/Vvvt/RaDYXwpm8KpSrd3vqwj7TsoYgWiSvmbjYOg6Gt8QJZNmfhS\nYexGNfR/Zr8jdK9ZC6Tqwt2yUuBtVS3wWmX7Dqz3/kAfJ+tNp7CQNGw7TOMXH071\nfU/ZNna8w+9G3mxSRWM+wxIg7pPZ4floXVJGTcYl6+pG8a1saUNRwx72+pt3XUMD\nXYS+IJhFCIXCuehmfDIp7Fe8Ed2s1QDbF/vdc+icTah12SF/XhZ+6clY8j2Y\n-----END RSA PRIVATE KEY----- + - GIT_REPO=git@github.com:amazeeio/deploytest-repo.git + - GIT_SHA=a7789dc5e6960bb2250ae39d7e7145b632c44c77 diff --git a/docker-executors/docker-oc-build-deploy/docker-entrypoint.sh b/docker-executors/docker-oc-build-deploy/docker-entrypoint.sh new file mode 100755 index 000000000..c1d55062b --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/docker-entrypoint.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + + mkdir -p ~/.ssh + +if [ ! -z "$SSH_PRIVATE_KEY" ]; then + echo -e "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa + chmod 400 ~/.ssh/id_rsa + + eval $(ssh-agent) > /dev/null + ssh-add ~/.ssh/id_rsa +fi + +echo -e "Host * \n StrictHostKeyChecking no" > ~/.ssh/config + +exec "/usr/sbin/parent-container-entrypoint" "$@" diff --git a/docker-executors/docker-oc-build-deploy/git-checkout-pull.sh b/docker-executors/docker-oc-build-deploy/git-checkout-pull.sh new file mode 100755 index 000000000..ae2035332 --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/git-checkout-pull.sh @@ -0,0 +1,15 @@ +#!/bin/bash -ex + +# REF: can be a: +# a sha: a7789dc5e6960bb2250ae39d7e7145b632c44c77 +# a tag: 1.0.0 +# or a branch, prefixed by 'origin/': origin/branch2 + +REMOTE=$1 +REF=$2 + +git rev-parse --is-inside-work-tree || git init . +git config remote.origin.url $REMOTE +git fetch --depth=10 --tags --progress $REMOTE +refs/heads/*:refs/remotes/origin/* + +git checkout --force "${REF}" diff --git a/docker-executors/docker-oc-build-deploy/openshift-templates/node.yml b/docker-executors/docker-oc-build-deploy/openshift-templates/node.yml new file mode 100644 index 000000000..31e181f14 --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/openshift-templates/node.yml @@ -0,0 +1,102 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeio-openshift-template-node +parameters: + - name: TAG + description: Which docker image tag should be deployed + required: true + - name: NAME + description: Name of the objects to create + required: true + - name: SHORT_NAME + description: Shorter name of the objects to create, can be max 24 chars + required: true + - name: SITEGROUP + description: Which sitegroup this belongs to + required: true + - name: ROUTER_URL + description: URL of the Router + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ' ' + name: nodejs + ports: + - containerPort: 3000 + protocol: TCP + readinessProbe: + tcpSocket: + port: 3000 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + requests: + cpu: 100m + memory: 100Mi + test: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - nodejs + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} + type: ImageChange + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: 3000-tcp + port: 3000 + protocol: TCP + targetPort: 3000 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + host: ${ROUTER_URL} + port: + targetPort: 3000-tcp + to: + kind: Service + name: ${SHORT_NAME} \ No newline at end of file diff --git a/docker-executors/docker-oc-build-deploy/os-project.sh b/docker-executors/docker-oc-build-deploy/os-project.sh new file mode 100755 index 000000000..50046a159 --- /dev/null +++ b/docker-executors/docker-oc-build-deploy/os-project.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# take $1 and make it match the following. +# Invalid value: "BLAH": must match the regex [a-z0-9]([-a-z0-9]*[a-z0-9])? (e.g. 'my-name' or '123-abc') + +p=$1 +p=`tr '[:upper:]' '[:lower:]' <<<"$p"` +p=`echo $p |sed 's/[^0-9a-z-]/-/g'` + +echo $p diff --git a/hiera/README.md b/hiera/README.md new file mode 100644 index 000000000..a7742509c --- /dev/null +++ b/hiera/README.md @@ -0,0 +1,7 @@ +# Amazee Labs + +This repository holds the Hiera Data for Amazee. It is used as a +Git Submodule in the main VSHN Hiera Data. + +bump +bump \ No newline at end of file diff --git a/hiera/amazeeio/clients.yaml b/hiera/amazeeio/clients.yaml new file mode 100644 index 000000000..29c613ff1 --- /dev/null +++ b/hiera/amazeeio/clients.yaml @@ -0,0 +1,4 @@ +--- +amazeeio_clients: + deploytestclient: + deploy_private_key: '-----BEGIN RSA PRIVATE KEY-----\nMIIJKQIBAAKCAgEAuW/QMG+osFkc9c/kA8C5Ur7acYP+6Ue0X/pCU95IUBoi7l+E\nJNmgwq7dXyp3Y8lLo+eaHEXPDpRMawPBT32W6Z32jV31YfU5cm4YyFlB7S23PYIg\nqA7oldkxG+mVv3rCpVbVqJs32P548DwLlxFNot4+WMVULmdMvgDeMnGuFdcu8tgZ\nVDr6eakr8//D3ASXoGqHrEkrhaUFgke/PP4tLFESYmhuvrWTfmxlUpyYLW10Cb3N\nK+OWrtzy+Y8jHAKWxzgg0FCIlsguoqVthCGE1AVTvNEFRI8ppgWaWREJf9A0DxMw\nXagouF+MJsIaGp+4UCUO3TXapkS/luC++cjzcp4DYCVTU5SFzh13r6TbJB//x1Jc\nBKeFjx7k++gWU93KtUQmrZ+ojLBYsKREpPccg2xFT38SgK++3EaRSB7iXe2pg405\nO/yj9D05YjtlYgsow7nYmo8DYe15mNGamK4RyNenm00hEg7JYdGtCZWb1pWGuMQw\nSrSsHyDUa3K2JrmFM0he8J+xdaOOXB2dpLn7YqDkISzYMdC6s7UTJ90QaHht0B28\nZr/Vnzv9IR2uBXZECxKxHcxDPSUeFnsEZ4dOHXI3o19XWlim6Nl/J3WgnNAb3TQy\n/x6UoKnwpydjZauKTOj6JpL3aecE1qWcAow5dPFILbQBa0MI2KAcvVKVJg0CAwEA\nAQKCAgEAnoFv8GcRRyP0+DyqR3buMkeHCy7rrtWm3b9aALxpDWc54o3ss17+5kp4\nWQdApCAFMuYeOfqF4Y1rwLGmBF9ypuBqRi5BOGlXoHNxZZe+HZFNJxta9KxBrQzI\nyHYilVjGlnOiEAwVcbsa/yYkNg4JUaUsn86UhVGxLFwrkezQBEU6EUQcan47adDs\nDBXcge2++dT1gZPNyt/i1JilY+pUDKSD1XA08XjdyVu4RCQsg/AiFs2RWemg/HlK\ni30JYsDnxwQ4MDgWeORF0Ksc8KuCEYU4LZZxLUg+LnZtl6JTf1gll5ksZ3H81JR/\nhQW3MHjEIGV8ziNhcWwkZEBZncNiK2tNYuY6LiLJuGWLNZm+iySW6FnO8UE1wOg4\nt9n+D37A7dAbm39c92oej2uOWilbXjhuHJUFUPtgMDZJAvLxMtPliF9dFG5l8Kly\nuvYaTg1L5DuekOP8HjNuWwV3Wb21jeW0A/RUf7h/VKq/q/F3BbQE6wyxDUVofsMF\n9fwYqrrOMKIXPsnhk46i43TW2r3ygaYv2q56B2uM0mhfeHbrHjqnUwUS/l9cp8YC\ncsOsTn8AYCHe5fo1zv7Xto/C83wV6qQLwqOpWVkvaVYoGwhBFeTYHpV1/ata4UKA\nOtO6cAC/M9DrnWHKjhdmEshqni/G2niab8OkZkMZvRuBtD5r9bUCggEBAN5QRWnk\nBG8SRcPq87eul1pTSwoIDj1ya3CPxdI7YFCiwblYbg7dfsuEK+iSVRQCl4vGs1gR\nVLwyVNBYvl9AInKvH1zeBVXLKOwafz/ddPElbMkhjsKIc7ipvQ5HIY4rPaJCklol\nuhDD0315rmd62fh3B1fSZaJ8ARwRraavmpaMsZvaDLIeA7iiG7mm+YYsjI6G2HW3\nHR7V7sTBq/yIY5YJUtBjZRxi5E0hkRmX3xmy/rEaBsyFhTBBqrHzlfun1dr1nJbh\naTocMdvPb1uByy+PQ/u6V1k3asEAUDEBSDAQWGylivINObXJ7SRQD9UibsqA6J9j\nwrXLkkTINSP6JJsCggEBANWJD4T60kGZC8A5Fhz7wgBh/NNKxIY4eYkQCWSud0iW\ncZ7TChIcBj5V/WQiVt8IGc4c7cPkvhHu66ZPBChUNj0BG5xNzBkpILi3zn3x5qRB\ntiISFI6DOoHNfma05Ok9KJI2v4vS6e1BLIF34Npi0KoxOfycJVb3N4jQLBc5eZSr\nbvyD74/3BByWFNvr4sE1PpTo6Hs5WOzTXzi0qinhOPDc4TwCbr4ggiKzsQAzqU4z\nEXY37pUeH7CTHSBidCaW47m428T5VJSL3TFKwYcuE7ZkprjQT0FiLgea4/+KQ0US\nMFUM6OO/4qtKcuocDGe+Mrut3T0kCmnSosIxx3g/hncCggEAYB/TM6r8483Bzqmb\ngdOC6/JR4t+C0LzVidEQlwtHZPZKz0pWJCVPes4GckQ7dzB7uFtNFoo/2jPlCkUk\n42iGvJHN/MifA+6ZHiWC2el2dAJbnEffQ2vepXz3GuJUtvUpbCxevY3Mew1BN+LS\nLzomX1GQIj/95Bi8Hhfivsz1CZ2B+kJ49NcXgtDNLiPthj9i8wmJNLTdaYTU/cxE\nAigy7x/O5/3iLTjxQAyAgdFyDNmhWJBJWkttQGVUWidZtXtnc4p5j5+dcRvZzxJN\nMwLXCRRoL8Ltm8zjYtow0k+cl/OpWCjoACsJxfmuiOH5Ro3h27uLWce33AVOlGEA\n4TJ6ewKCAQAScrryhDDyFeTcAJKWgnGqUszi/EyqQ+rMGqSVHDWWAdljHVx7YAxy\nCj/QDN9weWSxV/J6wCJjrj6RqbX0PgJJlvTpthbx/YmkK80dOG7ytfKkUuePwGqn\nmDdZbDtyoyQELdKyo9At/Tl5HgBBHdRlP8eAuYTIVKdpnIKSpxaH75+xFTz3NSIX\nzieTMHfwtUbo2o5rRvMV0tUhMwqYf6rJtGuJIbSrnGdh1CBwogX4iZTyn7ZvD6Ex\nQiR8DcV3KAYYn43tIJVcGBFOFuVNZn+xfFSjFuwh+/d6FLmp9CoHp6ChWHIuav+M\nSOxQqYew1s/PQyAgDiMQLXB+UoqnKuXVAoIBAQCBRcSjXWseY+/Uvqj+41kKcEFL\nT7AuJcrb9fpN0EYbrTlaU1yVDfYxnRn4Pw2de1XE/S2dngvriraFHrY/fnyRqM5C\ns/1QnzAjb+y/Vvvt/RaDYXwpm8KpSrd3vqwj7TsoYgWiSvmbjYOg6Gt8QJZNmfhS\nYexGNfR/Zr8jdK9ZC6Tqwt2yUuBtVS3wWmX7Dqz3/kAfJ+tNp7CQNGw7TOMXH071\nfU/ZNna8w+9G3mxSRWM+wxIg7pPZ4floXVJGTcYl6+pG8a1saUNRwx72+pt3XUMD\nXYS+IJhFCIXCuehmfDIp7Fe8Ed2s1QDbF/vdc+icTah12SF/XhZ+6clY8j2Y\n-----END RSA PRIVATE KEY-----' diff --git a/hiera/amazeeio/sitegroups.yaml b/hiera/amazeeio/sitegroups.yaml new file mode 100644 index 000000000..f625fa022 --- /dev/null +++ b/hiera/amazeeio/sitegroups.yaml @@ -0,0 +1,72 @@ +--- +amazeeio_sitegroups: + ci-node_subfolder1: + client: deploytestclient + git_url: 'git@git:/git/node_subfolder.git' + slack: + webhook: https://hooks.slack.com/services/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 + channel: amazeeio-testing + openshift: + console: https://192.168.77.100:8443/ + registry: docker-registry-default.192.168.77.100.nip.io:443 + username: developer + password: developer + project: myproject + template: node.yml + router_pattern: ${sitegroup}.${branch}.192.168.77.100.nip.io + folder: subfolder + active_systems: + deploy: lagoon_openshift + remove: lagoon_openshift + ci-node1: + client: deploytestclient + git_url: 'git@git:/git/node.git' + slack: + webhook: https://hooks.slack.com/services/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 + channel: amazeeio-testing + openshift: + console: https://192.168.77.100:8443/ + registry: docker-registry-default.192.168.77.100.nip.io:443 + username: developer + password: developer + project: myproject + template: node.yml + router_pattern: ${sitegroup}.${branch}.192.168.77.100.nip.io + active_systems: + deploy: lagoon_openshift + remove: lagoon_openshift + ci-node_subfolder2: + client: deploytestclient + git_url: 'git@git:/git/node_subfolder.git' + slack: + webhook: https://hooks.slack.com/services/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 + channel: amazeeio-testing + openshift: + console: https://192.168.77.100:8443/ + registry: docker-registry-default.192.168.77.100.nip.io:443 + username: developer + password: developer + project: myproject + template: node.yml + router_pattern: ${sitegroup}.${branch}.192.168.77.100.nip.io + folder: subfolder + active_systems: + deploy: lagoon_openshift + remove: lagoon_openshift + ci-node2: + client: deploytestclient + git_url: 'git@git:/git/node.git' + slack: + webhook: https://hooks.slack.com/services/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 + channel: amazeeio-testing + openshift: + console: https://192.168.77.100:8443/ + registry: docker-registry-default.192.168.77.100.nip.io:443 + username: developer + password: developer + project: myproject + template: node.yml + router_pattern: ${sitegroup}.${branch}.192.168.77.100.nip.io + active_systems: + deploy: lagoon_openshift + remove: lagoon_openshift \ No newline at end of file diff --git a/hiera/compact/deploytest1.yaml b/hiera/compact/deploytest1.yaml new file mode 100644 index 000000000..180546366 --- /dev/null +++ b/hiera/compact/deploytest1.yaml @@ -0,0 +1,62 @@ +--- + +# Drupal Sites Definitions +drupalsites: + deploytest_branch1: + site_branch: branch1 + site_environment: development + domains: + - deploytest + sslcerttype: selfsigned + fpm_profile: small + uid: 3201 + cron: + type: cron + minute: '15' + sitegroup: deploytest + +classes: + - drupalhosting::tools::custom_crons + - drupalhosting::profiles::ssh_api_auth + +# Do not change parameters below this line +nginx::config::names_hash_bucket_size: 1024 + +stack_environment: + VARNISH_SECRET: '9171ca0b-00ee-4429-988b-8d2ae10c98e4' + +drupalhosting::profiles::varnish_cache::varnish_version: '4' +drupalhosting::profiles::nginx_backend::mssql: true + +resolv_conf::nameservers: + - 74.121.192.67 + - 74.121.197.78 + - 2605:9f00:0:1e::5 + +filebeat::prospectors: + 'nginx': + paths: + - '/var/log/nginx/10fe-*.log' + - '/var/log/nginx/ssl-10fe-*.log' + - '/var/log/nginx/01fe-*.log' + log_type: 'logstash-nginx' + 'watchdog': + paths: + - '/var/log/amazeeio/watchdog.log' + log_type: 'watchdog' + 'healthcheck': + paths: + - '/var/log/amazeeio/healthcheck.log' + log_type: 'healthcheck' + 'maillog': + paths: + - '/var/log/mail.log' + log_type: 'syslog' + 'syslog': + paths: + - '/var/log/syslog' + log_type: 'syslog' + 'php_maillog': + paths: + - '/var/www/*/logs/mail.log' + log_type: 'php_maillog' diff --git a/initGit.sh b/initGit.sh new file mode 100755 index 000000000..a640cbaa6 --- /dev/null +++ b/initGit.sh @@ -0,0 +1,23 @@ +#!/bin/bash +mkdir -p services +mkdir -p node-helpers +mkdir -p docker-executors + +git clone -b develop git@github.com:amazeeio/api.git services/api +git clone -b develop git@github.com:amazeeio/elasticsearch.git services/elasticsearch +git clone -b develop git@github.com:amazeeio/jenkins.git services/jenkins +git clone -b develop git@github.com:amazeeio/jenkins-slave.git services/jenkins-slave +git clone -b develop git@github.com:amazeeio/kibana.git services/kibana +git clone -b develop git@github.com:amazeeio/logs2slack.git services/logs2slack +git clone -b develop git@github.com:amazeeio/logstash.git services/logstash +git clone -b develop git@github.com:amazeeio/openshiftdeploy.git services/openShiftDeploy +git clone -b develop git@github.com:amazeeio/openshiftremove.git services/openShiftRemove +git clone -b develop git@github.com:amazeeio/rabbitmq.git services/rabbitmq +git clone -b develop git@github.com:amazeeio/webhook-handler.git services/webhook-handler +git clone -b develop git@github.com:amazeeio/webhooks2tasks.git services/webhooks2tasks +git clone -b develop git@github.com:amazeeio/rest2tasks.git services/rest2tasks + +git clone -b develop git@github.com:amazeeio/local-git-server.git local-git-server +git clone -b ci-local git@github.com:amazeeio/api-test-hiera.git hiera + +git clone -b develop git@github.com:amazeeio/docker-oc-build-deploy.git docker-executors/docker-oc-build-deploy \ No newline at end of file diff --git a/local-git-server/Dockerfile b/local-git-server/Dockerfile new file mode 100644 index 000000000..87afe189c --- /dev/null +++ b/local-git-server/Dockerfile @@ -0,0 +1,22 @@ +FROM unixtastic/git-ssh-server + +USER git + +RUN mkdir /git/.ssh && \ + chmod -R 700 /git/.ssh && \ + touch /git/.ssh/authorized_keys && \ + chmod 600 /git/.ssh/authorized_keys && \ + touch /git/.hushlogin && \ + mkdir /git/repo.git && \ + cd /git/repo.git && \ + git --bare init && \ + mkdir /git/node_subfolder.git && \ + cd /git/node_subfolder.git && \ + git --bare init && \ + mkdir /git/node.git && \ + cd /git/node.git && \ + git --bare init + +USER root + +COPY authorized-keys.sh /etc/my_init.d/authorized-keys.sh diff --git a/local-git-server/authorized-keys.sh b/local-git-server/authorized-keys.sh new file mode 100755 index 000000000..2018d26fd --- /dev/null +++ b/local-git-server/authorized-keys.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e + +if [ ! -z "$GIT_AUTHORIZED_KEYS" ]; then + echo -e "$GIT_AUTHORIZED_KEYS" > /git/.ssh/authorized_keys +fi + +exec "$@" diff --git a/services/api/.amazeeio.app.yml b/services/api/.amazeeio.app.yml new file mode 100644 index 000000000..a2d605834 --- /dev/null +++ b/services/api/.amazeeio.app.yml @@ -0,0 +1,151 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeio-openshift-template-node +parameters: + - name: TAG + description: Which docker image tag should be deployed + required: true + - name: NAME + description: Name of the objects to create + required: true + - name: SHORT_NAME + description: Shorter name of the objects to create, can be max 24 chars + required: true + - name: SITEGROUP + description: Which sitegroup this belongs to + required: true + - name: ROUTER_URL + description: URL of the Router + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ' ' + name: api + env: + - name: GIT_REPOSITORY + value: https://git.vshn.net/amazee/amazee_hieradata.git + - name: GIT_USERNAME + value: michael.schmid + - name: GIT_PASSWORD + value: 4ahjnuCiMKb98nmJtr3AVNR + ports: + - containerPort: 3000 + protocol: TCP + readinessProbe: + tcpSocket: + port: 3000 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + requests: + cpu: 100m + memory: 100Mi + - image: ' ' + name: api-testhiera + env: + - name: GIT_REPOSITORY + value: https://github.com/amazeeio/api-test-hiera.git + - name: GIT_USERNAME + value: 3dfc013c579f85bbcd4cd0c5d11cda325a086ec8 + - name: GIT_PASSWORD + value: x-oauth-basic + - name: PORT + value: '3001' + ports: + - containerPort: 3001 + protocol: TCP + readinessProbe: + tcpSocket: + port: 3001 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + requests: + cpu: 100m + memory: 100Mi + test: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - api + - api-testhiera + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} + type: ImageChange + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: 3000-tcp + port: 3000 + protocol: TCP + targetPort: 3000 + - name: 3001-tcp + port: 3001 + protocol: TCP + targetPort: 3001 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + host: ${ROUTER_URL} + port: + targetPort: 3000-tcp + to: + kind: Service + name: ${SHORT_NAME} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME}-testhiera + spec: + host: testhiera-${ROUTER_URL} + port: + targetPort: 3001-tcp + to: + kind: Service + name: ${SHORT_NAME} \ No newline at end of file diff --git a/services/api/.babelrc b/services/api/.babelrc new file mode 100644 index 000000000..eaf32387b --- /dev/null +++ b/services/api/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015", "stage-0"] +} diff --git a/services/api/.dockerignore b/services/api/.dockerignore new file mode 100644 index 000000000..93ea3f6f0 --- /dev/null +++ b/services/api/.dockerignore @@ -0,0 +1,5 @@ +.openshift/* +.yarn* +node_modules/* +Jenkinsfile +.dockerignore \ No newline at end of file diff --git a/services/api/.env.defaults b/services/api/.env.defaults new file mode 100644 index 000000000..aaeaf14e5 --- /dev/null +++ b/services/api/.env.defaults @@ -0,0 +1,11 @@ +// The port at which the application can be reached. +PORT=3000 + +GIT_PUSH_ENABLE="false" + +GIT_BRANCH_PULL="master" +GIT_BRANCH_PUSH="api" + +SYNC_INTERVAL=5000 + +GIT_REPOSITORY="" \ No newline at end of file diff --git a/services/api/.env.example b/services/api/.env.example new file mode 100644 index 000000000..eb3348418 --- /dev/null +++ b/services/api/.env.example @@ -0,0 +1,9 @@ +// Copy this file to '.env' to specify environment specific configuration. + +// GIT USERNAME and PASSWORD, for Github use: +// GIT_PASSWORD="x-oauth-basic" +// and your access token for GIT_USERNAME, see: https://help.github.com/articles/creating-an-access-token-for-command-line-use/ +GIT_USERNAME="" +GIT_PASSWORD="" + +GIT_REPOSITORY="https://github.com/amazeeio/api-test-hiera.git" \ No newline at end of file diff --git a/services/api/.eslintignore b/services/api/.eslintignore new file mode 100644 index 000000000..c499ab432 --- /dev/null +++ b/services/api/.eslintignore @@ -0,0 +1,3 @@ +node_modules/ +dist/ +logs/ diff --git a/services/api/.eslintrc b/services/api/.eslintrc new file mode 100644 index 000000000..cc544b7cd --- /dev/null +++ b/services/api/.eslintrc @@ -0,0 +1,8 @@ +{ + "parser": "babel-eslint", + "extends": "airbnb/base", + "globals": { + "debug": true, + "repository": true, + } +} diff --git a/services/api/.gitignore b/services/api/.gitignore new file mode 100644 index 000000000..b8ef60a09 --- /dev/null +++ b/services/api/.gitignore @@ -0,0 +1,6 @@ +/.env +/.repository +/dist +/logs +node_modules +npm-debug.log diff --git a/services/api/.nvmrc b/services/api/.nvmrc new file mode 100644 index 000000000..798e38995 --- /dev/null +++ b/services/api/.nvmrc @@ -0,0 +1 @@ +6.3.0 diff --git a/services/api/.openshift/.kubeconfig b/services/api/.openshift/.kubeconfig new file mode 100644 index 000000000..a79c97f77 --- /dev/null +++ b/services/api/.openshift/.kubeconfig @@ -0,0 +1,17 @@ +apiVersion: v1 +clusters: +- cluster: + server: https://console.appuio.ch:443 + name: appuio +contexts: +- context: + cluster: appuio + user: system:serviceaccount:amze-amazeeio:jenkins + name: appuio:amze-amazeeio:jenkins +current-context: appuio:amze-amazeeio:jenkins +kind: Config +preferences: {} +users: +- name: system:serviceaccount:amze-amazeeio:jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg diff --git a/services/api/.openshift/README.md b/services/api/.openshift/README.md new file mode 100644 index 000000000..6a67200e6 --- /dev/null +++ b/services/api/.openshift/README.md @@ -0,0 +1,53 @@ +# OpenShift + +## Jenkins Access to Openshift + +In order for Jenkins to deploy to openshift we need to create an openshift serviceaccount that has access to our project (regular username/password logins expire after a couple of hours, not very good for a CI/CD system) + +1. Login as your user + + oc login + +2. Create new serviceaccount with the name jenkins + + oc create serviceaccount jenkins + +3. Give this serviceaccount edit access (see the name of the serviceaccount contains the project name!) + + oc policy add-role-to-user edit system:serviceaccount:appuio-demo2:jenkins2 + +4. Get access token from serviceaccount, with first getting the name of the token and then accessing the secret + + oc describe serviceaccount jenkins2 + + oc describe secret jenkins2-token-7tawv + +5. Add the token inside the .kubeconfig: + + + apiVersion: v1 + clusters: + - cluster: + server: https://console.appuio.ch:443 + name: appuio + contexts: + - context: + cluster: appuio + user: jenkins + name: appuio:jenkins + current-context: appuio:jenkins + kind: Config + preferences: {} + users: + - name: jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLXJhcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJqZW5raW5zLXRva2VuLTFocW42Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImplbmtpbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZmM4ZTIzMi05ZDBhLTExZTYtYTdlZi1mYTE2M2VkOTVkYWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YW16ZS1yYXM6amVua2lucyJ9.BAeU6zXl0uPCD2DRGJeV1oxRbk3sA3M5tn7K6xPh5iv-etS8Q2lsF-OFwO7HVycvEckXh31KNUmQTzvn3keSDT0a8BqViBhGPKCfAw-vf3ElUnGFDCWN9IpITKJBWIxVdGyd5sPltBWkAVxl9JOwnu1vrBvSioYqwjzYkjStbfp7pzLXhSld9G4AXA_zBntDW633mujllT0z_5IMSJX_gKSZcrTN78KLdCMmuvIT_m7xZMp_r52daEu67DjsjYtVqVx4BsDVPdUZRQ9eJtodbtZ-FJV9w0W4H9nX3iyqCk7OriD4Xt68Z5cUK0tR-4hyyh_hL31c6vzGb_VosmAWWg + + +6. Test the kubeconfig - should return `system:serviceaccount:appuio-demo2:jenkins2` + + KUBECONFIG=.openshift/.kubeconfig oc whoami + +7. Create a Docker authentication config.json so Jenkins can push into the Openshift docker Registry + + DOCKER_CONFIG=.openshift/ docker login -u jenkins2 -p $(KUBECONFIG=.openshift/.kubeconfig oc whoami -t) registry.appuio.ch \ No newline at end of file diff --git a/services/api/.openshift/config.json b/services/api/.openshift/config.json new file mode 100644 index 000000000..a526a5d46 --- /dev/null +++ b/services/api/.openshift/config.json @@ -0,0 +1,7 @@ +{ + "auths": { + "registry.appuio.ch": { + "auth": "amVua2luczI6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoYlhwbExXRnRZWHBsWldsdklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltcGxibXRwYm5NdGRHOXJaVzR0TjJGcU5tOGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lhbVZ1YTJsdWN5SXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqRmlOelZoWXpkakxXTTJOV010TVRGbE5pMWlOelUxTFdaaE1UWXpaVE5sWXpjellTSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBoYlhwbExXRnRZWHBsWldsdk9tcGxibXRwYm5NaWZRLkRUSlpDd3BFWFlnenlaSmtDZHF6a0dHc0hWQWhNc0J0OGFtcmkydGZQYl9mOTZrZWxHOWFnVXBudzdZRmcweWkybEdGcjhTU1lMOEd2dXhuNHcwMXZXdHNMc2JhMjg5cFJNOUhiXzFJU2F0U1NWNTM5TXdQR2dpN2ZVN3F6Yk00ZzJpVmIxaW1sQkhJbW9tSkNXVzJDSW41aEF5VUR4Snd5OVh2Y0hyajZUYjE0X0c2YnVLT3JpR0JaejZ4Qmk5WWpOanh5eTlZem5WOVhkU1Z4THNXQjdFaG5yUnhveElFaWVPV0RaUHF1am9tSUFYczZ0TzdhcGFnNE1kZFl6LTVYdTg2Vm15SjZkS05KZUt2RUh0V1hUM081SUVqMEhmdlZGSnlKRTFKR3BfLVhnTzg4Ujh0WF9yOWYySU9PLXpyMU9OODVubUpjTDlGTGRLaFE4Z3dRZw==" + } + } +} \ No newline at end of file diff --git a/services/api/.openshift/development.app.yml b/services/api/.openshift/development.app.yml new file mode 100644 index 000000000..d0e644cbb --- /dev/null +++ b/services/api/.openshift/development.app.yml @@ -0,0 +1,203 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: GIT_REPOSITORY + value: https://git.vshn.net/amazee/amazee_hieradata.git + - name: GIT_USERNAME + value: michael.schmid + - name: GIT_PASSWORD + value: 4ahjnuCiMKb98nmJtr3AVNR + - name: GIT_BRANCH_PULL + value: master + - name: SYNC_INTERVAL + value: '5000' + - name: PORT + value: '8080' + - name: NODE_ENV + value: development + ports: + - containerPort: 8080 + protocol: TCP + readinessProbe: + httpGet: + path: /status + port: 8080 + initialDelaySeconds: 3 + timeoutSeconds: 1 + livenessProbe: + httpGet: + path: /status + port: 8080 + initialDelaySeconds: 60 + timeoutSeconds: 3 + failureThreshold: 5 + resources: + limits: + cpu: 200m + memory: 500Mi + requests: + cpu: 200m + memory: 200Mi + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH}-testhiera + env: + - name: GIT_REPOSITORY + value: https://github.com/amazeeio/api-test-hiera.git + - name: GIT_USERNAME + value: 3dfc013c579f85bbcd4cd0c5d11cda325a086ec8 + - name: GIT_PASSWORD + value: x-oauth-basic + - name: GIT_BRANCH_PULL + value: master + - name: SYNC_INTERVAL + value: '5000' + - name: PORT + value: '8081' + - name: NODE_ENV + value: development + ports: + - containerPort: 8081 + protocol: TCP + readinessProbe: + httpGet: + path: /status + port: 8081 + initialDelaySeconds: 3 + timeoutSeconds: 1 + livenessProbe: + httpGet: + path: /status + port: 8081 + initialDelaySeconds: 60 + timeoutSeconds: 3 + failureThreshold: 5 + resources: + limits: + cpu: 200m + memory: 500Mi + requests: + cpu: 200m + memory: 200Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH}-testhiera + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + ports: + - name: 8080-tcp + port: 80 + protocol: TCP + targetPort: 8080 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH}-testhiera + spec: + ports: + - name: 8081-tcp + port: 80 + protocol: TCP + targetPort: 8081 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + host: ${AMAZEEIO_SERVICE}-${BRANCH}.appuio.amazeeio.review + port: + targetPort: 8080-tcp + to: + kind: Service + name: ${AMAZEEIO_SERVICE}-${BRANCH} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH}-testhiera + spec: + host: ${AMAZEEIO_SERVICE}-${BRANCH}-testhiera.appuio.amazeeio.review + port: + targetPort: 8081-tcp + to: + kind: Service + name: ${AMAZEEIO_SERVICE}-${BRANCH}-testhiera diff --git a/services/api/.openshift/production.app.yml b/services/api/.openshift/production.app.yml new file mode 100644 index 000000000..874ca2432 --- /dev/null +++ b/services/api/.openshift/production.app.yml @@ -0,0 +1,120 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 2 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: GIT_REPOSITORY + value: https://git.vshn.net/amazee/amazee_hieradata.git + - name: GIT_USERNAME + value: michael.schmid + - name: GIT_PASSWORD + value: 4ahjnuCiMKb98nmJtr3AVNR + - name: GIT_BRANCH_PULL + value: master + - name: SYNC_INTERVAL + value: '5000' + - name: PORT + value: '8080' + ports: + - containerPort: 8080 + protocol: TCP + readinessProbe: + httpGet: + path: /status + port: 8080 + initialDelaySeconds: 3 + timeoutSeconds: 1 + livenessProbe: + httpGet: + path: /status + port: 8080 + initialDelaySeconds: 60 + timeoutSeconds: 3 + failureThreshold: 5 + resources: + limits: + memory: 750Mi + requests: + memory: 200Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + ports: + - name: 8080-tcp + port: 80 + protocol: TCP + targetPort: 8080 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +## ## No route for production right now, until https://ticket.vshn.net/browse/AMZE-329 is figured out +##- apiVersion: v1 +## kind: Route +## metadata: +## creationTimestamp: null +## labels: +## app: ${AMAZEEIO_SERVICE}-${BRANCH} +## name: ${AMAZEEIO_SERVICE}-${BRANCH} +## spec: +## host: api.amazeeio.cloud +## port: +## targetPort: 8080-tcp +## to: +## kind: Service +## name: ${AMAZEEIO_SERVICE}-${BRANCH} diff --git a/services/api/Dockerfile b/services/api/Dockerfile new file mode 100644 index 000000000..52b1d3c0e --- /dev/null +++ b/services/api/Dockerfile @@ -0,0 +1,15 @@ +FROM amazeeio/centos7-node-builder:6 as builder +ENV NODE_ENV production +COPY package.json yarn.lock /app/ +RUN BUILD_ONLY=true yarn install --pure-lockfile && yarn cache clean + +FROM amazeeio/centos7-node:6 +ENV NODE_ENV production +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +RUN yarn run build + +RUN fix-permissions /app/ + +CMD ["yarn", "start"] diff --git a/services/api/Jenkinsfile b/services/api/Jenkinsfile new file mode 100644 index 000000000..fdbe72bc4 --- /dev/null +++ b/services/api/Jenkinsfile @@ -0,0 +1,148 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.OPENSHIFT_APP_YAML = "development.app.yml" + env.AMAZEEIO_SERVICE = "api" + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.AMAZEEIO_SERVICE}/detail" + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + // on master we are using another openshift yaml + if (env.BRANCH == "master") { + env.OPENSHIFT_APP_YAML = "production.app.yml" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + stage ('tests') { + // Running Tests in parallel, for faster completion + parallel ( + //test_unit: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-unit" + // } catch (e) { + // error(e, 'unit test') + // } + //}, + // test_http: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-http-ssr" + // } catch (e) { + // error(e, 'http test') + // } + // }, + //test_lint: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-lint" + // } catch (e) { + // error(e, 'lint') + // } + //} + ) + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh "docker run --rm -v $WORKSPACE/.openshift:/tmp -w /tmp/ -e KUBECONFIG=.kubeconfig michelesr/oc sh -c 'oc process -n ${env.OPENSHIFT_PROJECT} -f ${env.OPENSHIFT_APP_YAML} -v BRANCH=${env.BRANCH} -v AMAZEEIO_SERVICE=${env.AMAZEEIO_SERVICE} -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT}| oc apply -n ${env.OPENSHIFT_PROJECT} -f -'" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.AMAZEEIO_SERVICE}-registry") { + try { + sh "docker tag ${env.IMAGE} registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.openshift docker push registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: 'https://console.appuio.ch:443', authToken: OPENSHIFT_TOKEN, depCfg: "${env.AMAZEEIO_SERVICE}-${env.BRANCH}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + + stage ('cleanup Docker Images') { + cleanupImage() + } + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> failed* \nStep: ${step} " + sendslack('danger', message) + cleanupImage() + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-api', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} + +def cleanupImage() { + try { + sh "docker rmi -f ${env.IMAGE}" + } catch (e) { + echo "Removal of Docker image '${env.IMAGE}' failed, ignoring this." + } +} diff --git a/services/api/README.md b/services/api/README.md new file mode 100644 index 000000000..a371bb600 --- /dev/null +++ b/services/api/README.md @@ -0,0 +1,83 @@ +# amazee.io API + +The amazee.io API for the amazee.io infrastructure. + +Hosted with Docker on OpenShift. + +### URLs + +#### develop branch: + +- http://api-develop.appuio.amazeeio.review/ - uses the production hiera (https://git.vshn.net/amazee/amazee_hieradata branch master) +- http://api-develop-testhiera.appuio.amazeeio.review/ - uses the testhiera (https://github.com/amazeeio/api-test-hiera branch master) + +#### master branch + +- https://api.amazeeio.cloud + +## Local development with Docker + +As the api is hosted within Docker, we can also use Docker for development. +This means there is no need to have node, yarn or any other dependency locally installed, all you need is docker and docker-compose. + +### Installation + +There is nothing to install. + +### Usage + +Run + + docker-compose up + +and this will build the Docker image (takes a bit) and start the api in development mode (`yarn run dev`). + +If you like to run the server in production mode: + + docker-compose run --rm --service-ports api yarn run start + +Unfortunately this does not give a lot of flexibility. So you might just open a bash to the Docker Container and run yarn commands directly: + + docker-compose run --rm --service-ports api bash + +Now you are inside the Docker container and can run any commands like: + + yarn run build + yarn run start + +#### Remarks + +Only the `/src` folder and `package.json`, `yarn.lock` folders are mounted from the host into the docker containers. We do that so that changes in your IDE are immediately available within the docker container and do not need a rebuild or restart of such. But we cannot mount the `node_modules` folder as some of the dependencies need to be built on the operating system directly. As the container is running centos linux and your host probably is different, we need to build them on the host directly. So if you change something with the dependencies you need to either rebuild the image via `docker-compose build api` or just connect to the container and run `yarn install` (you need to do that though every time you reconnect again, until you build a new image). + +Also the `.env` file is only checked when you actually run `docker-compose build`, so the best is to just edit the `environment:` key in docker-compose.yaml, which will create real environment variables and will be also recreated every time you use `docker-compose run` + +## Local Development without Docker (node and yarn installed on your machine) + +### Installation + +In order to run or work with this project you need to first install all Node +Packages via the Node Package Manager (NPM). Make sure that you have both, Node +and NPM installed. I highly recommend using Node Version Manager (NVM). + +To install the NPM packages required for this project, run `yarn install` in the +project directory. + +Additionally, you need to copy the *.env.example* file to *.env* and edit it +according to your environment. + +If you are using OSX, you will probably need to install `libgcrypt` and +`openssl` via `brew`: + +``` +brew install libgcrypt +brew install openssl +``` + +### Running the server + +To run the server in development mode, simply run `yarn run dev` in the project +directory. + +To run the server in production mode, you first need to build the project by +running `yarn run build`. Now, you can start the server by running `yarn run +start`. diff --git a/services/api/docker-compose.yaml b/services/api/docker-compose.yaml new file mode 100644 index 000000000..b5275150c --- /dev/null +++ b/services/api/docker-compose.yaml @@ -0,0 +1,36 @@ +version: '2' +services: + api: + build: . + command: yarn run dev + environment: + - GIT_REPOSITORY=https://github.com/amazeeio/api-test-hiera.git + - GIT_BRANCH_PULL=master + - GIT_USERNAME=3dfc013c579f85bbcd4cd0c5d11cda325a086ec8 + - GIT_PASSWORD=x-oauth-basic + - SYNC_INTERVAL=10000 + volumes: + # These files and folders already exists within the docker image, but we mount it again + # so there is no rebuild necessary when we just change with them. + - ./src:/app/src + - ./package.json:/app/package.json + - ./yarn.lock:/app/yarn.lock + ports: + - "8080:8080" + api-prodhiera: + build: . + command: yarn run dev + environment: + - GIT_REPOSITORY=https://git.vshn.net/amazee/amazee_hieradata.git + - GIT_BRANCH_PULL=master + - GIT_USERNAME=michael.schmid + - GIT_PASSWORD=4ahjnuCiMKb98nmJtr3AVNR + - SYNC_INTERVAL=10000 + volumes: + # These files and folders already exists within the docker image, but we mount it again + # so there is no rebuild necessary when we just change with them. + - ./src:/app/src + - ./package.json:/app/package.json + - ./yarn.lock:/app/yarn.lock + ports: + - "8888:8080" \ No newline at end of file diff --git a/services/api/package.json b/services/api/package.json new file mode 100644 index 000000000..7f9b4f1c0 --- /dev/null +++ b/services/api/package.json @@ -0,0 +1,57 @@ +{ + "name": "amazee-io-api", + "version": "1.0.0", + "description": "Low-level REST API for managing the AmazeeIO infrastructure.", + "main": "index.js", + "scripts": { + "clean": "rimraf dist && rimraf logs && rimraf .repository", + "dev": "npm run clean && NODE_ENV=development nodemon --exec 'node -r dotenv-extended/config -r babel-core/register' -- src/index.js", + "start": "node -r dotenv-extended/config dist/index.js", + "build": "babel src --out-dir=dist", + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "npm run eslint ./" + }, + "author": "Sebastian Siemssen ", + "license": "UNLICENSED", + "engines": { + "node": "6.3.0", + "npm": "3.10.3" + }, + "dependencies": { + "babel-cli": "^6.5.1", + "babel-core": "^6.5.1", + "babel-eslint": "^6.1.2", + "babel-preset-es2015": "^6.5.0", + "babel-preset-stage-0": "^6.5.0", + "bluebird": "^3.3.1", + "body-parser": "^1.15.0", + "compression": "^1.6.1", + "cors": "^2.7.1", + "dotenv": "^2.0.0", + "dotenv-extended": "^1.0.1", + "dotenv-safe": "^2.2.0", + "express": "^4.13.4", + "express-graphql": "^0.5.1", + "glob": "^7.0.3", + "graphql": "^0.6.1", + "graphql-relay": "^0.4.0", + "js-yaml": "^3.5.3", + "morgan": "^1.6.1", + "nodegit": "^0.14.1", + "winston": "^2.1.1" + }, + "devDependencies": { + "babel-cli": "^6.5.1", + "babel-core": "^6.5.1", + "babel-preset-es2015": "^6.5.0", + "babel-preset-stage-0": "^6.5.0", + "eslint": "^3.1.0", + "eslint-config-airbnb": "^9.0.1", + "eslint-plugin-import": "^1.11.0", + "istanbul": "^0.4.2", + "mocha": "^2.4.5", + "nodemon": "^1.8.1", + "rimraf": "^2.5.2", + "sinon": "^1.17.3" + } +} diff --git a/services/api/src/app.js b/services/api/src/app.js new file mode 100644 index 000000000..9fd9b46b8 --- /dev/null +++ b/services/api/src/app.js @@ -0,0 +1,37 @@ +import express from 'express'; +import morgan from 'morgan'; +import compression from 'compression'; +import bodyParser from 'body-parser'; +import logger from './logger'; +import routes from './routes'; + +export default (repository) => { + const app = express(); + + // Use compression (gzip) for responses. + app.use(compression()); + + // Automatically decode json. + app.use(bodyParser.json()); + + // Add custom configured logger (morgan through winston). + app.use(morgan('combined', { + stream: { + write: (message) => logger.info(message), + }, + })); + + // Add routes. + app.use('/', routes); + + // Respond with 404 to any routes not matching API endpoints. + app.all('/*', (request, response) => response.status(404).json({ + status: 'error', + message: `No endpoint exists at ${request.originalUrl} (method: ${request.method})`, + })); + + // Store the repository as a global. + app.set('repository', repository); + + return app; +}; diff --git a/services/api/src/index.js b/services/api/src/index.js new file mode 100644 index 000000000..31aa06f74 --- /dev/null +++ b/services/api/src/index.js @@ -0,0 +1,21 @@ +import 'babel-polyfill'; +import ensureRepository from './utility/ensureRepository'; +import server from './server'; +import sync from './sync'; + +(async () => { + try { + debug('Starting to boot the application.'); + + // Wait for the repository to be initialized. + global.repository = await ensureRepository(process.env.GIT_REPOSITORY, process.env.GIT_BRANCH_PULL, '.repository'); + + await sync(repository); + await server(repository); + + debug('Finished booting the application.'); + } catch (error) { + // Failed loading the repository or initialization. + debug(error); + } +})(); diff --git a/services/api/src/logger.js b/services/api/src/logger.js new file mode 100644 index 000000000..148b4065d --- /dev/null +++ b/services/api/src/logger.js @@ -0,0 +1,41 @@ +import winston from 'winston'; +import path from 'path'; +import fs from 'fs'; + +// Create the logs directory if it doesn't exist yet. +const directory = path.join('.', 'logs'); +if (!fs.existsSync(directory)) { + fs.mkdirSync(directory); +} + +const logger = new winston.Logger({ + exitOnError: false, + transports: [ + new winston.transports.File({ + level: 'info', + filename: path.join(directory, 'info.log'), + name: 'info-file', + }), + new winston.transports.File({ + level: 'error', + filename: path.join(directory, 'error.log'), + name: 'error-file', + }), + new winston.transports.Console({ + level: 'debug', + handleExceptions: true, + json: false, + colorize: true, + }), + ], +}); + +if (typeof global.debug === 'undefined') { + global.debug = (message) => { + if (process.env.NODE_ENV === 'development') { + logger.debug(message); + } + }; +} + +export default logger; diff --git a/services/api/src/queue.js b/services/api/src/queue.js new file mode 100644 index 000000000..06b877c45 --- /dev/null +++ b/services/api/src/queue.js @@ -0,0 +1,38 @@ +import Promise from 'bluebird'; + +const queue = []; +let processing = false; + +const process = () => { + if (processing || queue.length === 0) { + return null; + } + + // Ensure that only one item is processed at a time. + processing = true; + + // Pick the oldest item from the queue and process it. + const [action, args, resolve] = queue.shift(); + const output = action(...args); + + Promise.resolve(output) + .then(resolve) + .finally(() => { processing = false; }) + .finally(process); + + return output; +}; + +const enqueue = (action, ...args) => { + const promise = new Promise((resolve) => { + queue.push([action, args, resolve]); + }); + + // Try to process the item immediately (e.g. in case of an empty queue). + process(); + + // Returns the action itself for nicer chainability. + return promise; +}; + +export default enqueue; diff --git a/services/api/src/routes/client/fetch.js b/services/api/src/routes/client/fetch.js new file mode 100644 index 000000000..bf2c10e61 --- /dev/null +++ b/services/api/src/routes/client/fetch.js @@ -0,0 +1,34 @@ +import { graphql } from 'graphql'; +import { toGlobalId } from 'graphql-relay'; +import schema from '../../schema'; + +export default async (request, response) => { + try { + const id = toGlobalId('Client', request.params.client); + const query = `query { + client:clientById(id: "${id}") { + fullJson, + } + }`; + + const result = await graphql(schema, query); + if (result.data.client !== null) { + response.json({ + status: 'success', + data: result.data.client.fullJson, + }); + } else { + response.status(404).json({ + status: 'fail', + message: 'The requested client does not exist.', + }); + } + } catch (error) { + response.status(500).json({ + status: 'error', + message: 'Error while attempting to fetch the client.', + }); + + throw error; + } +}; diff --git a/services/api/src/routes/client/fetchAll.js b/services/api/src/routes/client/fetchAll.js new file mode 100644 index 000000000..80ee560c4 --- /dev/null +++ b/services/api/src/routes/client/fetchAll.js @@ -0,0 +1,41 @@ +import { graphql } from 'graphql'; +import schema from '../../schema'; + +export default async (request, response) => { + const query = `query { + viewer { + clients:allClients { + edges { + node { + clientName + fullJson + } + } + } + } + }`; + + try { + const result = await graphql(schema, query); + + // @todo Replace this with .reduce(). + const clients = {}; + for (const { node: client } of result.data.viewer.clients.edges) { + clients[client.clientName] = client.fullJson; + } + + response.json({ + status: 'success', + data: { + clients, + }, + }); + } catch (error) { + response.status(500).json({ + status: 'error', + message: 'Error while attempting to fetch clients.', + }); + + throw error; + } +}; diff --git a/services/api/src/routes/client/index.js b/services/api/src/routes/client/index.js new file mode 100644 index 000000000..4f4b0b0ca --- /dev/null +++ b/services/api/src/routes/client/index.js @@ -0,0 +1,12 @@ +import express from 'express'; +const router = new express.Router(); + +const clientPattern = '[a-z0-9\-_]+'; // eslint-disable-line no-useless-escape + +import clientController from './fetch'; +router.get(`/:client(${clientPattern})`, clientController); + +import allClientsController from './fetchAll'; +router.get('/', allClientsController); + +export default router; diff --git a/services/api/src/routes/generic/index.js b/services/api/src/routes/generic/index.js new file mode 100644 index 000000000..3f0c8a104 --- /dev/null +++ b/services/api/src/routes/generic/index.js @@ -0,0 +1,11 @@ +import express from 'express'; +const router = new express.Router(); + +// Load route controllers into the router. +import statusController from './status'; +router.get('/status', statusController); + +// Redirect GET requests on "/" to the status route. +router.get('/', (request, response) => response.redirect('/status')); + +export default router; diff --git a/services/api/src/routes/generic/status.js b/services/api/src/routes/generic/status.js new file mode 100644 index 000000000..b796f7cd8 --- /dev/null +++ b/services/api/src/routes/generic/status.js @@ -0,0 +1,11 @@ +export default (request, response) => { + debug('Fetching status.'); + + // TODO Add logic to fetch the status. + const status = {}; + + response.json({ + status: 'success', + data: status, + }); +}; diff --git a/services/api/src/routes/index.js b/services/api/src/routes/index.js new file mode 100644 index 000000000..ee0dfc57c --- /dev/null +++ b/services/api/src/routes/index.js @@ -0,0 +1,27 @@ +import express from 'express'; +import graphQL from 'express-graphql'; +import schema from '../schema'; + +const router = new express.Router(); + +// Add the GraphQL server. +router.use('/graphql', graphQL({ + graphiql: process.env.NODE_ENV === 'development', + pretty: true, + schema, +})); + +// Load route middlewares into the main router. +import genericRouter from './generic'; +router.use('/', genericRouter); + +import siteRouter from './site'; +router.use('/site', siteRouter); + +import siteGroupRouter from './sitegroup'; +router.use('/sitegroup', siteGroupRouter); + +import clientRouter from './client'; +router.use('/client', clientRouter); + +export default router; diff --git a/services/api/src/routes/site/create.js b/services/api/src/routes/site/create.js new file mode 100644 index 000000000..3c26f8f7f --- /dev/null +++ b/services/api/src/routes/site/create.js @@ -0,0 +1,51 @@ +import { graphql } from 'graphql'; +import enqueue from '../../queue'; +import escapeInput from '../../utility/escapeInput'; +import schema from '../../schema'; + +export default (request, response) => enqueue(async () => { + try { + const siteHost = request.params.siteHost; + const siteName = typeof request.body.name === 'string' && request.body.name; + const fullJson = typeof request.body.definition === 'object' && request.body.definition; + if (!siteName || !fullJson) { + throw new Error('Site name or definition is missing or not valid.'); + } + + const query = `mutation { + createSite( + input: { + siteName: "${escapeInput(siteName)}" + siteHost: "${escapeInput(siteHost)}" + fullJson: "${escapeInput(fullJson)}" + clientMutationId: "" + } + ) { + site { + id + } + } + }`; + + const result = await graphql(schema, query); + + if (!result.hasOwnProperty('errors')) { + response.status(200).json({ + status: 'success', + message: `Site ${siteName} has been created at the ${siteHost} server.`, + }); + } else { + response.status(500).json({ + status: 'error', + message: `Error while attempting to create the site: ${result.errors[0].message}`, + }); + } + } catch (error) { + response.status(500).json({ + status: 'error', + message: `Error while attempting to create the site: ${error.message}`, + }); + + throw error; + } +}); diff --git a/services/api/src/routes/site/fetch.js b/services/api/src/routes/site/fetch.js new file mode 100644 index 000000000..da9aaf8db --- /dev/null +++ b/services/api/src/routes/site/fetch.js @@ -0,0 +1,40 @@ +import { graphql } from 'graphql'; +import { toGlobalId } from 'graphql-relay'; +import schema from '../../schema'; + +export default async (request, response) => { + try { + const siteName = request.params.siteName; + const siteHost = request.params.siteHost; + const id = toGlobalId('Site', `${siteHost}/${siteName}`); + const query = `query { + site:siteById(id: "${id}") { + fullJson, + } + }`; + + const result = await graphql(schema, query); + if (result.data.site !== null) { + return response.json({ + status: 'success', + data: { + [siteHost]: { + [siteName]: result.data.site.fullJson, + }, + }, + }); + } + + return response.status(404).json({ + status: 'fail', + message: 'The requested site does not exist.', + }); + } catch (error) { + response.status(500).json({ + status: 'error', + message: 'Error while attempting to fetch the site.', + }); + + throw error; + } +}; diff --git a/services/api/src/routes/site/index.js b/services/api/src/routes/site/index.js new file mode 100644 index 000000000..284dd8a62 --- /dev/null +++ b/services/api/src/routes/site/index.js @@ -0,0 +1,18 @@ +import express from 'express'; +const router = new express.Router(); + +// Regex patterns for validating route paramters. +const siteHostPattern = '[a-z0-9\-_]+\.[a-z0-9\-_]+'; // eslint-disable-line no-useless-escape +const siteNamePattern = '[a-z0-9\-_]+'; // eslint-disable-line no-useless-escape + +// Load route controllers into the router. +import fetchController from './fetch'; +router.get(`/:siteHost(${siteHostPattern})/:siteName(${siteNamePattern})`, fetchController); + +import createController from './create'; +router.post(`/:siteHost(${siteHostPattern})`, createController); + +import updateController from './update'; +router.put(`/:siteHost(${siteHostPattern})/:siteName(${siteNamePattern})`, updateController); + +export default router; diff --git a/services/api/src/routes/site/update.js b/services/api/src/routes/site/update.js new file mode 100644 index 000000000..863d9a77e --- /dev/null +++ b/services/api/src/routes/site/update.js @@ -0,0 +1,51 @@ +import { graphql } from 'graphql'; +import enqueue from '../../queue'; +import escapeInput from '../../utility/escapeInput'; +import schema from '../../schema'; + +export default (request, response) => enqueue(async () => { + try { + const siteHost = request.params.siteHost; + const siteName = request.params.siteName; + const fullJson = typeof request.body.definition === 'object' && request.body.definition; + if (!fullJson) { + throw new Error('Site definition is missing or not valid.'); + } + + const query = `mutation { + updateSite( + input: { + siteName: "${escapeInput(siteName)}" + siteHost: "${escapeInput(siteHost)}" + fullJson: "${escapeInput(fullJson)}" + clientMutationId: "" + } + ) { + site { + id + } + } + }`; + + const result = await graphql(schema, query); + + if (!result.hasOwnProperty('errors')) { + response.status(200).json({ + status: 'success', + message: `Site ${siteName} has been updated at the ${siteHost} server.`, + }); + } else { + response.status(500).json({ + status: 'error', + message: `Error while attempting to update the site: ${result.errors[0].message}`, + }); + } + } catch (error) { + response.status(500).json({ + status: 'error', + message: `Error while attempting to update the site: ${error.message}`, + }); + + throw error; + } +}); diff --git a/services/api/src/routes/sitegroup/create.js b/services/api/src/routes/sitegroup/create.js new file mode 100644 index 000000000..530e5fcdc --- /dev/null +++ b/services/api/src/routes/sitegroup/create.js @@ -0,0 +1,58 @@ +import enqueue from '../../queue'; +import { graphql } from 'graphql'; +import schema from '../../schema'; +import escapeInput from '../../utility/escapeInput'; + +export default (request, response) => enqueue(async () => { + if ( + !request.body.hasOwnProperty('name') || + typeof request.body.name !== 'string' || + !request.body.name.match(/[a-z0-9\-_]+/) + ) { + throw new Error('Sitegroup name is missing or not valid.'); + } + + const siteGroupName = request.body.name; + if (!request.body.hasOwnProperty('definition') || typeof request.body.definition !== 'object') { + throw new Error('Sitegroup definition is missing or not valid.'); + } + + const fullJson = request.body.definition; + + try { + const query = `mutation { + createSiteGroup( + input: { + siteGroupName: "${escapeInput(siteGroupName)}" + fullJson: "${escapeInput(fullJson)}" + clientMutationId: "" + } + ) { + siteGroup { + id + } + } + }`; + + const result = await graphql(schema, query); + + if (!result.hasOwnProperty('errors')) { + response.status(200).json({ + status: 'success', + message: `Sitegroup ${siteGroupName} has been created.`, + }); + } else { + response.status(500).json({ + status: 'error', + message: `Error while attempting to create the sitegroup: ${result.errors[0].message}`, + }); + } + } catch (error) { + response.status(500).json({ + status: 'error', + message: 'Error while attempting to create the sitegroup.', + }); + + throw error; + } +}); diff --git a/services/api/src/routes/sitegroup/fetch.js b/services/api/src/routes/sitegroup/fetch.js new file mode 100644 index 000000000..25b216503 --- /dev/null +++ b/services/api/src/routes/sitegroup/fetch.js @@ -0,0 +1,72 @@ +import { graphql } from 'graphql'; +import { toGlobalId } from 'graphql-relay'; +import schema from '../../schema'; + +export default async (request, response) => { // eslint-disable-line consistent-return + try { + const id = toGlobalId('SiteGroup', request.params.siteGroup); + const query = `query { + siteGroup:siteGroupById(id: "${id}") { + siteGroupName, + client { + clientName, + fullJson, + }, + sites { + edges { + node { + siteName, + serverIdentifier, + serverInfrastructure, + fullJson, + } + } + }, + fullJson, + } + }`; + + const result = await graphql(schema, query); + if (result.data.siteGroup !== null) { + // @todo Replace with .reduce(). + const sites = {}; + + for (const { node: site } of result.data.siteGroup.sites.edges) { + if (!sites.hasOwnProperty(site.siteHost)) { + sites[site.siteHost] = {}; + } + + sites[site.siteHost][site.siteName] = site.fullJson; + } + + const data = { + sites, + ...result.data.siteGroup.fullJson, + }; + + if (result.data.siteGroup.client !== null) { + data.client = { + clientName: result.data.siteGroup.client.clientName, + ...result.data.siteGroup.client.fullJson, + }; + } + + response.json({ + status: 'success', + data, + }); + } else { + return response.status(404).json({ + status: 'fail', + message: 'The requested sitegroup does not exist.', + }); + } + } catch (error) { + response.status(500).json({ + status: 'error', + message: 'Error while attempting to fetch the sitegroup.', + }); + + throw error; + } +}; diff --git a/services/api/src/routes/sitegroup/index.js b/services/api/src/routes/sitegroup/index.js new file mode 100644 index 000000000..978aeaeb1 --- /dev/null +++ b/services/api/src/routes/sitegroup/index.js @@ -0,0 +1,15 @@ +import express from 'express'; +const router = new express.Router(); + +const siteGroupPattern = '[a-z0-9\-_]+'; // eslint-disable-line no-useless-escape + +import fetchController from './fetch'; +router.get(`/:siteGroup(${siteGroupPattern})`, fetchController); + +import createController from './create'; +router.post('/', createController); + +import updateController from './update'; +router.put(`/:siteGroup(${siteGroupPattern})`, updateController); + +export default router; diff --git a/services/api/src/routes/sitegroup/update.js b/services/api/src/routes/sitegroup/update.js new file mode 100644 index 000000000..ee498f4fc --- /dev/null +++ b/services/api/src/routes/sitegroup/update.js @@ -0,0 +1,51 @@ +import enqueue from '../../queue'; +import { graphql } from 'graphql'; +import schema from '../../schema'; +import escapeInput from '../../utility/escapeInput'; + +export default (request, response) => enqueue(async () => { + const siteGroupName = request.params.siteGroup; + + if (!request.body.hasOwnProperty('definition') || typeof request.body.definition !== 'object') { + throw new Error('Sitegroup definition is missing or not valid.'); + } + + const fullJson = request.body.definition; + + try { + const query = `mutation { + updateSiteGroup( + input: { + siteGroupName: "${escapeInput(siteGroupName)}" + fullJson: "${escapeInput(fullJson)}" + clientMutationId: "" + } + ) { + siteGroup { + id + } + } + }`; + + const result = await graphql(schema, query); + + if (!result.hasOwnProperty('errors')) { + response.status(200).json({ + status: 'success', + message: `Sitegroup ${siteGroupName} has been updated.`, + }); + } else { + response.status(404).json({ + status: 'error', + message: `Error while attempting to update the sitegroup: ${result.errors[0].message}`, + }); + } + } catch (error) { + response.status(500).json({ + status: 'error', + message: 'Error while attempting to update the sitegroup.', + }); + + throw error; + } +}); diff --git a/services/api/src/schema/index.js b/services/api/src/schema/index.js new file mode 100644 index 000000000..ccc39417c --- /dev/null +++ b/services/api/src/schema/index.js @@ -0,0 +1,70 @@ +import { + GraphQLSchema, + GraphQLObjectType, +} from 'graphql'; + +import { nodeField } from './node'; + +import { + siteByIdField, + allSitesField, +} from './queries/site'; + +import { + siteGroupByIdField, + siteGroupByNameField, + siteGroupByGitUrlField, + allSiteGroupsField, +} from './queries/sitegroup'; + +import { + clientByIdField, + allClientsField, +} from './queries/client'; + +import { + createSiteMutation, + updateSiteMutation, +} from './mutations/site'; + +import { + createSiteGroupMutation, + updateSiteGroupMutation, +} from './mutations/sitegroup'; + +const viewerField = { + resolve: () => true, + type: new GraphQLObjectType({ + name: 'Viewer', + fields: () => ({ + allSites: allSitesField, + allSiteGroups: allSiteGroupsField, + allClients: allClientsField, + }), + }), +}; + +export default new GraphQLSchema({ + query: new GraphQLObjectType({ + name: 'QueryRoot', + fields: () => ({ + node: nodeField, + viewer: viewerField, + siteById: siteByIdField, + siteGroupById: siteGroupByIdField, + siteGroupByName: siteGroupByNameField, + siteGroupByGitUrl: siteGroupByGitUrlField, + clientById: clientByIdField, + allSiteGroups: allSiteGroupsField, + }), + }), + mutation: new GraphQLObjectType({ + name: 'MutationRoot', + fields: () => ({ + createSite: createSiteMutation, + updateSite: updateSiteMutation, + createSiteGroup: createSiteGroupMutation, + updateSiteGroup: updateSiteGroupMutation, + }), + }), +}); diff --git a/services/api/src/schema/models/client.js b/services/api/src/schema/models/client.js new file mode 100644 index 000000000..b82c988d7 --- /dev/null +++ b/services/api/src/schema/models/client.js @@ -0,0 +1,31 @@ +import { readFile } from '../../utility/yamlStorage'; + +export default class Client { + constructor(clientName, fullJson) { + this.id = clientName; + this.clientName = clientName; + this.fullJson = fullJson; + this.deployPrivateKey = fullJson.deploy_private_key; + this.created = fullJson.created; + this.comment = fullJson.comment; + } +} + +export const getAllClients = async () => { + const fileName = 'amazeeio/clients.yaml'; + + const clients = []; + const yaml = await readFile(fileName); + if (yaml.hasOwnProperty('amazeeio_clients')) { + Object.keys(yaml.amazeeio_clients).forEach((clientName) => { + if (yaml.amazeeio_clients.hasOwnProperty(clientName)) { + clients.push(new Client(clientName, yaml.amazeeio_clients[clientName])); + } + }); + } + + return clients; +}; + +export const getClientById = async (id) => + (await getAllClients()).find((client) => client.id === id); diff --git a/services/api/src/schema/models/site.js b/services/api/src/schema/models/site.js new file mode 100644 index 000000000..805ffa2db --- /dev/null +++ b/services/api/src/schema/models/site.js @@ -0,0 +1,189 @@ +import { + listYamlFiles, + readFile, + existsFile, + accessFile, + writeFile, + commitFile, +} from '../../utility/yamlStorage'; + +export default class Site { + constructor(siteName, serverInfrastructure, serverIdentifier, serverNames, jumpHost, fullJson) { + this.id = `${serverIdentifier}.${serverInfrastructure}/${siteName}`; + this.siteHost = `${serverIdentifier}.${serverInfrastructure}`; + this.created = fullJson.created; + this.siteName = siteName; + this.siteGroup = fullJson.sitegroup || null; + this.siteBranch = fullJson.site_branch; + this.siteEnvironment = fullJson.site_environment; + this.serverIdentifier = serverIdentifier; + this.serverInfrastructure = serverInfrastructure; + this.serverNames = serverNames; + this.webRoot = fullJson.webroot || ''; + this.drupalVersion = fullJson.drupal_version; + this.SSLCertificateType = fullJson.sslcerttype; + this.FPMProfile = fullJson.fpm_profile; + this.domains = fullJson.domains; + this.redirectDomains = fullJson.redict_domains; + this.redirects = fullJson.redirects; + this.uid = fullJson.uid; + this.dbPassword = fullJson.db_password; + this.dbUser = fullJson.db_user; + this.cron = {}; + this.cron.type = fullJson.cron && fullJson.cron.type || null; + this.cron.minute = fullJson.cron && fullJson.cron.minute || null; + this.customCron = fullJson.custom_cron; + this.envVariables = fullJson.env_variables; + this.noPrefixenvVariables = fullJson.no_prefix_env_variables + this.phpValues = fullJson.php_values; + this.phpAdminValues = fullJson.php_admin_values; + this.phpFlags = fullJson.php_flags; + this.phpAdminFlags = fullJson.php_admin_flags; + this.xdebug = fullJson.xdebug; + this.nginxSitespecific = fullJson.nginx_sitespecific; + this.nginxSiteconfig = fullJson.nginx_siteconfig; + this.solrEnabled = fullJson.solr_enabled; + this.redisEnabled = fullJson.redis_enabled; + this.sshKeys = fullJson.ssh_keys; + this.phpVersion = fullJson.php_version; + this.redirectToHttps = fullJson.redirect_to_https; + this.ensure = fullJson.ensure; + this.upstreamURL = fullJson.upstream_url; + this.deployStrategy = fullJson.deploy_strategy || null; + this.apc = fullJson.apc; + this.comment = fullJson.comment; + this.basicAuth = {}; + this.basicAuth.username = fullJson.basic_auth && fullJson.basic_auth.username || null; + this.basicAuth.password = fullJson.basic_auth && fullJson.basic_auth.password || null; + this.jumpHost = jumpHost; + this.monitoringLevel = fullJson.monitoring_level || null; + this.uptimeMonitoringUri = fullJson.monitoring_uri || null; + this.fullJson = fullJson; + } +} + +export const getAllSites = async () => { + const sites = []; + + for (const fileName of await listYamlFiles()) { + // Extract infrastructure and identifier from file name. + const [ + serverInfrastructure, + serverIdentifier, + ] = fileName.substr(0, fileName.lastIndexOf('.')).split('/'); + + const yaml = await readFile(fileName); + if (yaml.hasOwnProperty('drupalsites')) { + const serverNameOverwriteKey = 'amazeeio::servername'; + + const siteHost = yaml.hasOwnProperty(serverNameOverwriteKey) ? yaml[serverNameOverwriteKey] : `${serverIdentifier}.${serverInfrastructure}`; + + var serverNames; + var jumpHost; + // @todo Is it correct to hard-code this? + const clusterMemberKey = 'drupalhosting::profiles::nginx_backend::cluster_member'; + + const jumphostKey = 'amazeeio::jumphost'; + + if (serverInfrastructure === 'cluster' && yaml.hasOwnProperty(clusterMemberKey)) { + serverNames = Object.keys(yaml[clusterMemberKey]).map((key) => `${key}.${siteHost}`); + } else if (serverInfrastructure === 'single') { + serverNames = [`backend.${siteHost}`]; + } else { + serverNames = (siteHost instanceof Array) ? siteHost : [siteHost]; + } + + if (yaml.hasOwnProperty(jumphostKey)) { + jumpHost = yaml[jumphostKey]; + } else { + jumpHost = null; + } + + Object.keys(yaml.drupalsites).forEach((siteName) => { + if (!yaml.drupalsites.hasOwnProperty(siteName)) { + return; + } + sites.push(new Site( + siteName, + serverInfrastructure, + serverIdentifier, + serverNames, + jumpHost, + yaml.drupalsites[siteName], + )); + }); + } + } + + return sites; +}; + +export const getSiteById = async (id) => { // eslint-disable-line + return (await getAllSites()).find((site) => site.id === id); +}; + +export const createSite = async (siteName, siteHost, fullJson) => { + const filePath = `${siteHost.split('.').reverse().join('/')}.yaml`; + + if (!(await existsFile(filePath)) || !(await accessFile(filePath))) { + throw new Error(`Server ${siteHost} does not exist.`); + } + + const before = await readFile(filePath); + if (!before.hasOwnProperty('drupalsites')) { + throw new Error(`Server ${siteHost} does not have "drupalsites".`); + } + + if (before.drupalsites.hasOwnProperty(siteName)) { + throw new Error(`Site ${siteName} already exists on the ${siteHost} server.`); + } + + const uid = Object.values(before.drupalsites) + .map((site) => parseInt(site.uid, 10)) + .reduce((previous, current) => { // eslint-disable-line arrow-body-style + return current > previous ? current : previous; + }, 3200) + 1; + + const site = { + ...fullJson, + uid, + }; + + const after = { + ...before, + drupalsites: { + ...before.drupalsites, + [siteName]: site, + }, + }; + + // Write the new contents to the file. + await writeFile(filePath, after); + await commitFile(filePath, `Added a site named ${siteName} to ${siteHost} server.`, repository); // eslint-disable-line max-len + + return new Site(siteName, siteHost, fullJson); +}; + +export const updateSite = async (siteName, siteHost, fullJson) => { + const filePath = `${siteHost.split('.').reverse().join('/')}.yaml`; + + if (!(await existsFile(filePath)) || !(await accessFile(filePath))) { + throw new Error(`Server ${siteHost} does not exist.`); + } + + const yaml = await readFile(filePath); + if (!yaml.hasOwnProperty('drupalsites')) { + throw new Error(`Server ${siteHost} does not have "drupalsites".`); + } + + if (!yaml.drupalsites.hasOwnProperty(siteName)) { + throw new Error(`Site ${siteName} does not exist at the ${siteHost} server.`); + } + + yaml.drupalsites[siteName] = fullJson; + + await writeFile(filePath, yaml); + await commitFile(filePath, `Updated the ${siteName} site at the ${siteHost} server.`, repository); + + return new Site(siteName, siteHost, fullJson); +}; diff --git a/services/api/src/schema/models/sitegroup.js b/services/api/src/schema/models/sitegroup.js new file mode 100644 index 000000000..1cfb9da00 --- /dev/null +++ b/services/api/src/schema/models/sitegroup.js @@ -0,0 +1,83 @@ +import { + readFile, + writeFile, + commitFile, +} from '../../utility/yamlStorage'; + +export default class SiteGroup { + constructor(siteGroupName, fullJson) { + this.id = siteGroupName; + this.siteGroupName = siteGroupName; + this.created = fullJson.created; + this.clientName = fullJson.client || null; + this.billingClientName = fullJson.billingclient || fullJson.client; + this.gitUrl = fullJson.git_url || null; + this.slack = fullJson.slack || null; + this.openshift = fullJson.openshift || null; + this.comment = fullJson.comment || null; + this.activeSystems = fullJson.active_systems || null; + this.fullJson = fullJson; + } +} + +export const getAllSiteGroups = async () => { + const fileName = 'amazeeio/sitegroups.yaml'; + + const siteGroups = []; + const yaml = await readFile(fileName); + if (yaml.hasOwnProperty('amazeeio_sitegroups')) { + Object.keys(yaml.amazeeio_sitegroups).forEach((siteGroupName) => { + if (yaml.amazeeio_sitegroups.hasOwnProperty(siteGroupName)) { + siteGroups.push(new SiteGroup(siteGroupName, yaml.amazeeio_sitegroups[siteGroupName])); + } + }); + } + + return siteGroups; +}; + +export const getSiteGroupById = async (id) => { // eslint-disable-line arrow-body-style + return (await getAllSiteGroups()).find((siteGroup) => siteGroup.id === id); +}; + +export const getSiteGroupByName = async (siteGroupName) => { // eslint-disable-line arrow-body-style + return (await getAllSiteGroups()).find((siteGroup) => siteGroup.siteGroupName === siteGroupName); +}; + +export const getSiteGroupByGitUrl = async (siteGroupgitUrl) => { // eslint-disable-line arrow-body-style + return (await getAllSiteGroups()).find((siteGroup) => siteGroup.gitUrl === siteGroupgitUrl); +}; + +export const createSiteGroup = async (siteGroupName, fullJson) => { + const filePath = 'amazeeio/sitegroups.yaml'; + + const yaml = await readFile(filePath); + yaml.amazeeio_sitegroups = yaml.amazeeio_sitegroups || {}; + if (yaml.amazeeio_sitegroups.hasOwnProperty(siteGroupName)) { + throw new Error(`The ${siteGroupName} sitegroup already exists.`); + } + + yaml.amazeeio_sitegroups[siteGroupName] = fullJson; + + await writeFile(filePath, yaml); + await commitFile(filePath, `Added a sitegroup named ${siteGroupName}.`, repository); + + return new SiteGroup(siteGroupName, fullJson); +}; + +export const updateSiteGroup = async (siteGroupName, fullJson) => { + const filePath = 'amazeeio/sitegroups.yaml'; + + const yaml = await readFile(filePath); + yaml.amazeeio_sitegroups = yaml.amazeeio_sitegroups || {}; + if (!yaml.amazeeio_sitegroups.hasOwnProperty(siteGroupName)) { + throw new Error(`The ${siteGroupName} sitegroup does not exist.`); + } + + yaml.amazeeio_sitegroups[siteGroupName] = fullJson; + + await writeFile(filePath, yaml); + await commitFile(filePath, `Updated a sitegroup named ${siteGroupName}.`, repository); + + return new SiteGroup(siteGroupName, fullJson); +}; diff --git a/services/api/src/schema/mutations/client.js b/services/api/src/schema/mutations/client.js new file mode 100644 index 000000000..552f9b2b8 --- /dev/null +++ b/services/api/src/schema/mutations/client.js @@ -0,0 +1 @@ +// @todo Define client mutations. diff --git a/services/api/src/schema/mutations/site.js b/services/api/src/schema/mutations/site.js new file mode 100644 index 000000000..da856a175 --- /dev/null +++ b/services/api/src/schema/mutations/site.js @@ -0,0 +1,49 @@ +import { + GraphQLString, + GraphQLNonNull, +} from 'graphql'; + +import { mutationWithClientMutationId } from 'graphql-relay'; + +import { + createSite, + updateSite, +} from '../models/site'; + +import jsonType from '../types/json'; +import siteType from '../types/site'; + +const createOrUpdateSiteFields = { + inputFields: { + siteName: { + type: new GraphQLNonNull(GraphQLString), + }, + siteHost: { + type: new GraphQLNonNull(GraphQLString), + }, + fullJson: { + type: new GraphQLNonNull(jsonType), + }, + }, + outputFields: { + site: { + type: siteType, + resolve: (site) => site, + }, + }, +}; + +export const createSiteMutation = mutationWithClientMutationId({ + name: 'CreateSite', + mutateAndGetPayload: async ({ siteName, siteHost, fullJson }) => + createSite(siteName, siteHost, fullJson), + ...createOrUpdateSiteFields, +}); + +export const updateSiteMutation = mutationWithClientMutationId({ + name: 'UpdateSite', + mutateAndGetPayload: ({ siteName, siteHost, fullJson }) => { // eslint-disable-line arrow-body-style, max-len + return updateSite(siteName, siteHost, fullJson); + }, + ...createOrUpdateSiteFields, +}); diff --git a/services/api/src/schema/mutations/sitegroup.js b/services/api/src/schema/mutations/sitegroup.js new file mode 100644 index 000000000..d5852be0f --- /dev/null +++ b/services/api/src/schema/mutations/sitegroup.js @@ -0,0 +1,45 @@ +import { + GraphQLString, + GraphQLNonNull, +} from 'graphql'; + +import { mutationWithClientMutationId } from 'graphql-relay'; + +import { + createSiteGroup, + updateSiteGroup, +} from '../models/sitegroup'; + +import jsonType from '../types/json'; +import siteGroupType from '../types/sitegroup'; + +const createOrUpdateSiteGroupFields = { + inputFields: { + siteGroupName: { + type: new GraphQLNonNull(GraphQLString), + }, + fullJson: { + type: new GraphQLNonNull(jsonType), + }, + }, + outputFields: { + siteGroup: { + type: siteGroupType, + resolve: (siteGroup) => siteGroup, + }, + }, +}; + +export const createSiteGroupMutation = mutationWithClientMutationId({ + name: 'CreateSiteGroup', + mutateAndGetPayload: async ({ siteGroupName, fullJson }) => + createSiteGroup(siteGroupName, fullJson), + ...createOrUpdateSiteGroupFields, +}); + +export const updateSiteGroupMutation = mutationWithClientMutationId({ + name: 'UpdateSiteGroup', + mutateAndGetPayload: async ({ siteGroupName, fullJson }) => + updateSiteGroup(siteGroupName, fullJson), + ...createOrUpdateSiteGroupFields, +}); diff --git a/services/api/src/schema/node.js b/services/api/src/schema/node.js new file mode 100644 index 000000000..e8f999c8d --- /dev/null +++ b/services/api/src/schema/node.js @@ -0,0 +1,45 @@ +/* eslint-disable global-require */ + +import { + fromGlobalId, + nodeDefinitions, +} from 'graphql-relay'; + +import Site, { getSiteById } from './models/site'; +import SiteGroup, { getSiteGroupById } from './models/sitegroup'; +import Client, { getClientById } from './models/client'; + +export const { nodeInterface, nodeField } = nodeDefinitions( + (globalId) => { + const { type, id } = fromGlobalId(globalId); + + if (type === 'Site') { + return getSiteById(id); + } + + if (type === 'SiteGroup') { + return getSiteGroupById(id); + } + + if (type === 'Client') { + return getClientById(id); + } + + return null; + }, + (object) => { + if (object instanceof Site) { + return require('./types/site').default; + } + + if (object instanceof SiteGroup) { + return require('./types/sitegroup').default; + } + + if (object instanceof Client) { + return require('./types/client').default; + } + + return null; + } +); diff --git a/services/api/src/schema/queries/client.js b/services/api/src/schema/queries/client.js new file mode 100644 index 000000000..51dd29fa8 --- /dev/null +++ b/services/api/src/schema/queries/client.js @@ -0,0 +1,41 @@ +import { + GraphQLString, + GraphQLNonNull, +} from 'graphql'; + +import { + fromGlobalId, + connectionArgs, + connectionFromArray, +} from 'graphql-relay'; + +import clientType, { clientConnection } from '../types/client'; + +import { + getAllClients, + getClientById, +} from '../models/client'; + +export const clientByIdField = { + type: clientType, + args: { + id: { + type: new GraphQLNonNull(GraphQLString), + }, + }, + resolve: async (_, { id }) => getClientById(fromGlobalId(id).id), +}; + +export const allClientsField = { + type: clientConnection, + args: Object.assign(connectionArgs, { + createdAfter: { + type: GraphQLString, + }, + }), + resolve: async (_, args) => { + const clients = (await getAllClients()) + .filter((client) => args.createdAfter ? new Date(args.createdAfter).getTime() < new Date(client.created).getTime() : true); + return connectionFromArray(clients, args); + }, +}; diff --git a/services/api/src/schema/queries/site.js b/services/api/src/schema/queries/site.js new file mode 100644 index 000000000..a53956429 --- /dev/null +++ b/services/api/src/schema/queries/site.js @@ -0,0 +1,45 @@ +import { + GraphQLString, + GraphQLNonNull, +} from 'graphql'; + +import { + fromGlobalId, + connectionArgs, + connectionFromArray, +} from 'graphql-relay'; + +import siteType, { siteConnection } from '../types/site'; + +import { + getAllSites, + getSiteById, +} from '../models/site'; + +export const siteByIdField = { + type: siteType, + args: { + id: { + type: new GraphQLNonNull(GraphQLString), + }, + }, + resolve: async (_, { id }) => getSiteById(fromGlobalId(id).id), +}; + +export const allSitesField = { + type: siteConnection, + args: Object.assign(connectionArgs, { + createdAfter: { + type: GraphQLString, + }, + environmentType: { + type: GraphQLString, + } + }), + resolve: async (_, args) => { + const sites = (await getAllSites()) + .filter((site) => args.createdAfter ? new Date(args.createdAfter).getTime() < new Date(site.created).getTime() : true) + .filter((site) => args.environmentType ? args.environmentType == site.siteEnvironment : true); + return connectionFromArray(sites, args); + }, +}; diff --git a/services/api/src/schema/queries/sitegroup.js b/services/api/src/schema/queries/sitegroup.js new file mode 100644 index 000000000..ac4785c9b --- /dev/null +++ b/services/api/src/schema/queries/sitegroup.js @@ -0,0 +1,67 @@ +import { + GraphQLString, + GraphQLNonNull, +} from 'graphql'; + +import { + fromGlobalId, + connectionArgs, + connectionFromArray, +} from 'graphql-relay'; + +import siteGroupType, { siteGroupConnection } from '../types/sitegroup'; + +import { + getAllSiteGroups, + getSiteGroupById, + getSiteGroupByName, + getSiteGroupByGitUrl, +} from '../models/sitegroup'; + +export const siteGroupByIdField = { + type: siteGroupType, + args: { + id: { + type: new GraphQLNonNull(GraphQLString), + }, + }, + resolve: async (_, { id }) => getSiteGroupById(fromGlobalId(id).id), +}; + +export const siteGroupByNameField = { + type: siteGroupType, + args: { + name: { + type: new GraphQLNonNull(GraphQLString), + }, + }, + resolve: async (_, { name }) => getSiteGroupByName(name), +}; + +export const siteGroupByGitUrlField = { + type: siteGroupType, + args: { + giturl: { + type: new GraphQLNonNull(GraphQLString), + }, + }, + resolve: async (_, { giturl }) => getSiteGroupByGitUrl(giturl), +}; + +export const allSiteGroupsField = { + type: siteGroupConnection, + args: Object.assign(connectionArgs, { + createdAfter: { + type: GraphQLString, + }, + giturl: { + type: GraphQLString, + }, + }), + resolve: async (_, args) => { + const sitegroups = (await getAllSiteGroups()) + .filter((sitegroup) => args.createdAfter ? new Date(args.createdAfter).getTime() < new Date(sitegroup.created).getTime() : true) + .filter((siteGroup) => args.giturl ? siteGroup.gitUrl === args.giturl : true); + return connectionFromArray(sitegroups, args); + }, +}; diff --git a/services/api/src/schema/types/client.js b/services/api/src/schema/types/client.js new file mode 100644 index 000000000..f6f3626da --- /dev/null +++ b/services/api/src/schema/types/client.js @@ -0,0 +1,60 @@ +import { + GraphQLString, + GraphQLObjectType, +} from 'graphql'; + +import { + globalIdField, + connectionDefinitions, + connectionArgs, + connectionFromArray, +} from 'graphql-relay'; + +import { nodeInterface } from '../node'; +import { siteGroupConnection } from './sitegroup'; +import { getAllSiteGroups } from '../models/sitegroup'; +import jsonType from './json'; + +const clientType = new GraphQLObjectType({ + name: 'Client', + fields: () => ({ + id: globalIdField('Client'), + clientName: { + type: GraphQLString, + }, + fullJson: { + type: jsonType, + }, + deployPrivateKey: { + type: GraphQLString, + }, + created: { + type: GraphQLString, + }, + comment: { + type: GraphQLString, + }, + sitegroups: { + type: siteGroupConnection, + args: Object.assign(connectionArgs, { + createdAfter: { + type: GraphQLString, + }, + }), + resolve: async (client, args) => { + const sitegroups = (await getAllSiteGroups()) + .filter((sitegroups) => sitegroups.clientName === client.clientName) + .filter((sitegroups) => args.createdAfter ? new Date(args.createdAfter).getTime() < new Date(sitegroups.created).getTime() : true); + return connectionFromArray(sitegroups, args); + }, + }, + }), + interfaces: [nodeInterface], +}); + +export const { connectionType: clientConnection } = connectionDefinitions({ + name: 'Clients', + nodeType: clientType, +}); + +export default clientType; diff --git a/services/api/src/schema/types/json.js b/services/api/src/schema/types/json.js new file mode 100644 index 000000000..9813b10d8 --- /dev/null +++ b/services/api/src/schema/types/json.js @@ -0,0 +1,12 @@ +import { + GraphQLScalarType, + Kind, +} from 'graphql'; + +export default new GraphQLScalarType({ + name: 'Json', + serialize: (value) => value, + parseValue: (value) => value, + parseLiteral: (ast) => // eslint-disable-line no-confusing-arrow + ast.kind === Kind.STRING ? JSON.parse(ast.value) : null, +}); diff --git a/services/api/src/schema/types/site.js b/services/api/src/schema/types/site.js new file mode 100644 index 000000000..ddb819f8f --- /dev/null +++ b/services/api/src/schema/types/site.js @@ -0,0 +1,188 @@ +import { + GraphQLString, + GraphQLObjectType, + GraphQLList, + GraphQLInt, + GraphQLBoolean, +} from 'graphql'; + +import { + globalIdField, + connectionDefinitions, +} from 'graphql-relay'; + +import { nodeInterface } from '../node'; +import { getSiteGroupByName } from '../models/sitegroup'; +import siteGroupType from './sitegroup'; +import jsonType from './json'; + +const siteType = new GraphQLObjectType({ + name: 'Site', + fields: () => ({ + id: globalIdField('Site'), + created: { + type: GraphQLString, + }, + siteHost: { + type: GraphQLString, + }, + siteName: { + type: GraphQLString, + }, + siteGroup: { + type: siteGroupType, + resolve: ({ siteGroup }) => getSiteGroupByName(siteGroup), + }, + siteBranch: { + type: GraphQLString, + }, + siteEnvironment: { + type: GraphQLString, + }, + serverInfrastructure: { + type: GraphQLString, + }, + serverIdentifier: { + type: GraphQLString, + }, + serverNames: { + type: new GraphQLList(GraphQLString), + }, + webRoot: { + type: GraphQLString, + }, + drupalVersion: { + type: GraphQLString, + }, + SSLCertificateType: { + type: GraphQLString, + }, + FPMProfile: { + type: GraphQLString, + }, + domains: { + type: new GraphQLList(GraphQLString), + }, + redirectDomains: { + type: new GraphQLList(GraphQLString), + }, + redirects: { + type: jsonType, + }, + uid: { + type: GraphQLInt, + }, + dbPassword: { + type: GraphQLString, + }, + dbUser: { + type: GraphQLString, + }, + cron: { + type: new GraphQLObjectType({ + name: 'Cron', + fields: { + type: { + type: GraphQLString, + }, + minute: { + type: GraphQLString, + }, + }, + }), + }, + customCron: { + type: jsonType, + }, + envVariables: { + type: jsonType, + }, + noPrefixenvVariables: { + type: jsonType, + }, + phpValues: { + type: jsonType, + }, + phpAdminValues: { + type: jsonType, + }, + phpFlags: { + type: jsonType, + }, + phpAdminFlags: { + type: jsonType, + }, + xdebug: { + type: GraphQLString, + }, + nginxSitespecific: { + type: GraphQLBoolean, + }, + nginxSiteconfig: { + type: GraphQLString, + }, + solrEnabled: { + type: GraphQLBoolean, + }, + redisEnabled: { + type: GraphQLBoolean, + }, + sshKeys: { + type: jsonType, + }, + phpVersion: { + type: GraphQLString, + }, + redirectToHttps: { + type: GraphQLString, + }, + ensure: { + type: jsonType, + }, + upstreamURL: { + type: GraphQLString, + }, + deployStrategy: { + type: GraphQLString, + }, + apc: { + type: GraphQLString, + }, + jumpHost: { + type: GraphQLString, + }, + comment: { + type: GraphQLString, + }, + basicAuth: { + type: new GraphQLObjectType({ + name: 'BasicAuth', + fields: { + username: { + type: GraphQLString, + }, + password: { + type: GraphQLString, + }, + }, + }), + }, + monitoringLevel: { + type: GraphQLString + }, + uptimeMonitoringUri: { + type: GraphQLString + }, + fullJson: { + type: jsonType, + }, + }), + interfaces: [nodeInterface], +}); + +export const { connectionType: siteConnection } = connectionDefinitions({ + name: 'Sites', + nodeType: siteType, +}); + +export default siteType; diff --git a/services/api/src/schema/types/sitegroup.js b/services/api/src/schema/types/sitegroup.js new file mode 100644 index 000000000..cd4b57b82 --- /dev/null +++ b/services/api/src/schema/types/sitegroup.js @@ -0,0 +1,90 @@ + +const util = require('util') + +import { + GraphQLString, + GraphQLObjectType, +} from 'graphql'; + +import { + globalIdField, + connectionDefinitions, + connectionArgs, + connectionFromArray, +} from 'graphql-relay'; + +import { nodeInterface } from '../node'; +import { getClientById } from '../models/client'; +import { getAllSites } from '../models/site'; +import { siteConnection } from './site'; +import jsonType from './json'; +import clientType from './client'; + +const siteGroupType = new GraphQLObjectType({ + name: 'SiteGroup', + fields: () => ({ + id: globalIdField('SiteGroup'), + siteGroupName: { + type: GraphQLString, + }, + client: { + type: clientType, + resolve: (siteGroup) => siteGroup.clientName && getClientById(siteGroup.clientName), + }, + billingClient: { + type: clientType, + resolve: (siteGroup) => siteGroup.billingClientName && getClientById(siteGroup.billingClientName), + }, + created: { + type: GraphQLString, + }, + fullJson: { + type: jsonType, + }, + slack: { + type: jsonType, + }, + openshift: { + type: jsonType, + }, + activeSystems: { + type: jsonType, + }, + gitUrl: { + type: GraphQLString, + }, + comment: { + type: GraphQLString, + }, + sites: { + type: siteConnection, + args: Object.assign(connectionArgs, { + branch: { + type: GraphQLString, + }, + environment: { + type: GraphQLString, + }, + createdAfter: { + type: GraphQLString, + }, + }), + resolve: async (siteGroup, args) => { + const sites = (await getAllSites()) + .filter((site) => site.siteGroup === siteGroup.siteGroupName) + .filter((site) => args.branch ? site.siteBranch === args.branch : true) + .filter((site) => args.environment ? site.siteEnvironment === args.environment : true) + .filter((site) => args.createdAfter ? new Date(args.createdAfter).getTime() < new Date(site.created).getTime() : true); + return connectionFromArray(sites, args); + }, + }, + }), + interfaces: [nodeInterface], +}); + +export const { connectionType: siteGroupConnection } = connectionDefinitions({ + name: 'SiteGroups', + nodeType: siteGroupType, +}); + +export default siteGroupType; diff --git a/services/api/src/server.js b/services/api/src/server.js new file mode 100644 index 000000000..31291d1d0 --- /dev/null +++ b/services/api/src/server.js @@ -0,0 +1,25 @@ +import Promise from 'bluebird'; +import http from 'http'; +import app from './app'; +import normalizePort from './utility/normalizePort'; + +export default async (repository) => { + debug('Starting to boot the server.'); + + // Log the start time to measure the performance. + const start = Date.now(); + + const port = normalizePort(process.env.PORT || '3000'); + + const server = http.createServer(app(repository)); + const listen = Promise.promisify(server.listen, { + context: server, + }); + + // Wait for the server to finish booting before resolving the promise. + await listen(port); + + const end = Date.now(); + const performance = (end - start) / 1000; + debug(`Finished booting the server in ${performance} seconds. The server is reachable at Port ${port}.`); // eslint-disable-line +}; diff --git a/services/api/src/sync.js b/services/api/src/sync.js new file mode 100644 index 000000000..d2f5ca0f1 --- /dev/null +++ b/services/api/src/sync.js @@ -0,0 +1,96 @@ + +import { Revparse } from 'nodegit'; +import enqueue from './queue'; +import createSignature from './utility/createSignature'; +import credentialsCallback from './utility/credentialsCallback'; + +const fetch = async (repository) => { + // Fetch any changes from the remote. + await repository.fetchAll({ + callbacks: { + certificateCheck: () => 1, + credentials: credentialsCallback, + }, + }); +}; + + +const rebase = async (repository) => { + await fetch(repository); + + // Attempt to rebase. + const signature = createSignature(); + const branch = process.env.GIT_BRANCH_PULL; + + await repository.rebaseBranches(branch, `origin/${branch}`, branch, signature); +}; + +const push = async (repository) => { + await fetch(repository); + + const pullBranch = process.env.GIT_BRANCH_PULL; + const pushBranch = process.env.GIT_BRANCH_PUSH; + + const localRevision = await Revparse.single(repository, pullBranch); + const originRevision = await Revparse.single(repository, `origin/${pushBranch}`); + + // Check if the current local and remote revision are identical. + if (localRevision.id().toString() === originRevision.id().toString()) { + debug('Local and remote revision are identicial.'); + + return; + } + + const refs = [`refs/heads/${pullBranch}:refs/heads/${pushBranch}`]; + const remote = await repository.getRemote('origin'); + + // Attempt to push any pending commits. + await remote.push(refs, { + callbacks: { + certificateCheck: () => 1, + credentials: credentialsCallback, + }, + }); +}; + +const synchronize = async (repository) => { + debug('Starting synchronization with remote.'); + + // Log the start time to measure the performance. + const start = Date.now(); + + try { + // Rebase the 'master' branch and then push to the remote. + await rebase(repository); + + if (process.env.GIT_PUSH_ENABLE.toLowerCase() === 'true') { + await push(repository); + } + + // Fetch the tip of the branch (last commit). + const commit = (await repository.getHeadCommit()).toString(); + + const end = Date.now(); + const performance = (end - start) / 1000; + debug(`Finished synchronization in ${performance} seconds.`); + debug(`Currently on revision ${commit}.`); + + // Wait for a configured duration until queuing another synchronization. + setTimeout(() => enqueue(synchronize, repository), process.env.SYNC_INTERVAL); + } catch (error) { + // TODO Lock the API if synchronization failed and is not recoverable. + debug('Encountered an error during synchronization.'); + + throw error; + } +}; + +export default async (repository) => { + if (process.env.NODE_ENV === 'development') { + // Don't synchronize immediately during production. + setTimeout(() => enqueue(synchronize, repository), process.env.SYNC_INTERVAL); + } else { + // Wait for the synchronization to finish. + await enqueue(synchronize, repository); + } +}; diff --git a/services/api/src/utility/createSignature.js b/services/api/src/utility/createSignature.js new file mode 100644 index 000000000..e3d694a9e --- /dev/null +++ b/services/api/src/utility/createSignature.js @@ -0,0 +1,8 @@ +import Git from 'nodegit'; + +export default () => { + const time = parseInt(Date.now() / 1000, 10); + const offset = new Date().getTimezoneOffset(); + + return Git.Signature.create('API', 'api@amazee.io', time, offset); +}; diff --git a/services/api/src/utility/credentialsCallback.js b/services/api/src/utility/credentialsCallback.js new file mode 100644 index 000000000..6cf881824 --- /dev/null +++ b/services/api/src/utility/credentialsCallback.js @@ -0,0 +1,4 @@ +import Git from 'nodegit'; + +export default () => + Git.Cred.userpassPlaintextNew(process.env.GIT_USERNAME, process.env.GIT_PASSWORD); diff --git a/services/api/src/utility/ensureRepository.js b/services/api/src/utility/ensureRepository.js new file mode 100644 index 000000000..ade2f8b9d --- /dev/null +++ b/services/api/src/utility/ensureRepository.js @@ -0,0 +1,35 @@ +import Git from 'nodegit'; +import credentialsCallback from './credentialsCallback'; + +const expectDefaultState = (repository) => { + if (!repository.isDefaultState()) { + throw new Error('The repository is not in the default state.'); + } + + return repository; +}; + +// Open the repository directory or fetch it from the remote. +export default async (url, branch, destination) => { + try { + // Check if the repository already exists. + const repository = await Git.Repository.open(destination); + + // Ensure that we are on the right branch. + await repository.checkoutBranch(branch); + return expectDefaultState(repository); + } catch (error) { + // Repository doesn't exist locally yet. Clone it. + const repository = await Git.Clone.clone(url, destination, { + checkoutBranch: branch, + fetchOpts: { + callbacks: { + certificateCheck: () => 1, + credentials: credentialsCallback, + }, + }, + }); + + return expectDefaultState(repository); + } +}; diff --git a/services/api/src/utility/escapeInput.js b/services/api/src/utility/escapeInput.js new file mode 100644 index 000000000..076186c3f --- /dev/null +++ b/services/api/src/utility/escapeInput.js @@ -0,0 +1,5 @@ +const stringify = (input) => + ((typeof input === 'object') ? JSON.stringify(input) : input); + +export default (input) => + stringify(input).replace(/"/g, '\\"'); diff --git a/services/api/src/utility/normalizePort.js b/services/api/src/utility/normalizePort.js new file mode 100644 index 000000000..034b301b1 --- /dev/null +++ b/services/api/src/utility/normalizePort.js @@ -0,0 +1,9 @@ +export default (value) => { + const port = parseInt(value, 10); + + if (!isNaN(port) && port > 0) { + return port; + } + + return false; +}; diff --git a/services/api/src/utility/yamlStorage.js b/services/api/src/utility/yamlStorage.js new file mode 100644 index 000000000..d0482f9c3 --- /dev/null +++ b/services/api/src/utility/yamlStorage.js @@ -0,0 +1,61 @@ +import Promise from 'bluebird'; +import glob from 'glob'; +import Yaml from 'js-yaml'; +import fs from 'fs'; +import path from 'path'; +import createSignature from './createSignature'; + +// Convert the unconvenient callback versions to yield promises. +const readFilePromise = Promise.promisify(fs.readFile); +const writeFilePromise = Promise.promisify(fs.writeFile); +const accessFilePromise = Promise.promisify(fs.access); +const statFilePromise = Promise.promisify(fs.stat); + +export const existsFile = async (fileName) => { + const filePath = path.join('.', '.repository', fileName); + + try { + return !!(await statFilePromise(filePath)); + } catch (error) { + return false; + } +}; + +export const accessFile = async (fileName) => { + const filePath = path.join('.', '.repository', fileName); + + try { + // Invert the return value (in the callback version, there is an 'error' + // argument in case access is denied). + return !(await accessFilePromise(filePath)); + } catch (error) { + return false; + } +}; + +export const readFile = async (fileName) => { + const filePath = path.join('.', '.repository', fileName); + const contents = await readFilePromise(filePath, 'utf-8'); + return Yaml.safeLoad(contents); +}; + +export const writeFile = async (fileName, data) => { + const filePath = path.join('.', '.repository', fileName); + const contents = Yaml.safeDump(data); + return writeFilePromise(filePath, contents, 'utf-8'); +}; + +export const commitFile = async (fileName, message, repository) => { + const signature = createSignature(); + + // Create the commit with the passed message. + await repository.createCommitOnHead([fileName], signature, signature, message); +}; + +export const listYamlFiles = async () => { + const repositoryPath = path.join('.', '.repository'); + + return await glob + .sync(`${repositoryPath}/**/*.yaml`) + .map((filePath) => path.relative(repositoryPath, filePath)); +}; diff --git a/services/api/yarn.lock b/services/api/yarn.lock new file mode 100644 index 000000000..802bef409 --- /dev/null +++ b/services/api/yarn.lock @@ -0,0 +1,3498 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 +abbrev@1, abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@^1.3.0, accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" + +ajv-keywords@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.2.0.tgz#676c4f087bfe1e8b12dca6fda2f3c74f417b099c" + +ajv@^4.7.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.1.tgz#08e1b0a5fddc8b844d28ca7b03510e78812ee3a0" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-index@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" + dependencies: + debug "^2.2.0" + es6-symbol "^3.0.2" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^1.4.0, async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-cli@^6.5.1: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.18.0.tgz#92117f341add9dead90f6fa7d0a97c0cc08ec186" + dependencies: + babel-core "^6.18.0" + babel-polyfill "^6.16.0" + babel-register "^6.18.0" + babel-runtime "^6.9.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^5.0.5" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.0.0" + +babel-code-frame@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^2.0.0" + +babel-core@^6.18.0, babel-core@^6.5.1: + version "6.18.2" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" + dependencies: + babel-code-frame "^6.16.0" + babel-generator "^6.18.0" + babel-helpers "^6.16.0" + babel-messages "^6.8.0" + babel-register "^6.18.0" + babel-runtime "^6.9.1" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-eslint@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-6.1.2.tgz#5293419fe3672d66598d327da9694567ba6a5f2f" + dependencies: + babel-traverse "^6.0.20" + babel-types "^6.0.19" + babylon "^6.0.18" + lodash.assign "^4.0.0" + lodash.pickby "^4.0.0" + +babel-generator@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.19.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-helper-bindify-decorators@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" + dependencies: + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" + dependencies: + babel-helper-explode-assignable-expression "^6.18.0" + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-call-delegate@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" + dependencies: + babel-helper-hoist-variables "^6.18.0" + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" + dependencies: + babel-helper-function-name "^6.18.0" + babel-runtime "^6.9.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" + dependencies: + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-explode-class@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" + dependencies: + babel-helper-bindify-decorators "^6.18.0" + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" + dependencies: + babel-helper-get-function-arity "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-get-function-arity@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-hoist-variables@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-optimise-call-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-regex@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" + dependencies: + babel-helper-function-name "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" + dependencies: + babel-helper-optimise-call-expression "^6.18.0" + babel-messages "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helpers@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" + dependencies: + babel-runtime "^6.0.0" + babel-template "^6.16.0" + +babel-messages@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-check-es2015-constants@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-do-expressions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-function-bind@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.3.13: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" + +babel-plugin-transform-async-generator-functions@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" + dependencies: + babel-helper-remap-async-to-generator "^6.16.2" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-async-to-generator@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" + dependencies: + babel-helper-remap-async-to-generator "^6.16.0" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-class-constructor-call@^6.3.13: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.18.0.tgz#80855e38a1ab47b8c6c647f8ea1bcd2c00ca3aae" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-class-properties@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" + dependencies: + babel-helper-function-name "^6.18.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.9.1" + babel-template "^6.15.0" + +babel-plugin-transform-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" + dependencies: + babel-helper-define-map "^6.8.0" + babel-helper-explode-class "^6.8.0" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-types "^6.13.0" + +babel-plugin-transform-do-expressions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.8.0.tgz#fda692af339835cc255bb7544efb8f7c1306c273" + dependencies: + babel-plugin-syntax-do-expressions "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-arrow-functions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoping@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" + dependencies: + babel-runtime "^6.9.0" + babel-template "^6.15.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" + dependencies: + babel-helper-define-map "^6.18.0" + babel-helper-function-name "^6.18.0" + babel-helper-optimise-call-expression "^6.18.0" + babel-helper-replace-supers "^6.18.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-template "^6.14.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-computed-properties@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" + dependencies: + babel-helper-define-map "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-destructuring@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" + dependencies: + babel-runtime "^6.9.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-for-of@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-function-name@^6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" + dependencies: + babel-helper-function-name "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.9.0" + +babel-plugin-transform-es2015-literals@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-modules-amd@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" + dependencies: + babel-plugin-transform-strict-mode "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" + dependencies: + babel-helper-hoist-variables "^6.18.0" + babel-runtime "^6.11.6" + babel-template "^6.14.0" + +babel-plugin-transform-es2015-modules-umd@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-object-super@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" + dependencies: + babel-helper-replace-supers "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-parameters@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" + dependencies: + babel-helper-call-delegate "^6.18.0" + babel-helper-get-function-arity "^6.18.0" + babel-runtime "^6.9.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-shorthand-properties@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-spread@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-sticky-regex@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-template-literals@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-unicode-regex@^6.3.13: + version "6.11.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-export-extensions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.8.0.tgz#fa80ff655b636549431bfd38f6b817bd82e47f5b" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-function-bind@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.8.0.tgz#e7f334ce69f50d28fe850a822eaaab9fa4f4d821" + dependencies: + babel-plugin-syntax-function-bind "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-object-rest-spread@^6.16.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.19.0.tgz#f6ac428ee3cb4c6aa00943ed1422ce813603b34c" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-regenerator@^6.16.0: + version "6.16.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.16.0" + private "~0.1.5" + +babel-plugin-transform-strict-mode@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-polyfill@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" + dependencies: + babel-runtime "^6.9.1" + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-preset-es2015@^6.5.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" + dependencies: + babel-plugin-check-es2015-constants "^6.3.13" + babel-plugin-transform-es2015-arrow-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoping "^6.18.0" + babel-plugin-transform-es2015-classes "^6.18.0" + babel-plugin-transform-es2015-computed-properties "^6.3.13" + babel-plugin-transform-es2015-destructuring "^6.18.0" + babel-plugin-transform-es2015-duplicate-keys "^6.6.0" + babel-plugin-transform-es2015-for-of "^6.18.0" + babel-plugin-transform-es2015-function-name "^6.9.0" + babel-plugin-transform-es2015-literals "^6.3.13" + babel-plugin-transform-es2015-modules-amd "^6.18.0" + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-plugin-transform-es2015-modules-systemjs "^6.18.0" + babel-plugin-transform-es2015-modules-umd "^6.18.0" + babel-plugin-transform-es2015-object-super "^6.3.13" + babel-plugin-transform-es2015-parameters "^6.18.0" + babel-plugin-transform-es2015-shorthand-properties "^6.18.0" + babel-plugin-transform-es2015-spread "^6.3.13" + babel-plugin-transform-es2015-sticky-regex "^6.3.13" + babel-plugin-transform-es2015-template-literals "^6.6.0" + babel-plugin-transform-es2015-typeof-symbol "^6.18.0" + babel-plugin-transform-es2015-unicode-regex "^6.3.13" + babel-plugin-transform-regenerator "^6.16.0" + +babel-preset-stage-0@^6.5.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.16.0.tgz#f5a263c420532fd57491f1a7315b3036e428f823" + dependencies: + babel-plugin-transform-do-expressions "^6.3.13" + babel-plugin-transform-function-bind "^6.3.13" + babel-preset-stage-1 "^6.16.0" + +babel-preset-stage-1@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.16.0.tgz#9d31fbbdae7b17c549fd3ac93e3cf6902695e479" + dependencies: + babel-plugin-transform-class-constructor-call "^6.3.13" + babel-plugin-transform-export-extensions "^6.3.13" + babel-preset-stage-2 "^6.16.0" + +babel-preset-stage-2@^6.16.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.18.0.tgz#9eb7bf9a8e91c68260d5ba7500493caaada4b5b5" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.18.0" + babel-plugin-transform-decorators "^6.13.0" + babel-preset-stage-3 "^6.17.0" + +babel-preset-stage-3@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.3.13" + babel-plugin-transform-async-generator-functions "^6.17.0" + babel-plugin-transform-async-to-generator "^6.16.0" + babel-plugin-transform-exponentiation-operator "^6.3.13" + babel-plugin-transform-object-rest-spread "^6.16.0" + +babel-register@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" + dependencies: + babel-core "^6.18.0" + babel-runtime "^6.11.6" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" + dependencies: + babel-runtime "^6.9.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.0.20, babel-traverse@^6.16.0, babel-traverse@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" + dependencies: + babel-code-frame "^6.16.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.19.0" + babylon "^6.11.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.0.19, babel-types@^6.13.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" + dependencies: + babel-runtime "^6.9.1" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.0.18, babylon@^6.11.0: + version "6.14.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +basic-auth@~1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.3.1: + version "3.4.6" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" + +body-parser@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.15.2.tgz#d7578cf4f1d11d5f6ea804cef35dc7a7ff6dae67" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "~2.2.0" + depd "~1.1.0" + http-errors "~1.5.0" + iconv-lite "0.4.13" + on-finished "~2.3.0" + qs "6.2.0" + raw-body "~2.1.7" + type-is "~1.6.13" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +bytes@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.0.0, chokidar@^1.4.3: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +circular-json@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.8.1, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commander@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + +commander@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + +compressible@~2.0.8: + version "2.0.9" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.9.tgz#6daab4e2b599c2770dd9e21e7a891b1c5a755425" + dependencies: + mime-db ">= 1.24.0 < 2" + +compression@^1.6.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" + dependencies: + accepts "~1.3.3" + bytes "2.3.0" + compressible "~2.0.8" + debug "~2.2.0" + on-headers "~1.0.1" + vary "~1.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.6: + version "1.5.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +configstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +content-disposition@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" + +content-type@^1.0.0, content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cors@^2.7.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.1.tgz#6181aa56abb45a2825be3304703747ae4e9d2383" + dependencies: + vary "^1" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +d@^0.1.1, d@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" + dependencies: + es5-ext "~0.10.2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.1.1, debug@^2.2.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@~2.2.0, debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@1.3.x: + version "1.3.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dotenv-extended@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dotenv-extended/-/dotenv-extended-1.0.4.tgz#56f28bdbaadb72856c60b12e8b7cbf6c847fcdc4" + dependencies: + dotenv "^2.0.0" + lodash "^4.3.0" + +dotenv-safe@^2.2.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/dotenv-safe/-/dotenv-safe-2.3.3.tgz#f35e09650527579bcc6e3565a7e2b6fcbbd44539" + dependencies: + dotenv "^2.0.0" + +dotenv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: + version "0.10.12" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" + dependencies: + d "^0.1.1" + es5-ext "^0.10.7" + es6-symbol "3" + +es6-map@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-set "~0.1.3" + es6-symbol "~3.1.0" + event-emitter "~0.3.4" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +es6-set@^0.1.4, es6-set@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-symbol "3" + event-emitter "~0.3.4" + +es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + +es6-weak-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" + dependencies: + d "^0.1.1" + es5-ext "^0.10.8" + es6-iterator "2" + es6-symbol "3" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escape-string-regexp@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-airbnb-base@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-3.0.1.tgz#b777e01f65e946933442b499fc8518aa251a6530" + +eslint-config-airbnb@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-9.0.1.tgz#6708170d5034b579d52913fe49dee2f7fec7d894" + dependencies: + eslint-config-airbnb-base "^3.0.0" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-plugin-import@^1.11.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.3.x" + es6-map "^0.1.3" + es6-set "^0.1.4" + eslint-import-resolver-node "^0.2.0" + has "^1.0.1" + lodash.cond "^4.3.0" + lodash.endswith "^4.0.1" + lodash.find "^4.3.0" + lodash.findindex "^4.3.0" + minimatch "^3.0.3" + object-assign "^4.0.1" + pkg-dir "^1.0.0" + pkg-up "^1.0.0" + +eslint@^3.1.0: + version "3.11.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.11.1.tgz#408be581041385cba947cd8d1cd2227782b55dbf" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.4.6" + debug "^2.1.1" + doctrine "^1.2.2" + escope "^3.6.0" + espree "^3.3.1" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.2.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~1.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" + dependencies: + acorn "^4.0.1" + acorn-jsx "^3.0.0" + +esprima@^2.6.0, esprima@^2.7.1, esprima@2.7.x: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +event-emitter@~0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" + dependencies: + d "~0.1.1" + es5-ext "~0.10.7" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express-graphql@^0.5.1: + version "0.5.4" + resolved "https://registry.yarnpkg.com/express-graphql/-/express-graphql-0.5.4.tgz#413477e3efda6d7437e788f7ef6c994914e79f88" + dependencies: + accepts "^1.3.0" + content-type "^1.0.0" + http-errors "^1.3.0" + raw-body "^2.1.0" + +express@^4.13.4: + version "4.14.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.1" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "~2.2.0" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + finalhandler "0.5.0" + fresh "0.3.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.2" + qs "6.2.0" + range-parser "~1.2.0" + send "0.14.1" + serve-static "~1.11.1" + type-is "~1.6.13" + utils-merge "1.0.0" + vary "~1.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-levenshtein@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.0" + unpipe "~1.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flat-cache@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" + dependencies: + circular-json "^0.3.0" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + dependencies: + samsam "~1.1" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +from@~0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" + +fs-extra@~0.26.2: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.15" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" + +gauge@~2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-color "^0.1.7" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gauge@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + supports-color "^0.2.0" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^5.0.15, glob@^5.0.5: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +globals@^9.0.0, globals@^9.2.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" + dependencies: + duplexify "^3.2.0" + infinity-agent "^2.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + nested-error-stacks "^1.0.0" + object-assign "^3.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +graphql-relay@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/graphql-relay/-/graphql-relay-0.4.4.tgz#876a654445b6af4539f81cb9befd5cd7ead129dd" + +graphql@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.6.2.tgz#19cdcb17e5862d64396a0684f92f7be64e90e7af" + dependencies: + iterall "1.0.2" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +handlebars@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-color@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +http-errors@^1.3.0, http-errors@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" + dependencies: + inherits "2.0.3" + setprototypeof "1.0.2" + statuses ">= 1.3.1 < 2" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +ignore@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +infinity-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2, inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-stream@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2, isstream@0.1.x: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul@^0.4.2: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +iterall@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.0.2.tgz#41a2e96ce9eda5e61c767ee5dc312373bb046e91" + +jade@0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" + +js-yaml@^3.5.1, js-yaml@^3.5.3, js-yaml@3.x: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" + dependencies: + is-buffer "^1.0.2" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +latest-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" + dependencies: + package-json "^1.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.endswith@^4.0.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" + +lodash.find@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + +lodash.findindex@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.pickby@^4.0.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" + dependencies: + js-tokens "^2.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +"mime-db@>= 1.24.0 < 2", mime-db@~1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: + version "2.1.13" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" + dependencies: + mime-db "~1.25.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, "minimatch@2 || 3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.1, mkdirp@0.5.1, mkdirp@0.5.x: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mocha@^2.4.5: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" + dependencies: + commander "2.3.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.2" + glob "3.2.11" + growl "1.9.2" + jade "0.26.3" + mkdirp "0.5.1" + supports-color "1.2.0" + to-iso-string "0.0.2" + +morgan@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.7.0.tgz#eb10ca8e50d1abe0f8d3dad5c0201d052d981c62" + dependencies: + basic-auth "~1.0.3" + debug "~2.2.0" + depd "~1.1.0" + on-finished "~2.3.0" + on-headers "~1.0.1" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +nan@^2.2.0, nan@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +nested-error-stacks@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +node-gyp@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3" + osenv "0" + path-array "^1.0.0" + request "2" + rimraf "2" + semver "2.x || 3.x || 4 || 5" + tar "^2.0.0" + which "1" + +node-pre-gyp@^0.6.29, node-pre-gyp@~0.6.15: + version "0.6.32" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" + dependencies: + mkdirp "~0.5.1" + nopt "~3.0.6" + npmlog "^4.0.1" + rc "~1.1.6" + request "^2.79.0" + rimraf "~2.5.4" + semver "~5.3.0" + tar "~2.2.1" + tar-pack "~3.3.0" + +nodegit-promise@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/nodegit-promise/-/nodegit-promise-4.0.0.tgz#5722b184f2df7327161064a791d2e842c9167b34" + dependencies: + asap "~2.0.3" + +nodegit@^0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/nodegit/-/nodegit-0.14.1.tgz#1458ee4dfa889df21a79e0072376b501d83a1cb8" + dependencies: + fs-extra "~0.26.2" + lodash "^4.13.1" + nan "^2.2.0" + node-gyp "^3.3.1" + node-pre-gyp "~0.6.15" + promisify-node "~0.3.0" + +nodemon@^1.8.1: + version "1.11.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" + dependencies: + chokidar "^1.4.3" + debug "^2.2.0" + es6-promise "^3.0.2" + ignore-by-default "^1.0.0" + lodash.defaults "^3.1.2" + minimatch "^3.0.0" + ps-tree "^1.0.1" + touch "1.0.0" + undefsafe "0.0.3" + update-notifier "0.5.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +nopt@~3.0.6, "nopt@2 || 3", nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +"npmlog@0 || 1 || 2 || 3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.6.0" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@1.x: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0, once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0, osenv@0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + dependencies: + got "^3.2.0" + registry-url "^3.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-array@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" + dependencies: + array-index "^1.0.0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6, private@~0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promisify-node@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promisify-node/-/promisify-node-0.3.0.tgz#b4b55acf90faa7d2b8b90ca396899086c03060cf" + dependencies: + nodegit-promise "~4.0.0" + +proxy-addr@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.1.1" + +ps-tree@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +qs@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@^2.1.0, raw-body@~2.1.7: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +rc@^1.0.1, rc@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.9.5: + version "0.9.6" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-url@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.79.0, request@2: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@^1.1.6, resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +samsam@~1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" + +samsam@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +semver@^5.0.3, semver@~5.3.0, "semver@2.x || 3.x || 4 || 5": + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.5.0" + mime "1.3.4" + ms "0.7.1" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.0" + +serve-static@~1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.14.1" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setprototypeof@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" + +shelljs@^0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +sinon@^1.17.3: + version "1.17.6" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.6.tgz#a43116db59577c8296356afee13fafc2332e58e1" + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" + dependencies: + source-map "^0.5.3" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +supports-color@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +tar-pack@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar@^2.0.0, tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@^2.3.6, through@~2.3, through@~2.3.1, through@2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +to-iso-string@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" + +touch@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" + dependencies: + nopt "~1.0.10" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.4" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.4.tgz#8c9dbfb52795686f166cd2023794bcf103d13c2b" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.13: + version "1.6.14" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.13" + +typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@^2.6: + version "2.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +update-notifier@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" + dependencies: + chalk "^1.0.0" + configstore "^1.0.0" + is-npm "^1.0.0" + latest-version "^1.0.0" + repeating "^1.1.2" + semver-diff "^2.0.0" + string-length "^1.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +"util@>=0.10.3 <1": + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.10: + version "2.0.11" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" + dependencies: + user-home "^1.1.1" + +vary@^1, vary@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +which@^1.1.1, which@1: + version "1.2.12" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" + dependencies: + isexe "^1.1.1" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.0.tgz#207faaab6fccf3fe493743dd2b03dbafc7ceb78c" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + diff --git a/services/elasticsearch/.openshift/development.app.yml b/services/elasticsearch/.openshift/development.app.yml new file mode 100644 index 000000000..565aec5e3 --- /dev/null +++ b/services/elasticsearch/.openshift/development.app.yml @@ -0,0 +1,108 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: TAG + description: Which tag should be deployed + required: true + - name: NAME + description: How is the resources are called + required: true + - name: SHORT_NAME + description: Name of resources in max 24 chars + required: true + - name: SITEGROUP + description: Name of the site group + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${SITEGROUP}:${TAG} + name: ${NAME} + env: + - name: ES_JAVA_OPTS + value: "-Xms200m -Xmx200m" + ports: + - containerPort: 9200 + name: http + protocol: TCP + - containerPort: 9300 + name: transport + protocol: TCP + resources: + limits: + cpu: 1000m + memory: 800Mi + requests: + cpu: 200m + memory: 300Mi + volumeMounts: + - mountPath: /usr/share/elasticsearch/data + name: ${NAME}-data-volume + readinessProbe: + httpGet: + port: http + initialDelaySeconds: 20 + livenessProbe: + httpGet: + port: http + initialDelaySeconds: 120 + volumes: + - name: ${NAME}-data-volume + emptyDir: {} + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${NAME} + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: 9200-tcp + port: 9200 + protocol: TCP + targetPort: 9200 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + status: + loadBalancer: {} \ No newline at end of file diff --git a/services/elasticsearch/.openshift/production.app.yml b/services/elasticsearch/.openshift/production.app.yml new file mode 100644 index 000000000..3b9fc41f4 --- /dev/null +++ b/services/elasticsearch/.openshift/production.app.yml @@ -0,0 +1,107 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: TAG + description: Which tag should be deployed + required: true + - name: NAME + description: How is the resources are called + required: true + - name: SHORT_NAME + description: Name of resources in max 24 chars + required: true + - name: SITEGROUP + description: Name of the site group + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${SITEGROUP}:${TAG} + name: ${NAME} + env: + - name: ES_JAVA_OPTS + value: "-Xms1000m -Xmx1000m" + ports: + - containerPort: 9200 + name: http + protocol: TCP + - containerPort: 9300 + name: transport + protocol: TCP + resources: + limits: + memory: 1500Mi + requests: + cpu: 200m + memory: 300Mi + volumeMounts: + - mountPath: /usr/share/elasticsearch/data + name: ${NAME}-data-volume + readinessProbe: + httpGet: + port: http + initialDelaySeconds: 20 + livenessProbe: + httpGet: + port: http + initialDelaySeconds: 120 + volumes: + - name: ${NAME}-data-volume + emptyDir: {} + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${NAME} + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: 9200-tcp + port: 9200 + protocol: TCP + targetPort: 9200 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + status: + loadBalancer: {} \ No newline at end of file diff --git a/services/elasticsearch/Dockerfile b/services/elasticsearch/Dockerfile new file mode 100644 index 000000000..be449ee2a --- /dev/null +++ b/services/elasticsearch/Dockerfile @@ -0,0 +1,10 @@ +FROM docker.elastic.co/elasticsearch/elasticsearch:5.4.0 + +USER root + +RUN curl -sLo /usr/local/bin/fix-permissions https://raw.githubusercontent.com/sclorg/s2i-base-container/master/bin/fix-permissions && \ + chmod +x /usr/local/bin/fix-permissions + +RUN fix-permissions /usr/share/elasticsearch + +ENV http.host=0.0.0.0 transport.host=127.0.0.1 xpack.security.enabled=false \ No newline at end of file diff --git a/services/elasticsearch/Jenkinsfile b/services/elasticsearch/Jenkinsfile new file mode 100644 index 000000000..129f90657 --- /dev/null +++ b/services/elasticsearch/Jenkinsfile @@ -0,0 +1,120 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-').replaceAll('/','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.SITEGROUP = "elasticsearch" + env.NAME = "${env.SITEGROUP}-${env.BRANCH}" + + // Openshift does not really like names longer then 24 chars or ending in a hyphen. + // This strips that, but also makes sure that if the string is already less then 24 + // characters, Java is not confused. + // See: http://stackoverflow.com/questions/953527/java-substring-string-index-out-of-range + env.SHORT_NAME = "${env.SITEGROUP}-${env.BRANCH}" + if (env.SHORT_NAME.length() > 24) { + env.SHORT_NAME = env.SHORT_NAME.substring(0, 24).replaceFirst(/[^a-z0-9]+$/, ''); + } + + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + env.OPENSHIFT_REGISTRY = "registry.appuio.ch" + env.OPENSHIFT_CONSOLE = "https://console.appuio.ch" + env.OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.OPENSHIFT_APP_YAML = "development.app.yml" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.SITEGROUP}/detail" + + if (env.BRANCH == 'master') { + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + env.OPENSHIFT_APP_YAML = "production.app.yml" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh """docker run --rm -v $WORKSPACE/.openshift:/tmp -e OPENSHIFT_CONSOLE=${env.OPENSHIFT_CONSOLE} -e OPENSHIFT_TOKEN=${env.OPENSHIFT_TOKEN} amazeeio/oc sh -c 'oc process \ + -n ${env.OPENSHIFT_PROJECT} \ + -f /tmp/${env.OPENSHIFT_APP_YAML} \ + -v TAG=${env.BRANCH} \ + -v NAME=${env.NAME} \ + -v SHORT_NAME=${env.SHORT_NAME} \ + -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} \ + -v SITEGROUP=${env.SITEGROUP} \ + | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'""" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.SITEGROUP}-registry") { + try { + sh "docker tag ${env.IMAGE} ${env.OPENSHIFT_REGISTRY}/${env.OPENSHIFT_PROJECT}/${env.SITEGROUP}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.docker docker login -u=jenkins -p='${env.OPENSHIFT_TOKEN}' ${env.OPENSHIFT_REGISTRY}" + sh "DOCKER_CONFIG=$WORKSPACE/.docker docker push ${env.OPENSHIFT_REGISTRY}/${env.OPENSHIFT_PROJECT}/${env.SITEGROUP}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: "${env.OPENSHIFT_CONSOLE}", authToken: env.OPENSHIFT_TOKEN, depCfg: "${env.NAME}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.SITEGROUP}/${env.BRANCH_NAME}] >${url}|Build #${env.BUILD_NUMBER}> failed* \\nStep: ${step} " + sendslack('danger', message) + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.SITEGROUP}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \\n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.SITEGROUP}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} \ No newline at end of file diff --git a/services/elasticsearch/README.md b/services/elasticsearch/README.md new file mode 100644 index 000000000..30b070ce4 --- /dev/null +++ b/services/elasticsearch/README.md @@ -0,0 +1,5 @@ +# amazeeio-elasticsearch + +This is a elasticsearch used within the amazee.io lagoon deployment system. + +It stores all amazeeio-logs inside itself, which are usually created by `amazeeio-logstash` \ No newline at end of file diff --git a/services/jenkins-slave/Dockerfile b/services/jenkins-slave/Dockerfile new file mode 100644 index 000000000..e49f530ae --- /dev/null +++ b/services/jenkins-slave/Dockerfile @@ -0,0 +1,14 @@ +FROM jenkinsci/slave:latest + +USER root + +RUN usermod -G users -a jenkins && \ + wget -q https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz -O /tmp/docker.tgz && \ + tar xfvz /tmp/docker.tgz -C /tmp/ && \ + cp /tmp/docker/docker /usr/local/bin + +ENV JAVA_OPTS=-Xmx200m + +USER jenkins + +CMD java ${JAVA_OPTS} -jar /usr/share/jenkins/slave.jar -jnlpCredentials $JENKINS_MASTER_CREDENTIALS -jnlpUrl ${JENKINS_MASTER_URL}/computer/${JENKINS_SLAVE_NAME}/slave-agent.jnlp \ No newline at end of file diff --git a/services/jenkins/.dockerignore b/services/jenkins/.dockerignore new file mode 100644 index 000000000..93ea3f6f0 --- /dev/null +++ b/services/jenkins/.dockerignore @@ -0,0 +1,5 @@ +.openshift/* +.yarn* +node_modules/* +Jenkinsfile +.dockerignore \ No newline at end of file diff --git a/services/jenkins/.openshift/.kubeconfig b/services/jenkins/.openshift/.kubeconfig new file mode 100644 index 000000000..a79c97f77 --- /dev/null +++ b/services/jenkins/.openshift/.kubeconfig @@ -0,0 +1,17 @@ +apiVersion: v1 +clusters: +- cluster: + server: https://console.appuio.ch:443 + name: appuio +contexts: +- context: + cluster: appuio + user: system:serviceaccount:amze-amazeeio:jenkins + name: appuio:amze-amazeeio:jenkins +current-context: appuio:amze-amazeeio:jenkins +kind: Config +preferences: {} +users: +- name: system:serviceaccount:amze-amazeeio:jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg diff --git a/services/jenkins/.openshift/README.md b/services/jenkins/.openshift/README.md new file mode 100644 index 000000000..6a67200e6 --- /dev/null +++ b/services/jenkins/.openshift/README.md @@ -0,0 +1,53 @@ +# OpenShift + +## Jenkins Access to Openshift + +In order for Jenkins to deploy to openshift we need to create an openshift serviceaccount that has access to our project (regular username/password logins expire after a couple of hours, not very good for a CI/CD system) + +1. Login as your user + + oc login + +2. Create new serviceaccount with the name jenkins + + oc create serviceaccount jenkins + +3. Give this serviceaccount edit access (see the name of the serviceaccount contains the project name!) + + oc policy add-role-to-user edit system:serviceaccount:appuio-demo2:jenkins2 + +4. Get access token from serviceaccount, with first getting the name of the token and then accessing the secret + + oc describe serviceaccount jenkins2 + + oc describe secret jenkins2-token-7tawv + +5. Add the token inside the .kubeconfig: + + + apiVersion: v1 + clusters: + - cluster: + server: https://console.appuio.ch:443 + name: appuio + contexts: + - context: + cluster: appuio + user: jenkins + name: appuio:jenkins + current-context: appuio:jenkins + kind: Config + preferences: {} + users: + - name: jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLXJhcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJqZW5raW5zLXRva2VuLTFocW42Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImplbmtpbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZmM4ZTIzMi05ZDBhLTExZTYtYTdlZi1mYTE2M2VkOTVkYWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YW16ZS1yYXM6amVua2lucyJ9.BAeU6zXl0uPCD2DRGJeV1oxRbk3sA3M5tn7K6xPh5iv-etS8Q2lsF-OFwO7HVycvEckXh31KNUmQTzvn3keSDT0a8BqViBhGPKCfAw-vf3ElUnGFDCWN9IpITKJBWIxVdGyd5sPltBWkAVxl9JOwnu1vrBvSioYqwjzYkjStbfp7pzLXhSld9G4AXA_zBntDW633mujllT0z_5IMSJX_gKSZcrTN78KLdCMmuvIT_m7xZMp_r52daEu67DjsjYtVqVx4BsDVPdUZRQ9eJtodbtZ-FJV9w0W4H9nX3iyqCk7OriD4Xt68Z5cUK0tR-4hyyh_hL31c6vzGb_VosmAWWg + + +6. Test the kubeconfig - should return `system:serviceaccount:appuio-demo2:jenkins2` + + KUBECONFIG=.openshift/.kubeconfig oc whoami + +7. Create a Docker authentication config.json so Jenkins can push into the Openshift docker Registry + + DOCKER_CONFIG=.openshift/ docker login -u jenkins2 -p $(KUBECONFIG=.openshift/.kubeconfig oc whoami -t) registry.appuio.ch \ No newline at end of file diff --git a/services/jenkins/.openshift/config.json b/services/jenkins/.openshift/config.json new file mode 100644 index 000000000..a526a5d46 --- /dev/null +++ b/services/jenkins/.openshift/config.json @@ -0,0 +1,7 @@ +{ + "auths": { + "registry.appuio.ch": { + "auth": "amVua2luczI6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoYlhwbExXRnRZWHBsWldsdklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltcGxibXRwYm5NdGRHOXJaVzR0TjJGcU5tOGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lhbVZ1YTJsdWN5SXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqRmlOelZoWXpkakxXTTJOV010TVRGbE5pMWlOelUxTFdaaE1UWXpaVE5sWXpjellTSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBoYlhwbExXRnRZWHBsWldsdk9tcGxibXRwYm5NaWZRLkRUSlpDd3BFWFlnenlaSmtDZHF6a0dHc0hWQWhNc0J0OGFtcmkydGZQYl9mOTZrZWxHOWFnVXBudzdZRmcweWkybEdGcjhTU1lMOEd2dXhuNHcwMXZXdHNMc2JhMjg5cFJNOUhiXzFJU2F0U1NWNTM5TXdQR2dpN2ZVN3F6Yk00ZzJpVmIxaW1sQkhJbW9tSkNXVzJDSW41aEF5VUR4Snd5OVh2Y0hyajZUYjE0X0c2YnVLT3JpR0JaejZ4Qmk5WWpOanh5eTlZem5WOVhkU1Z4THNXQjdFaG5yUnhveElFaWVPV0RaUHF1am9tSUFYczZ0TzdhcGFnNE1kZFl6LTVYdTg2Vm15SjZkS05KZUt2RUh0V1hUM081SUVqMEhmdlZGSnlKRTFKR3BfLVhnTzg4Ujh0WF9yOWYySU9PLXpyMU9OODVubUpjTDlGTGRLaFE4Z3dRZw==" + } + } +} \ No newline at end of file diff --git a/services/jenkins/.openshift/development.app.yml b/services/jenkins/.openshift/development.app.yml new file mode 100644 index 000000000..287dd4e5c --- /dev/null +++ b/services/jenkins/.openshift/development.app.yml @@ -0,0 +1,153 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: ${AMAZEEIO_SERVICE}-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + type: Recreate + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: ADMIN_PASSWORD + value: fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR + - name: JENKINS_SLAVE_AGENT_PORT + value: '31243' + - name: JAVA_OPTS + value: '-Djenkins.install.runSetupWizard=false -Xmx1024m' + ports: + - containerPort: 8080 + protocol: TCP + - containerPort: 31243 + protocol: TCP + readinessProbe: + httpGet: + path: /login + port: 8080 + initialDelaySeconds: 3 + timeoutSeconds: 3 + livenessProbe: + httpGet: + path: /login + port: 8080 + initialDelaySeconds: 420 + timeoutSeconds: 3 + failureThreshold: 30 + resources: + limits: + memory: 2000Mi + requests: + memory: 800Mi + volumeMounts: + - mountPath: /var/jenkins_home + name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + volumes: + - name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + persistentVolumeClaim: + claimName: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} +- apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + ports: + - name: 8080-tcp + port: 80 + protocol: TCP + targetPort: 8080 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH}-jnlp2 + spec: + ports: + - name: 50000-tcp + port: 31243 + protocol: TCP + targetPort: 31243 + nodePort: 31243 + type: LoadBalancer + externalIPs: [] + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + host: ${AMAZEEIO_SERVICE}-${BRANCH}.appuio.amazeeio.review + port: + targetPort: 8080-tcp + to: + kind: Service + name: ${AMAZEEIO_SERVICE}-${BRANCH} diff --git a/services/jenkins/.openshift/production.app.yml b/services/jenkins/.openshift/production.app.yml new file mode 100644 index 000000000..8170282ba --- /dev/null +++ b/services/jenkins/.openshift/production.app.yml @@ -0,0 +1,154 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: ${AMAZEEIO_SERVICE}-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + type: Recreate + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: ADMIN_PASSWORD + value: fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR + - name: JENKINS_SLAVE_AGENT_PORT + value: '31241' + - name: JAVA_OPTS + value: '-Djenkins.install.runSetupWizard=false -Xmx1800m' + ports: + - containerPort: 8080 + protocol: TCP + - containerPort: 31236 + protocol: TCP + readinessProbe: + httpGet: + path: /login + port: 8080 + initialDelaySeconds: 3 + timeoutSeconds: 3 + livenessProbe: + httpGet: + path: /login + port: 8080 + initialDelaySeconds: 420 + timeoutSeconds: 3 + failureThreshold: 30 + resources: + limits: + memory: 2000Mi + requests: + memory: 2000Mi + volumeMounts: + - mountPath: /var/jenkins_home + name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + volumes: + - name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + persistentVolumeClaim: + claimName: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} +- apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + ports: + - name: 8080-tcp + port: 80 + protocol: TCP + targetPort: 8080 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH}-jnlp2 + spec: + ports: + - name: jnlp2 + port: 31241 + protocol: TCP + targetPort: 31241 + nodePort: 31241 + type: LoadBalancer + externalIPs: [] + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +## ## No route for production right now, until https://ticket.vshn.net/browse/AMZE-329 is figured out +##- apiVersion: v1 +## kind: Route +## metadata: +## creationTimestamp: null +## labels: +## app: ${AMAZEEIO_SERVICE}-${BRANCH} +## name: ${AMAZEEIO_SERVICE}-${BRANCH} +## spec: +## host: jenkins.amazeeio.cloud +## port: +## targetPort: 8080-tcp +## to: +## kind: Service +## name: ${AMAZEEIO_SERVICE}-${BRANCH} \ No newline at end of file diff --git a/services/jenkins/Dockerfile b/services/jenkins/Dockerfile new file mode 100644 index 000000000..1e7691b2a --- /dev/null +++ b/services/jenkins/Dockerfile @@ -0,0 +1,39 @@ +FROM jenkinsci/jenkins + +# Installing the Docker Client +USER root +RUN usermod -G root -a jenkins && \ + wget -q https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz -O /tmp/docker.tgz && \ + tar xfvz /tmp/docker.tgz -C /tmp/ && \ + cp /tmp/docker/docker /usr/local/bin + +# We don't need a setup, we're automated +ENV JAVA_OPTS=-Djenkins.install.runSetupWizard=false\ -Xmx512m + +# Installing our plugins +RUN /usr/local/bin/install-plugins.sh ansicolor blueocean rebuild greenballs openshift-pipeline pipeline-stage-view slack lockable-resources monitoring + +# Setting up an Admin User +COPY adminuser.groovy /usr/share/jenkins/ref/init.groovy.d/adminuser.groovy + +# Setting Executors to 0 +COPY no-executors-master.groovy /usr/share/jenkins/ref/init.groovy.d/no-executors-master.groovy + +# Creating the amazeeio bearer token credential +COPY github-amazeeio-bearer-token.groovy /usr/share/jenkins/ref/init.groovy.d/github-amazeeio-bearer-token.groovy +COPY vshn-gitlab-access-token.groovy /usr/share/jenkins/ref/init.groovy.d/vshn-gitlab-access-token.groovy + +# Copying our slaves info +COPY nodes /usr/share/jenkins/ref/nodes + +# OpenShift Sync Plugin config which disables the sync +COPY io.fabric8.jenkins.openshiftsync.GlobalPluginConfiguration.xml /usr/share/jenkins/ref/io.fabric8.jenkins.openshiftsync.GlobalPluginConfiguration.xml + +ENV GIT_COMMITTER_NAME=technology@amazee.io GIT_COMMITTER_EMAIL=amazeeio-jenkins + +# Changing permissions so we can run on openshift +RUN chgrp root $JENKINS_HOME +RUN chmod a+rw -R $JENKINS_HOME + +COPY amazee-jenkins.sh /usr/local/bin/amazee-jenkins.sh +ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/amazee-jenkins.sh"] diff --git a/services/jenkins/Jenkinsfile b/services/jenkins/Jenkinsfile new file mode 100644 index 000000000..da8d3d5c7 --- /dev/null +++ b/services/jenkins/Jenkinsfile @@ -0,0 +1,135 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.OPENSHIFT_APP_YAML = "development.app.yml" + env.AMAZEEIO_SERVICE = "jenkins" + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.AMAZEEIO_SERVICE}/detail" + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + if (env.TARGET_BRANCH == 'master') { + env.OPENSHIFT_APP_YAML = "production.app.yml" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --no-cache --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + stage ('tests') { + // Running Tests in parallel, for faster completion + parallel ( + //test_unit: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-unit" + // } catch (e) { + // error(e, 'unit test') + // } + //}, + // test_http: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-http-ssr" + // } catch (e) { + // error(e, 'http test') + // } + // }, + //test_lint: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-lint" + // } catch (e) { + // error(e, 'lint') + // } + //} + ) + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh "docker run --rm -v $WORKSPACE/.openshift:/tmp -w /tmp/ -e KUBECONFIG=.kubeconfig michelesr/oc sh -c 'oc process -n ${env.OPENSHIFT_PROJECT} -f ${env.OPENSHIFT_APP_YAML} -v BRANCH=${env.BRANCH} -v AMAZEEIO_SERVICE=${env.AMAZEEIO_SERVICE} -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT}| oc apply -n ${env.OPENSHIFT_PROJECT} -f -'" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.AMAZEEIO_SERVICE}-registry") { + try { + sh "docker tag ${env.IMAGE} registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.openshift docker push registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + // on master we can't check the deployment as we are deploying ourselves and the master is rebooted during our own deployment :) + if (env.TARGET_BRANCH != 'master') { + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: 'https://console.appuio.ch:443', authToken: OPENSHIFT_TOKEN, depCfg: "${env.AMAZEEIO_SERVICE}-${env.BRANCH}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + } + + deployed() + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> failed* \nStep: ${step} " + sendslack('danger', message) + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} diff --git a/services/jenkins/adminuser.groovy b/services/jenkins/adminuser.groovy new file mode 100644 index 000000000..037329a2e --- /dev/null +++ b/services/jenkins/adminuser.groovy @@ -0,0 +1,40 @@ +#!groovy +import hudson.security.* +import jenkins.security.ApiTokenProperty +import jenkins.model.* +import org.jenkinsci.plugins.googlelogin.* +import hudson.util.Secret +import hudson.model.User + +def instance = Jenkins.getInstance() + +println "--> Checking if security has been set already" + +if (!instance.isUseSecurity()) { + println "--> creating local user 'admin'" + + def hudsonRealm = new HudsonPrivateSecurityRealm(false) + hudsonRealm.createAccount('admin', System.getenv("ADMIN_PASSWORD")) + instance.setSecurityRealm(hudsonRealm) + + def strategy = new FullControlOnceLoggedInAuthorizationStrategy() + strategy.setAllowAnonymousRead(false) + instance.setAuthorizationStrategy(strategy) + instance.save() +} + + +// this sets the api token of user admin to the md5 of 'fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR': 506accdcb5ade450a3b5cb2ce46cb8b8 +// see https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/jenkins/security/ApiTokenProperty.java#L105 +// which uses https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/Util.java#L763 which uses md5 +def username = 'admin' +def seed = 'fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR' + +def user = User.get(username) + +def tokprop = user.getProperty(ApiTokenProperty.class) +tokprop.apiToken = Secret.fromString(seed) +user.save() + +println "--> setting api token of user 'admin' to:" +println(tokprop.getApiTokenInsecure()) \ No newline at end of file diff --git a/services/jenkins/amazee-jenkins.sh b/services/jenkins/amazee-jenkins.sh new file mode 100755 index 000000000..c79dfc7ff --- /dev/null +++ b/services/jenkins/amazee-jenkins.sh @@ -0,0 +1,9 @@ +#! /bin/bash -e + +if [[ -L ${JENKINS_HOME}/caches ]]; then + echo "cache directory already linked"; +else + /bin/ln -s /tmp ${JENKINS_HOME}/caches ; +fi + +exec /usr/local/bin/jenkins.sh diff --git a/services/jenkins/github-amazeeio-bearer-token.groovy b/services/jenkins/github-amazeeio-bearer-token.groovy new file mode 100644 index 000000000..a7e34d96e --- /dev/null +++ b/services/jenkins/github-amazeeio-bearer-token.groovy @@ -0,0 +1,8 @@ +#!groovy +import com.cloudbees.plugins.credentials.impl.*; +import com.cloudbees.plugins.credentials.*; +import com.cloudbees.plugins.credentials.domains.*; + +Credentials c = (Credentials) new UsernamePasswordCredentialsImpl(CredentialsScope.GLOBAL,"amazeeio-github-bearer-token", "amazeeio-github-bearer-token", "amazeeio", "3dfc013c579f85bbcd4cd0c5d11cda325a086ec8") + +SystemCredentialsProvider.getInstance().getStore().addCredentials(Domain.global(), c) diff --git a/services/jenkins/io.fabric8.jenkins.openshiftsync.GlobalPluginConfiguration.xml b/services/jenkins/io.fabric8.jenkins.openshiftsync.GlobalPluginConfiguration.xml new file mode 100644 index 000000000..832c1123b --- /dev/null +++ b/services/jenkins/io.fabric8.jenkins.openshiftsync.GlobalPluginConfiguration.xml @@ -0,0 +1,6 @@ + + + false + + default + \ No newline at end of file diff --git a/services/jenkins/no-executors-master.groovy b/services/jenkins/no-executors-master.groovy new file mode 100644 index 000000000..cb80d0488 --- /dev/null +++ b/services/jenkins/no-executors-master.groovy @@ -0,0 +1,10 @@ +#!groovy +import hudson.security.* +import jenkins.model.* + +def instance = Jenkins.getInstance() + +println "--> Setting Executors to 0, we only run stuff on slaves" + +instance.numExecutors = 0 +instance.save() diff --git a/services/jenkins/nodes/alpha/config.xml b/services/jenkins/nodes/alpha/config.xml new file mode 100644 index 000000000..57379aa60 --- /dev/null +++ b/services/jenkins/nodes/alpha/config.xml @@ -0,0 +1,12 @@ + + + alpha + + /home/jenkins + 12 + NORMAL + + + + + diff --git a/services/jenkins/nodes/bravo/config.xml b/services/jenkins/nodes/bravo/config.xml new file mode 100644 index 000000000..5e4292f44 --- /dev/null +++ b/services/jenkins/nodes/bravo/config.xml @@ -0,0 +1,12 @@ + + + bravo + + /home/jenkins + 12 + NORMAL + + + + + diff --git a/services/jenkins/vshn-gitlab-access-token.groovy b/services/jenkins/vshn-gitlab-access-token.groovy new file mode 100644 index 000000000..a836a0761 --- /dev/null +++ b/services/jenkins/vshn-gitlab-access-token.groovy @@ -0,0 +1,8 @@ +#!groovy +import com.cloudbees.plugins.credentials.impl.*; +import com.cloudbees.plugins.credentials.*; +import com.cloudbees.plugins.credentials.domains.*; + +Credentials c = (Credentials) new UsernamePasswordCredentialsImpl(CredentialsScope.GLOBAL,"vshn-gitlab-access-token", "vshn-gitlab-access-token", "michael.schmid", "r9HZtVjqWXYFNDtm36xH") + +SystemCredentialsProvider.getInstance().getStore().addCredentials(Domain.global(), c) diff --git a/services/kibana/.openshift/development.app.yml b/services/kibana/.openshift/development.app.yml new file mode 100644 index 000000000..685bcaf5f --- /dev/null +++ b/services/kibana/.openshift/development.app.yml @@ -0,0 +1,111 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: TAG + description: Which tag should be deployed + required: true + - name: NAME + description: How is the resources are called + required: true + - name: SHORT_NAME + description: Name of resources in max 24 chars + required: true + - name: SITEGROUP + description: Name of the site group + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true + - name: ELASTICSEARCH_URL + description: URL of elasticsearch to contact to +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${SITEGROUP}:${TAG} + name: ${NAME} + ports: + - containerPort: 5601 + name: http + protocol: TCP + env: + - name: ELASTICSEARCH_URL + value: ${ELASTICSEARCH_URL} + resources: + limits: + cpu: 500m + memory: 800Mi + requests: + cpu: 200m + memory: 300Mi + readinessProbe: + httpGet: + port: http + initialDelaySeconds: 20 + livenessProbe: + httpGet: + port: http + initialDelaySeconds: 120 + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${NAME} + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: http + targetPort: http + port: 80 + selector: + app: ${NAME} + deploymentconfig: ${NAME} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + host: ${NAME}.appuio.amazeeio.review + port: + targetPort: http + to: + kind: Service + name: ${SHORT_NAME} diff --git a/services/kibana/.openshift/production.app.yml b/services/kibana/.openshift/production.app.yml new file mode 100644 index 000000000..007c2a0ce --- /dev/null +++ b/services/kibana/.openshift/production.app.yml @@ -0,0 +1,112 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: TAG + description: Which tag should be deployed + required: true + - name: NAME + description: How is the resources are called + required: true + - name: SHORT_NAME + description: Name of resources in max 24 chars + required: true + - name: SITEGROUP + description: Name of the site group + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true + - name: ELASTICSEARCH_URL + description: URL of elasticsearch to contact to +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${SITEGROUP}:${TAG} + name: ${NAME} + ports: + - containerPort: 5601 + name: http + protocol: TCP + env: + - name: ELASTICSEARCH_URL + value: ${ELASTICSEARCH_URL} + resources: + limits: + cpu: 500m + memory: 800Mi + requests: + cpu: 200m + memory: 300Mi + readinessProbe: + httpGet: + port: http + initialDelaySeconds: 20 + livenessProbe: + httpGet: + port: http + initialDelaySeconds: 120 + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${NAME} + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: http + targetPort: http + port: 80 + selector: + app: ${NAME} + deploymentconfig: ${NAME} +## ## No route for production right now, until https://ticket.vshn.net/browse/AMZE-329 is figured out +##- apiVersion: v1 +## kind: Route +## metadata: +## creationTimestamp: null +## labels: +## app: ${NAME} +## name: ${NAME} +## spec: +## host: kibana.amazeeio.cloud +## port: +## targetPort: http +## to: +## kind: Service +## name: ${SHORT_NAME} diff --git a/services/kibana/Dockerfile b/services/kibana/Dockerfile new file mode 100644 index 000000000..3c9306917 --- /dev/null +++ b/services/kibana/Dockerfile @@ -0,0 +1,10 @@ +FROM docker.elastic.co/kibana/kibana:5.4.0 + +USER root + +RUN curl -sLo /usr/local/bin/fix-permissions https://raw.githubusercontent.com/sclorg/s2i-base-container/master/bin/fix-permissions && \ + chmod +x /usr/local/bin/fix-permissions + +RUN fix-permissions /usr/share/kibana + +ENV xpack.security.enabled=false \ No newline at end of file diff --git a/services/kibana/Jenkinsfile b/services/kibana/Jenkinsfile new file mode 100644 index 000000000..a305df26c --- /dev/null +++ b/services/kibana/Jenkinsfile @@ -0,0 +1,132 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-').replaceAll('/','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.SITEGROUP = "kibana" + env.NAME = "${env.SITEGROUP}-${env.BRANCH}" + + // Openshift does not really like names longer then 24 chars or ending in a hyphen. + // This strips that, but also makes sure that if the string is already less then 24 + // characters, Java is not confused. + // See: http://stackoverflow.com/questions/953527/java-substring-string-index-out-of-range + env.SHORT_NAME = "${env.SITEGROUP}-${env.BRANCH}" + if (env.SHORT_NAME.length() > 24) { + env.SHORT_NAME = env.SHORT_NAME.substring(0, 24).replaceFirst(/[^a-z0-9]+$/, ''); + } + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + env.ELASTICSEARCH_URL = "http://elasticsearch-${env.TARGET_BRANCH}:9200" + + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + env.OPENSHIFT_REGISTRY = "registry.appuio.ch" + env.OPENSHIFT_CONSOLE = "https://console.appuio.ch" + env.OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.OPENSHIFT_APP_YAML = "development.app.yml" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.SITEGROUP}/detail" + + if (env.BRANCH == 'master') { + env.OPENSHIFT_APP_YAML = "production.app.yml" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh """docker run --rm -v $WORKSPACE/.openshift:/tmp -e OPENSHIFT_CONSOLE=${env.OPENSHIFT_CONSOLE} -e OPENSHIFT_TOKEN=${env.OPENSHIFT_TOKEN} amazeeio/oc sh -c 'oc process \ + -n ${env.OPENSHIFT_PROJECT} \ + -f /tmp/${env.OPENSHIFT_APP_YAML} \ + -v TAG=${env.BRANCH} \ + -v NAME=${env.NAME} \ + -v SHORT_NAME=${env.SHORT_NAME} \ + -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} \ + -v SITEGROUP=${env.SITEGROUP} \ + -v ELASTICSEARCH_URL=${env.ELASTICSEARCH_URL} \ + | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'""" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.SITEGROUP}-registry") { + try { + sh "docker tag ${env.IMAGE} ${env.OPENSHIFT_REGISTRY}/${env.OPENSHIFT_PROJECT}/${env.SITEGROUP}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.docker docker login -u=jenkins -p='${env.OPENSHIFT_TOKEN}' ${env.OPENSHIFT_REGISTRY}" + sh "DOCKER_CONFIG=$WORKSPACE/.docker docker push ${env.OPENSHIFT_REGISTRY}/${env.OPENSHIFT_PROJECT}/${env.SITEGROUP}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: "${env.OPENSHIFT_CONSOLE}", authToken: env.OPENSHIFT_TOKEN, depCfg: "${env.NAME}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.SITEGROUP}/${env.BRANCH_NAME}] >${url}|Build #${env.BUILD_NUMBER}> failed* \\nStep: ${step} " + sendslack('danger', message) + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.SITEGROUP}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \\n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.SITEGROUP}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} \ No newline at end of file diff --git a/services/kibana/README.md b/services/kibana/README.md new file mode 100644 index 000000000..d952f0821 --- /dev/null +++ b/services/kibana/README.md @@ -0,0 +1,5 @@ +# amazeeio-kibana + +This is a kibana used inside the amazee.io lagoon deployment system + +It is used as an UI for all log messages logged into elasticsearch, for mostly for debugging and statistical purposes. \ No newline at end of file diff --git a/services/logs2slack/.babelrc b/services/logs2slack/.babelrc new file mode 100644 index 000000000..bb092de4b --- /dev/null +++ b/services/logs2slack/.babelrc @@ -0,0 +1,9 @@ +{ + "presets": ["es2015"], + "plugins": [ + "transform-flow-strip-types", + "transform-regenerator", + "syntax-async-functions", + "transform-object-rest-spread" + ] +} diff --git a/services/logs2slack/.dockerignore b/services/logs2slack/.dockerignore new file mode 100644 index 000000000..06ef0ae48 --- /dev/null +++ b/services/logs2slack/.dockerignore @@ -0,0 +1,5 @@ +.openshift/* +.cache/* +node_modules/* +Jenkinsfile +.dockerignore \ No newline at end of file diff --git a/services/logs2slack/.flowconfig b/services/logs2slack/.flowconfig new file mode 100644 index 000000000..4a58bdcde --- /dev/null +++ b/services/logs2slack/.flowconfig @@ -0,0 +1,7 @@ +[ignore] + +[include] + +[libs] + +[options] diff --git a/services/logs2slack/.gitignore b/services/logs2slack/.gitignore new file mode 100644 index 000000000..dd87e2d73 --- /dev/null +++ b/services/logs2slack/.gitignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/logs2slack/.openshift/.kubeconfig b/services/logs2slack/.openshift/.kubeconfig new file mode 100644 index 000000000..a79c97f77 --- /dev/null +++ b/services/logs2slack/.openshift/.kubeconfig @@ -0,0 +1,17 @@ +apiVersion: v1 +clusters: +- cluster: + server: https://console.appuio.ch:443 + name: appuio +contexts: +- context: + cluster: appuio + user: system:serviceaccount:amze-amazeeio:jenkins + name: appuio:amze-amazeeio:jenkins +current-context: appuio:amze-amazeeio:jenkins +kind: Config +preferences: {} +users: +- name: system:serviceaccount:amze-amazeeio:jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg diff --git a/services/logs2slack/.openshift/README.md b/services/logs2slack/.openshift/README.md new file mode 100644 index 000000000..6a67200e6 --- /dev/null +++ b/services/logs2slack/.openshift/README.md @@ -0,0 +1,53 @@ +# OpenShift + +## Jenkins Access to Openshift + +In order for Jenkins to deploy to openshift we need to create an openshift serviceaccount that has access to our project (regular username/password logins expire after a couple of hours, not very good for a CI/CD system) + +1. Login as your user + + oc login + +2. Create new serviceaccount with the name jenkins + + oc create serviceaccount jenkins + +3. Give this serviceaccount edit access (see the name of the serviceaccount contains the project name!) + + oc policy add-role-to-user edit system:serviceaccount:appuio-demo2:jenkins2 + +4. Get access token from serviceaccount, with first getting the name of the token and then accessing the secret + + oc describe serviceaccount jenkins2 + + oc describe secret jenkins2-token-7tawv + +5. Add the token inside the .kubeconfig: + + + apiVersion: v1 + clusters: + - cluster: + server: https://console.appuio.ch:443 + name: appuio + contexts: + - context: + cluster: appuio + user: jenkins + name: appuio:jenkins + current-context: appuio:jenkins + kind: Config + preferences: {} + users: + - name: jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLXJhcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJqZW5raW5zLXRva2VuLTFocW42Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImplbmtpbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZmM4ZTIzMi05ZDBhLTExZTYtYTdlZi1mYTE2M2VkOTVkYWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YW16ZS1yYXM6amVua2lucyJ9.BAeU6zXl0uPCD2DRGJeV1oxRbk3sA3M5tn7K6xPh5iv-etS8Q2lsF-OFwO7HVycvEckXh31KNUmQTzvn3keSDT0a8BqViBhGPKCfAw-vf3ElUnGFDCWN9IpITKJBWIxVdGyd5sPltBWkAVxl9JOwnu1vrBvSioYqwjzYkjStbfp7pzLXhSld9G4AXA_zBntDW633mujllT0z_5IMSJX_gKSZcrTN78KLdCMmuvIT_m7xZMp_r52daEu67DjsjYtVqVx4BsDVPdUZRQ9eJtodbtZ-FJV9w0W4H9nX3iyqCk7OriD4Xt68Z5cUK0tR-4hyyh_hL31c6vzGb_VosmAWWg + + +6. Test the kubeconfig - should return `system:serviceaccount:appuio-demo2:jenkins2` + + KUBECONFIG=.openshift/.kubeconfig oc whoami + +7. Create a Docker authentication config.json so Jenkins can push into the Openshift docker Registry + + DOCKER_CONFIG=.openshift/ docker login -u jenkins2 -p $(KUBECONFIG=.openshift/.kubeconfig oc whoami -t) registry.appuio.ch \ No newline at end of file diff --git a/services/logs2slack/.openshift/config.json b/services/logs2slack/.openshift/config.json new file mode 100644 index 000000000..a526a5d46 --- /dev/null +++ b/services/logs2slack/.openshift/config.json @@ -0,0 +1,7 @@ +{ + "auths": { + "registry.appuio.ch": { + "auth": "amVua2luczI6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoYlhwbExXRnRZWHBsWldsdklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltcGxibXRwYm5NdGRHOXJaVzR0TjJGcU5tOGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lhbVZ1YTJsdWN5SXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqRmlOelZoWXpkakxXTTJOV010TVRGbE5pMWlOelUxTFdaaE1UWXpaVE5sWXpjellTSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBoYlhwbExXRnRZWHBsWldsdk9tcGxibXRwYm5NaWZRLkRUSlpDd3BFWFlnenlaSmtDZHF6a0dHc0hWQWhNc0J0OGFtcmkydGZQYl9mOTZrZWxHOWFnVXBudzdZRmcweWkybEdGcjhTU1lMOEd2dXhuNHcwMXZXdHNMc2JhMjg5cFJNOUhiXzFJU2F0U1NWNTM5TXdQR2dpN2ZVN3F6Yk00ZzJpVmIxaW1sQkhJbW9tSkNXVzJDSW41aEF5VUR4Snd5OVh2Y0hyajZUYjE0X0c2YnVLT3JpR0JaejZ4Qmk5WWpOanh5eTlZem5WOVhkU1Z4THNXQjdFaG5yUnhveElFaWVPV0RaUHF1am9tSUFYczZ0TzdhcGFnNE1kZFl6LTVYdTg2Vm15SjZkS05KZUt2RUh0V1hUM081SUVqMEhmdlZGSnlKRTFKR3BfLVhnTzg4Ujh0WF9yOWYySU9PLXpyMU9OODVubUpjTDlGTGRLaFE4Z3dRZw==" + } + } +} \ No newline at end of file diff --git a/services/logs2slack/.openshift/development.app.yml b/services/logs2slack/.openshift/development.app.yml new file mode 100644 index 000000000..55d3a032a --- /dev/null +++ b/services/logs2slack/.openshift/development.app.yml @@ -0,0 +1,73 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: ${AMAZEEIO_SERVICE}-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: RABBITMQ_HOST + description: Hostname of the RabbitMQ Server to connect to + required: true + - name: AMAZEEIO_API_HOST + description: Hostname of the API + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: AMAZEEIO_API_HOST + value: ${AMAZEEIO_API_HOST} + - name: NODE_ENV + value: production + resources: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 200m + memory: 200Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} diff --git a/services/logs2slack/.openshift/production.app.yml b/services/logs2slack/.openshift/production.app.yml new file mode 100644 index 000000000..707b38997 --- /dev/null +++ b/services/logs2slack/.openshift/production.app.yml @@ -0,0 +1,73 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: ${AMAZEEIO_SERVICE}-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: RABBITMQ_HOST + description: Hostname of the RabbitMQ Server to connect to + required: true + - name: AMAZEEIO_API_HOST + description: Hostname of the API + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: AMAZEEIO_API_HOST + value: ${AMAZEEIO_API_HOST} + - name: NODE_ENV + value: production + resources: + limits: + cpu: 250m + memory: 250Mi + requests: + cpu: 250m + memory: 250Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} diff --git a/services/logs2slack/.vscode/settings.json b/services/logs2slack/.vscode/settings.json new file mode 100644 index 000000000..4f2bf5f8a --- /dev/null +++ b/services/logs2slack/.vscode/settings.json @@ -0,0 +1,4 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "javascript.validate.enable": false +} \ No newline at end of file diff --git a/services/logs2slack/Dockerfile b/services/logs2slack/Dockerfile new file mode 100644 index 000000000..3ebfe260e --- /dev/null +++ b/services/logs2slack/Dockerfile @@ -0,0 +1,23 @@ +FROM amazeeio/centos7-node:node6 + +# Use changes to package.json and yarn.lock to see if Docker should use cached nodejs deps +COPY package.json yarn.lock /app/ + +# Telling yarn and node that we are gonna be production + ENV NODE_ENV production + +# Now copy in our application code. +COPY . /app + +# run yarn install and remove the .yarn-cache as we don't need that on our image +RUN yarn install --pure-lockfile && rm -rf $HOME/.cache/yarn + +# building our node app +RUN yarn run build + +# Fixing permissions of the app folder so that the openshift user can access it with write +RUN chmod g+rw -R /app + +CMD bash -c "yarn run start" + +EXPOSE 7777 diff --git a/services/logs2slack/Jenkinsfile b/services/logs2slack/Jenkinsfile new file mode 100644 index 000000000..85364aaf7 --- /dev/null +++ b/services/logs2slack/Jenkinsfile @@ -0,0 +1,152 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.OPENSHIFT_APP_YAML = "development.app.yml" + env.AMAZEEIO_SERVICE = "logs2slack" + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.AMAZEEIO_SERVICE}/detail" + + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + env.RABBITMQ_HOST = "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@rabbitmq-${env.TARGET_BRANCH}" + env.AMAZEEIO_API_HOST = "http://api-${env.TARGET_BRANCH}.appuio.amazeeio.review" + + if (env.BRANCH == 'master') { + env.OPENSHIFT_APP_YAML = "production.app.yml" + env.AMAZEEIO_API_HOST = "https://api.amazeeio.cloud" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + stage ('tests') { + // Running Tests in parallel, for faster completion + parallel ( + //test_unit: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-unit" + // } catch (e) { + // error(e, 'unit test') + // } + //}, + // test_http: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-http-ssr" + // } catch (e) { + // error(e, 'http test') + // } + // }, + //test_lint: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-lint" + // } catch (e) { + // error(e, 'lint') + // } + //} + ) + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh "docker run --rm -v $WORKSPACE/.openshift:/tmp -w /tmp/ -e KUBECONFIG=.kubeconfig michelesr/oc sh -c 'oc process -n ${env.OPENSHIFT_PROJECT} -f ${env.OPENSHIFT_APP_YAML} -v BRANCH=${env.BRANCH} -v RABBITMQ_HOST=${env.RABBITMQ_HOST} -v AMAZEEIO_API_HOST=${env.AMAZEEIO_API_HOST} -v AMAZEEIO_SERVICE=${env.AMAZEEIO_SERVICE} -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.AMAZEEIO_SERVICE}-registry") { + try { + sh "docker tag ${env.IMAGE} registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.openshift docker push registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + } catch (e) { + error(e, 'docker tag and push') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: 'https://console.appuio.ch:443', authToken: OPENSHIFT_TOKEN, depCfg: "${env.AMAZEEIO_SERVICE}-${env.BRANCH}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + + stage ('cleanup Docker Images') { + cleanupImage() + } + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> failed* \nStep: ${step} " + sendslack('danger', message) + cleanupImage() + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} + +def cleanupImage() { + try { + sh "docker rmi -f ${env.IMAGE}" + } catch (e) { + echo "Removal of Docker image '${env.IMAGE}' failed, ignoring this." + } +} diff --git a/services/logs2slack/LICENSE.md b/services/logs2slack/LICENSE.md new file mode 100644 index 000000000..79b52093e --- /dev/null +++ b/services/logs2slack/LICENSE.md @@ -0,0 +1,11 @@ +The MIT License (MIT) +===================== + +Copyright (c) 2014 Rod Vagg +--------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/services/logs2slack/README.md b/services/logs2slack/README.md new file mode 100644 index 000000000..c723143cc --- /dev/null +++ b/services/logs2slack/README.md @@ -0,0 +1,2 @@ +# logs2slack + diff --git a/services/logs2slack/docker-compose.yaml b/services/logs2slack/docker-compose.yaml new file mode 100644 index 000000000..0985a160d --- /dev/null +++ b/services/logs2slack/docker-compose.yaml @@ -0,0 +1,23 @@ +version: '2' +services: + rabbitmq: + image: rabbitmq + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + ports: + - "15672:15672" + - "5672:5672" + webhooks: + build: . + command: yarn run dev + ports: + - "7777:7777" + user: "11111112" + links: + - rabbitmq:3-management + environment: + - RABBITMQ_HOST=rabbitmq + volumes: + - ./src:/app/src + - ./package.json:/app/package.json diff --git a/services/logs2slack/flow-typed/npm/amqp-connection-manager_vx.x.x.js b/services/logs2slack/flow-typed/npm/amqp-connection-manager_vx.x.x.js new file mode 100644 index 000000000..0157a3e0b --- /dev/null +++ b/services/logs2slack/flow-typed/npm/amqp-connection-manager_vx.x.x.js @@ -0,0 +1,53 @@ +// flow-typed signature: 3ddc7df9039bdc85876cd47fd95c3a7c +// flow-typed version: <>/amqp-connection-manager_v^1.3.5/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'amqp-connection-manager' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'amqp-connection-manager' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'amqp-connection-manager/lib/AmqpConnectionManager' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/ChannelWrapper' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/helpers' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'amqp-connection-manager/lib/AmqpConnectionManager.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/AmqpConnectionManager'>; +} +declare module 'amqp-connection-manager/lib/ChannelWrapper.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/ChannelWrapper'>; +} +declare module 'amqp-connection-manager/lib/helpers.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/helpers'>; +} +declare module 'amqp-connection-manager/lib/index.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/index'>; +} diff --git a/services/logs2slack/flow-typed/npm/amqplib_vx.x.x.js b/services/logs2slack/flow-typed/npm/amqplib_vx.x.x.js new file mode 100644 index 000000000..45cf39175 --- /dev/null +++ b/services/logs2slack/flow-typed/npm/amqplib_vx.x.x.js @@ -0,0 +1,410 @@ +// flow-typed signature: 22527bc8d3379eac0db4cfac36bdc337 +// flow-typed version: <>/amqplib_vhttps://registry.npmjs.org/amqplib/-/amqplib-0.4.2.tgz/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'amqplib' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'amqplib' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'amqplib/callback_api' { + declare module.exports: any; +} + +declare module 'amqplib/channel_api' { + declare module.exports: any; +} + +declare module 'amqplib/examples/headers' { + declare module.exports: any; +} + +declare module 'amqplib/examples/ssl' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/new_task' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/rpc_client' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/rpc_server' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/send' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/worker' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/new_task' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/rpc_client' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/rpc_server' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/send' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/worker' { + declare module.exports: any; +} + +declare module 'amqplib/examples/waitForConfirms' { + declare module.exports: any; +} + +declare module 'amqplib/lib/api_args' { + declare module.exports: any; +} + +declare module 'amqplib/lib/bitset' { + declare module.exports: any; +} + +declare module 'amqplib/lib/callback_model' { + declare module.exports: any; +} + +declare module 'amqplib/lib/channel_model' { + declare module.exports: any; +} + +declare module 'amqplib/lib/channel' { + declare module.exports: any; +} + +declare module 'amqplib/lib/codec' { + declare module.exports: any; +} + +declare module 'amqplib/lib/connect' { + declare module.exports: any; +} + +declare module 'amqplib/lib/connection' { + declare module.exports: any; +} + +declare module 'amqplib/lib/credentials' { + declare module.exports: any; +} + +declare module 'amqplib/lib/defs' { + declare module.exports: any; +} + +declare module 'amqplib/lib/error' { + declare module.exports: any; +} + +declare module 'amqplib/lib/format' { + declare module.exports: any; +} + +declare module 'amqplib/lib/frame' { + declare module.exports: any; +} + +declare module 'amqplib/lib/heartbeat' { + declare module.exports: any; +} + +declare module 'amqplib/lib/mux' { + declare module.exports: any; +} + +declare module 'amqplib/test/bitset' { + declare module.exports: any; +} + +declare module 'amqplib/test/callback_api' { + declare module.exports: any; +} + +declare module 'amqplib/test/channel_api' { + declare module.exports: any; +} + +declare module 'amqplib/test/channel' { + declare module.exports: any; +} + +declare module 'amqplib/test/codec' { + declare module.exports: any; +} + +declare module 'amqplib/test/connect' { + declare module.exports: any; +} + +declare module 'amqplib/test/connection' { + declare module.exports: any; +} + +declare module 'amqplib/test/data' { + declare module.exports: any; +} + +declare module 'amqplib/test/frame' { + declare module.exports: any; +} + +declare module 'amqplib/test/mux' { + declare module.exports: any; +} + +declare module 'amqplib/test/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'amqplib/callback_api.js' { + declare module.exports: $Exports<'amqplib/callback_api'>; +} +declare module 'amqplib/channel_api.js' { + declare module.exports: $Exports<'amqplib/channel_api'>; +} +declare module 'amqplib/examples/headers.js' { + declare module.exports: $Exports<'amqplib/examples/headers'>; +} +declare module 'amqplib/examples/ssl.js' { + declare module.exports: $Exports<'amqplib/examples/ssl'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log_direct'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log_topic'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log'>; +} +declare module 'amqplib/examples/tutorials/callback_api/new_task.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/new_task'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs_direct'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs_topic'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive'>; +} +declare module 'amqplib/examples/tutorials/callback_api/rpc_client.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/rpc_client'>; +} +declare module 'amqplib/examples/tutorials/callback_api/rpc_server.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/rpc_server'>; +} +declare module 'amqplib/examples/tutorials/callback_api/send.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/send'>; +} +declare module 'amqplib/examples/tutorials/callback_api/worker.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/worker'>; +} +declare module 'amqplib/examples/tutorials/emit_log_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log_direct'>; +} +declare module 'amqplib/examples/tutorials/emit_log_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log_topic'>; +} +declare module 'amqplib/examples/tutorials/emit_log.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log'>; +} +declare module 'amqplib/examples/tutorials/new_task.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/new_task'>; +} +declare module 'amqplib/examples/tutorials/receive_logs_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs_direct'>; +} +declare module 'amqplib/examples/tutorials/receive_logs_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs_topic'>; +} +declare module 'amqplib/examples/tutorials/receive_logs.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs'>; +} +declare module 'amqplib/examples/tutorials/receive.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive'>; +} +declare module 'amqplib/examples/tutorials/rpc_client.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/rpc_client'>; +} +declare module 'amqplib/examples/tutorials/rpc_server.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/rpc_server'>; +} +declare module 'amqplib/examples/tutorials/send.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/send'>; +} +declare module 'amqplib/examples/tutorials/worker.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/worker'>; +} +declare module 'amqplib/examples/waitForConfirms.js' { + declare module.exports: $Exports<'amqplib/examples/waitForConfirms'>; +} +declare module 'amqplib/lib/api_args.js' { + declare module.exports: $Exports<'amqplib/lib/api_args'>; +} +declare module 'amqplib/lib/bitset.js' { + declare module.exports: $Exports<'amqplib/lib/bitset'>; +} +declare module 'amqplib/lib/callback_model.js' { + declare module.exports: $Exports<'amqplib/lib/callback_model'>; +} +declare module 'amqplib/lib/channel_model.js' { + declare module.exports: $Exports<'amqplib/lib/channel_model'>; +} +declare module 'amqplib/lib/channel.js' { + declare module.exports: $Exports<'amqplib/lib/channel'>; +} +declare module 'amqplib/lib/codec.js' { + declare module.exports: $Exports<'amqplib/lib/codec'>; +} +declare module 'amqplib/lib/connect.js' { + declare module.exports: $Exports<'amqplib/lib/connect'>; +} +declare module 'amqplib/lib/connection.js' { + declare module.exports: $Exports<'amqplib/lib/connection'>; +} +declare module 'amqplib/lib/credentials.js' { + declare module.exports: $Exports<'amqplib/lib/credentials'>; +} +declare module 'amqplib/lib/defs.js' { + declare module.exports: $Exports<'amqplib/lib/defs'>; +} +declare module 'amqplib/lib/error.js' { + declare module.exports: $Exports<'amqplib/lib/error'>; +} +declare module 'amqplib/lib/format.js' { + declare module.exports: $Exports<'amqplib/lib/format'>; +} +declare module 'amqplib/lib/frame.js' { + declare module.exports: $Exports<'amqplib/lib/frame'>; +} +declare module 'amqplib/lib/heartbeat.js' { + declare module.exports: $Exports<'amqplib/lib/heartbeat'>; +} +declare module 'amqplib/lib/mux.js' { + declare module.exports: $Exports<'amqplib/lib/mux'>; +} +declare module 'amqplib/test/bitset.js' { + declare module.exports: $Exports<'amqplib/test/bitset'>; +} +declare module 'amqplib/test/callback_api.js' { + declare module.exports: $Exports<'amqplib/test/callback_api'>; +} +declare module 'amqplib/test/channel_api.js' { + declare module.exports: $Exports<'amqplib/test/channel_api'>; +} +declare module 'amqplib/test/channel.js' { + declare module.exports: $Exports<'amqplib/test/channel'>; +} +declare module 'amqplib/test/codec.js' { + declare module.exports: $Exports<'amqplib/test/codec'>; +} +declare module 'amqplib/test/connect.js' { + declare module.exports: $Exports<'amqplib/test/connect'>; +} +declare module 'amqplib/test/connection.js' { + declare module.exports: $Exports<'amqplib/test/connection'>; +} +declare module 'amqplib/test/data.js' { + declare module.exports: $Exports<'amqplib/test/data'>; +} +declare module 'amqplib/test/frame.js' { + declare module.exports: $Exports<'amqplib/test/frame'>; +} +declare module 'amqplib/test/mux.js' { + declare module.exports: $Exports<'amqplib/test/mux'>; +} +declare module 'amqplib/test/util.js' { + declare module.exports: $Exports<'amqplib/test/util'>; +} diff --git a/services/logs2slack/flow-typed/npm/babel-cli_vx.x.x.js b/services/logs2slack/flow-typed/npm/babel-cli_vx.x.x.js new file mode 100644 index 000000000..90936acc2 --- /dev/null +++ b/services/logs2slack/flow-typed/npm/babel-cli_vx.x.x.js @@ -0,0 +1,108 @@ +// flow-typed signature: beb19de904b0159b454a839011b2f0f3 +// flow-typed version: <>/babel-cli_v^6.18.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-cli' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-cli' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-cli/bin/babel-doctor' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/_babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/dir' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/file' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/index' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-cli/bin/babel-doctor.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-doctor'>; +} +declare module 'babel-cli/bin/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-external-helpers'>; +} +declare module 'babel-cli/bin/babel-node.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-node'>; +} +declare module 'babel-cli/bin/babel.js' { + declare module.exports: $Exports<'babel-cli/bin/babel'>; +} +declare module 'babel-cli/index' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/index.js' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/lib/_babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/_babel-node'>; +} +declare module 'babel-cli/lib/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-external-helpers'>; +} +declare module 'babel-cli/lib/babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-node'>; +} +declare module 'babel-cli/lib/babel/dir.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/dir'>; +} +declare module 'babel-cli/lib/babel/file.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/file'>; +} +declare module 'babel-cli/lib/babel/index.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/index'>; +} +declare module 'babel-cli/lib/babel/util.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/util'>; +} diff --git a/services/logs2slack/flow-typed/npm/babel-core_vx.x.x.js b/services/logs2slack/flow-typed/npm/babel-core_vx.x.x.js new file mode 100644 index 000000000..fa0a81eac --- /dev/null +++ b/services/logs2slack/flow-typed/npm/babel-core_vx.x.x.js @@ -0,0 +1,192 @@ +// flow-typed signature: ac28d744323eadd55d2ad2588d34e2df +// flow-typed version: <>/babel-core_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-core' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-core' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-core/lib/api/browser' { + declare module.exports: any; +} + +declare module 'babel-core/lib/api/node' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/merge' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/normalize-ast' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/resolve' { + declare module.exports: any; +} + +declare module 'babel-core/lib/store' { + declare module.exports: any; +} + +declare module 'babel-core/lib/tools/build-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/index' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/logger' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/metadata' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/build-config-chain' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/config' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/index' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/option-manager' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/parsers' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/removed' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/internal-plugins/block-hoist' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/pipeline' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/plugin-pass' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/plugin' { + declare module.exports: any; +} + +declare module 'babel-core/lib/util' { + declare module.exports: any; +} + +declare module 'babel-core/register' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-core/index' { + declare module.exports: $Exports<'babel-core'>; +} +declare module 'babel-core/index.js' { + declare module.exports: $Exports<'babel-core'>; +} +declare module 'babel-core/lib/api/browser.js' { + declare module.exports: $Exports<'babel-core/lib/api/browser'>; +} +declare module 'babel-core/lib/api/node.js' { + declare module.exports: $Exports<'babel-core/lib/api/node'>; +} +declare module 'babel-core/lib/helpers/merge.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/merge'>; +} +declare module 'babel-core/lib/helpers/normalize-ast.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/normalize-ast'>; +} +declare module 'babel-core/lib/helpers/resolve.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/resolve'>; +} +declare module 'babel-core/lib/store.js' { + declare module.exports: $Exports<'babel-core/lib/store'>; +} +declare module 'babel-core/lib/tools/build-external-helpers.js' { + declare module.exports: $Exports<'babel-core/lib/tools/build-external-helpers'>; +} +declare module 'babel-core/lib/transformation/file/index.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/index'>; +} +declare module 'babel-core/lib/transformation/file/logger.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/logger'>; +} +declare module 'babel-core/lib/transformation/file/metadata.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/metadata'>; +} +declare module 'babel-core/lib/transformation/file/options/build-config-chain.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/build-config-chain'>; +} +declare module 'babel-core/lib/transformation/file/options/config.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/config'>; +} +declare module 'babel-core/lib/transformation/file/options/index.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/index'>; +} +declare module 'babel-core/lib/transformation/file/options/option-manager.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/option-manager'>; +} +declare module 'babel-core/lib/transformation/file/options/parsers.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/parsers'>; +} +declare module 'babel-core/lib/transformation/file/options/removed.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/removed'>; +} +declare module 'babel-core/lib/transformation/internal-plugins/block-hoist.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/block-hoist'>; +} +declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/shadow-functions'>; +} +declare module 'babel-core/lib/transformation/pipeline.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/pipeline'>; +} +declare module 'babel-core/lib/transformation/plugin-pass.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/plugin-pass'>; +} +declare module 'babel-core/lib/transformation/plugin.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/plugin'>; +} +declare module 'babel-core/lib/util.js' { + declare module.exports: $Exports<'babel-core/lib/util'>; +} +declare module 'babel-core/register.js' { + declare module.exports: $Exports<'babel-core/register'>; +} diff --git a/services/logs2slack/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js b/services/logs2slack/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js new file mode 100644 index 000000000..45456f9af --- /dev/null +++ b/services/logs2slack/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 5a103fdda313008fdca7bebe21e57625 +// flow-typed version: <>/babel-plugin-syntax-async-functions_v^6.13.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-syntax-async-functions' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-syntax-async-functions' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-syntax-async-functions/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-syntax-async-functions/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-syntax-async-functions/lib/index'>; +} diff --git a/services/logs2slack/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js b/services/logs2slack/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js new file mode 100644 index 000000000..5b2ee307e --- /dev/null +++ b/services/logs2slack/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 2338f781b6ad44daa64ebdfeb6dfa8a2 +// flow-typed version: <>/babel-plugin-transform-flow-strip-types_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-flow-strip-types' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-flow-strip-types' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-flow-strip-types/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-flow-strip-types/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-flow-strip-types/lib/index'>; +} diff --git a/services/logs2slack/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js b/services/logs2slack/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js new file mode 100644 index 000000000..2ae1ecfe5 --- /dev/null +++ b/services/logs2slack/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 8858d79f83612f0bb3a574ae5ae9234d +// flow-typed version: <>/babel-plugin-transform-regenerator_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-regenerator' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-regenerator' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-regenerator/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-regenerator/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-regenerator/lib/index'>; +} diff --git a/services/logs2slack/flow-typed/npm/babel-preset-es2015_vx.x.x.js b/services/logs2slack/flow-typed/npm/babel-preset-es2015_vx.x.x.js new file mode 100644 index 000000000..91438db13 --- /dev/null +++ b/services/logs2slack/flow-typed/npm/babel-preset-es2015_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 26c4ebbcdba0a8e2ddf27f0591f5b220 +// flow-typed version: <>/babel-preset-es2015_v^6.18.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-es2015' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-es2015' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-es2015/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-es2015/lib/index.js' { + declare module.exports: $Exports<'babel-preset-es2015/lib/index'>; +} diff --git a/services/logs2slack/flow-typed/npm/bl_vx.x.x.js b/services/logs2slack/flow-typed/npm/bl_vx.x.x.js new file mode 100644 index 000000000..53fab3cbb --- /dev/null +++ b/services/logs2slack/flow-typed/npm/bl_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 2fa1bf3f484943a1d0f8c19ab090255b +// flow-typed version: <>/bl_v~1.1.2/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'bl' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'bl' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'bl/bl' { + declare module.exports: any; +} + +declare module 'bl/test/test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'bl/bl.js' { + declare module.exports: $Exports<'bl/bl'>; +} +declare module 'bl/test/test.js' { + declare module.exports: $Exports<'bl/test/test'>; +} diff --git a/services/logs2slack/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js b/services/logs2slack/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js new file mode 100644 index 000000000..fd33d73eb --- /dev/null +++ b/services/logs2slack/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js @@ -0,0 +1,38 @@ +// flow-typed signature: bf317b1ec6a1c6f983be1f89706e1779 +// flow-typed version: <>/buffer-equal-constant-time_v~1.0.1/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'buffer-equal-constant-time' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'buffer-equal-constant-time' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'buffer-equal-constant-time/test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'buffer-equal-constant-time/index' { + declare module.exports: $Exports<'buffer-equal-constant-time'>; +} +declare module 'buffer-equal-constant-time/index.js' { + declare module.exports: $Exports<'buffer-equal-constant-time'>; +} +declare module 'buffer-equal-constant-time/test.js' { + declare module.exports: $Exports<'buffer-equal-constant-time/test'>; +} diff --git a/services/logs2slack/flow-typed/npm/flow-bin_v0.x.x.js b/services/logs2slack/flow-typed/npm/flow-bin_v0.x.x.js new file mode 100644 index 000000000..c538e2086 --- /dev/null +++ b/services/logs2slack/flow-typed/npm/flow-bin_v0.x.x.js @@ -0,0 +1,6 @@ +// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 +// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x + +declare module "flow-bin" { + declare module.exports: string; +} diff --git a/services/logs2slack/flow-typed/npm/jest_v18.x.x.js b/services/logs2slack/flow-typed/npm/jest_v18.x.x.js new file mode 100644 index 000000000..f4202e82a --- /dev/null +++ b/services/logs2slack/flow-typed/npm/jest_v18.x.x.js @@ -0,0 +1,439 @@ +// flow-typed signature: f9adc1fe5500052e55205636d0f376a7 +// flow-typed version: c17c09b83f/jest_v18.x.x/flow_>=v0.33.x + +type JestMockFn = { + (...args: Array): any, + /** + * An object for introspecting mock calls + */ + mock: { + /** + * An array that represents all calls that have been made into this mock + * function. Each call is represented by an array of arguments that were + * passed during the call. + */ + calls: Array>, + /** + * An array that contains all the object instances that have been + * instantiated from this mock function. + */ + instances: mixed, + }, + /** + * Resets all information stored in the mockFn.mock.calls and + * mockFn.mock.instances arrays. Often this is useful when you want to clean + * up a mock's usage data between two assertions. + */ + mockClear(): Function, + /** + * Resets all information stored in the mock. This is useful when you want to + * completely restore a mock back to its initial state. + */ + mockReset(): Function, + /** + * Accepts a function that should be used as the implementation of the mock. + * The mock itself will still record all calls that go into and instances + * that come from itself -- the only difference is that the implementation + * will also be executed when the mock is called. + */ + mockImplementation(fn: Function): JestMockFn, + /** + * Accepts a function that will be used as an implementation of the mock for + * one call to the mocked function. Can be chained so that multiple function + * calls produce different results. + */ + mockImplementationOnce(fn: Function): JestMockFn, + /** + * Just a simple sugar function for returning `this` + */ + mockReturnThis(): void, + /** + * Deprecated: use jest.fn(() => value) instead + */ + mockReturnValue(value: any): JestMockFn, + /** + * Sugar for only returning a value once inside your mock + */ + mockReturnValueOnce(value: any): JestMockFn, +} + +type JestAsymmetricEqualityType = { + /** + * A custom Jasmine equality tester + */ + asymmetricMatch(value: mixed): boolean, +} + +type JestCallsType = { + allArgs(): mixed, + all(): mixed, + any(): boolean, + count(): number, + first(): mixed, + mostRecent(): mixed, + reset(): void, +} + +type JestClockType = { + install(): void, + mockDate(date: Date): void, + tick(): void, + uninstall(): void, +} + +type JestMatcherResult = { + message?: string | ()=>string, + pass: boolean, +} + +type JestMatcher = (actual: any, expected: any) => JestMatcherResult; + +type JestExpectType = { + not: JestExpectType, + /** + * If you have a mock function, you can use .lastCalledWith to test what + * arguments it was last called with. + */ + lastCalledWith(...args: Array): void, + /** + * toBe just checks that a value is what you expect. It uses === to check + * strict equality. + */ + toBe(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toBeCalled(): void, + /** + * Use .toBeCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toBeCalledWith(...args: Array): void, + /** + * Using exact equality with floating point numbers is a bad idea. Rounding + * means that intuitive things fail. + */ + toBeCloseTo(num: number, delta: any): void, + /** + * Use .toBeDefined to check that a variable is not undefined. + */ + toBeDefined(): void, + /** + * Use .toBeFalsy when you don't care what a value is, you just want to + * ensure a value is false in a boolean context. + */ + toBeFalsy(): void, + /** + * To compare floating point numbers, you can use toBeGreaterThan. + */ + toBeGreaterThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeGreaterThanOrEqual. + */ + toBeGreaterThanOrEqual(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThan. + */ + toBeLessThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThanOrEqual. + */ + toBeLessThanOrEqual(number: number): void, + /** + * Use .toBeInstanceOf(Class) to check that an object is an instance of a + * class. + */ + toBeInstanceOf(cls: Class<*>): void, + /** + * .toBeNull() is the same as .toBe(null) but the error messages are a bit + * nicer. + */ + toBeNull(): void, + /** + * Use .toBeTruthy when you don't care what a value is, you just want to + * ensure a value is true in a boolean context. + */ + toBeTruthy(): void, + /** + * Use .toBeUndefined to check that a variable is undefined. + */ + toBeUndefined(): void, + /** + * Use .toContain when you want to check that an item is in a list. For + * testing the items in the list, this uses ===, a strict equality check. + */ + toContain(item: any): void, + /** + * Use .toContainEqual when you want to check that an item is in a list. For + * testing the items in the list, this matcher recursively checks the + * equality of all fields, rather than checking for object identity. + */ + toContainEqual(item: any): void, + /** + * Use .toEqual when you want to check that two objects have the same value. + * This matcher recursively checks the equality of all fields, rather than + * checking for object identity. + */ + toEqual(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toHaveBeenCalled(): void, + /** + * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact + * number of times. + */ + toHaveBeenCalledTimes(number: number): void, + /** + * Use .toHaveBeenCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toHaveBeenCalledWith(...args: Array): void, + /** + * Check that an object has a .length property and it is set to a certain + * numeric value. + */ + toHaveLength(number: number): void, + /** + * + */ + toHaveProperty(propPath: string, value?: any): void, + /** + * Use .toMatch to check that a string matches a regular expression. + */ + toMatch(regexp: RegExp): void, + /** + * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. + */ + toMatchObject(object: Object): void, + /** + * This ensures that a React component matches the most recent snapshot. + */ + toMatchSnapshot(name?: string): void, + /** + * Use .toThrow to test that a function throws when it is called. + */ + toThrow(message?: string | Error): void, + /** + * Use .toThrowError to test that a function throws a specific error when it + * is called. The argument can be a string for the error message, a class for + * the error, or a regex that should match the error. + */ + toThrowError(message?: string | Error | RegExp): void, + /** + * Use .toThrowErrorMatchingSnapshot to test that a function throws a error + * matching the most recent snapshot when it is called. + */ + toThrowErrorMatchingSnapshot(): void, +} + +type JestObjectType = { + /** + * Disables automatic mocking in the module loader. + * + * After this method is called, all `require()`s will return the real + * versions of each module (rather than a mocked version). + */ + disableAutomock(): JestObjectType, + /** + * An un-hoisted version of disableAutomock + */ + autoMockOff(): JestObjectType, + /** + * Enables automatic mocking in the module loader. + */ + enableAutomock(): JestObjectType, + /** + * An un-hoisted version of enableAutomock + */ + autoMockOn(): JestObjectType, + /** + * Resets the state of all mocks. Equivalent to calling .mockReset() on every + * mocked function. + */ + resetAllMocks(): JestObjectType, + /** + * Removes any pending timers from the timer system. + */ + clearAllTimers(): void, + /** + * The same as `mock` but not moved to the top of the expectation by + * babel-jest. + */ + doMock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * The same as `unmock` but not moved to the top of the expectation by + * babel-jest. + */ + dontMock(moduleName: string): JestObjectType, + /** + * Returns a new, unused mock function. Optionally takes a mock + * implementation. + */ + fn(implementation?: Function): JestMockFn, + /** + * Determines if the given function is a mocked function. + */ + isMockFunction(fn: Function): boolean, + /** + * Given the name of a module, use the automatic mocking system to generate a + * mocked version of the module for you. + */ + genMockFromModule(moduleName: string): any, + /** + * Mocks a module with an auto-mocked version when it is being required. + * + * The second argument can be used to specify an explicit module factory that + * is being run instead of using Jest's automocking feature. + * + * The third argument can be used to create virtual mocks -- mocks of modules + * that don't exist anywhere in the system. + */ + mock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * Resets the module registry - the cache of all required modules. This is + * useful to isolate modules where local state might conflict between tests. + */ + resetModules(): JestObjectType, + /** + * Exhausts the micro-task queue (usually interfaced in node via + * process.nextTick). + */ + runAllTicks(): void, + /** + * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), + * setInterval(), and setImmediate()). + */ + runAllTimers(): void, + /** + * Exhausts all tasks queued by setImmediate(). + */ + runAllImmediates(): void, + /** + * Executes only the macro task queue (i.e. all tasks queued by setTimeout() + * or setInterval() and setImmediate()). + */ + runTimersToTime(msToRun: number): void, + /** + * Executes only the macro-tasks that are currently pending (i.e., only the + * tasks that have been queued by setTimeout() or setInterval() up to this + * point) + */ + runOnlyPendingTimers(): void, + /** + * Explicitly supplies the mock object that the module system should return + * for the specified module. Note: It is recommended to use jest.mock() + * instead. + */ + setMock(moduleName: string, moduleExports: any): JestObjectType, + /** + * Indicates that the module system should never return a mocked version of + * the specified module from require() (e.g. that it should always return the + * real module). + */ + unmock(moduleName: string): JestObjectType, + /** + * Instructs Jest to use fake versions of the standard timer functions + * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, + * setImmediate and clearImmediate). + */ + useFakeTimers(): JestObjectType, + /** + * Instructs Jest to use the real versions of the standard timer functions. + */ + useRealTimers(): JestObjectType, +} + +type JestSpyType = { + calls: JestCallsType, +} + +/** Runs this function after every test inside this context */ +declare function afterEach(fn: Function): void; +/** Runs this function before every test inside this context */ +declare function beforeEach(fn: Function): void; +/** Runs this function after all tests have finished inside this context */ +declare function afterAll(fn: Function): void; +/** Runs this function before any tests have started inside this context */ +declare function beforeAll(fn: Function): void; +/** A context for grouping tests together */ +declare function describe(name: string, fn: Function): void; + +/** An individual test unit */ +declare var it: { + /** + * An individual test unit + * + * @param {string} Name of Test + * @param {Function} Test + */ + (name: string, fn?: Function): ?Promise, + /** + * Only run this test + * + * @param {string} Name of Test + * @param {Function} Test + */ + only(name: string, fn?: Function): ?Promise, + /** + * Skip running this test + * + * @param {string} Name of Test + * @param {Function} Test + */ + skip(name: string, fn?: Function): ?Promise, + /** + * Run the test concurrently + * + * @param {string} Name of Test + * @param {Function} Test + */ + concurrent(name: string, fn?: Function): ?Promise, +}; +declare function fit(name: string, fn: Function): ?Promise; +/** An individual test unit */ +declare var test: typeof it; +/** A disabled group of tests */ +declare var xdescribe: typeof describe; +/** A focused group of tests */ +declare var fdescribe: typeof describe; +/** A disabled individual test */ +declare var xit: typeof it; +/** A disabled individual test */ +declare var xtest: typeof it; + +/** The expect function is used every time you want to test a value */ +declare var expect: { + /** The object that you want to make assertions against */ + (value: any): JestExpectType, + /** Add additional Jasmine matchers to Jest's roster */ + extend(matchers: {[name:string]: JestMatcher}): void, + assertions(expectedAssertions: number): void, + any(value: mixed): JestAsymmetricEqualityType, + anything(): void, + arrayContaining(value: Array): void, + objectContaining(value: Object): void, + stringMatching(value: string): void, +}; + +// TODO handle return type +// http://jasmine.github.io/2.4/introduction.html#section-Spies +declare function spyOn(value: mixed, method: string): Object; + +/** Holds all functions related to manipulating test runner */ +declare var jest: JestObjectType + +/** + * The global Jamine object, this is generally not exposed as the public API, + * using features inside here could break in later versions of Jest. + */ +declare var jasmine: { + DEFAULT_TIMEOUT_INTERVAL: number, + any(value: mixed): JestAsymmetricEqualityType, + anything(): void, + arrayContaining(value: Array): void, + clock(): JestClockType, + createSpy(name: string): JestSpyType, + objectContaining(value: Object): void, + stringMatching(value: string): void, +} diff --git a/services/logs2slack/flow-typed/npm/loggly-winston-bulk_vx.x.x.js b/services/logs2slack/flow-typed/npm/loggly-winston-bulk_vx.x.x.js new file mode 100644 index 000000000..b8f6002aa --- /dev/null +++ b/services/logs2slack/flow-typed/npm/loggly-winston-bulk_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: b34e50fae7ffa8ef3a3235ddcc2881ea +// flow-typed version: <>/loggly-winston-bulk_v^1.0.1/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'loggly-winston-bulk' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'loggly-winston-bulk' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'loggly-winston-bulk/lib/winston-loggly' { + declare module.exports: any; +} + +declare module 'loggly-winston-bulk/test/winston-loggly-test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'loggly-winston-bulk/lib/winston-loggly.js' { + declare module.exports: $Exports<'loggly-winston-bulk/lib/winston-loggly'>; +} +declare module 'loggly-winston-bulk/test/winston-loggly-test.js' { + declare module.exports: $Exports<'loggly-winston-bulk/test/winston-loggly-test'>; +} diff --git a/services/logs2slack/flow-typed/npm/newman_vx.x.x.js b/services/logs2slack/flow-typed/npm/newman_vx.x.x.js new file mode 100644 index 000000000..6fed00153 --- /dev/null +++ b/services/logs2slack/flow-typed/npm/newman_vx.x.x.js @@ -0,0 +1,388 @@ +// flow-typed signature: 3140924328fd3377db618d12f139652e +// flow-typed version: <>/newman_v^3.3.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'newman' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'newman' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'newman/bin/newman' { + declare module.exports: any; +} + +declare module 'newman/examples/find-unique-urls-in-run' { + declare module.exports: any; +} + +declare module 'newman/examples/parallel-collection-runs' { + declare module.exports: any; +} + +declare module 'newman/examples/read-collection-from-file' { + declare module.exports: any; +} + +declare module 'newman/examples/run-collections-in-directory' { + declare module.exports: any; +} + +declare module 'newman/lib/cli/index' { + declare module.exports: any; +} + +declare module 'newman/lib/config/index' { + declare module.exports: any; +} + +declare module 'newman/lib/config/process-env' { + declare module.exports: any; +} + +declare module 'newman/lib/config/rc-file' { + declare module.exports: any; +} + +declare module 'newman/lib/index' { + declare module.exports: any; +} + +declare module 'newman/lib/node-version-check/index' { + declare module.exports: any; +} + +declare module 'newman/lib/print/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/cli-utils-symbols' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/cli-utils' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/emojitrain' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/html/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/json/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/junit/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/progress' { + declare module.exports: any; +} + +declare module 'newman/lib/run/export-file' { + declare module.exports: any; +} + +declare module 'newman/lib/run/index' { + declare module.exports: any; +} + +declare module 'newman/lib/run/options' { + declare module.exports: any; +} + +declare module 'newman/lib/run/summary' { + declare module.exports: any; +} + +declare module 'newman/lib/util' { + declare module.exports: any; +} + +declare module 'newman/lib/version' { + declare module.exports: any; +} + +declare module 'newman/npm/build-docs' { + declare module.exports: any; +} + +declare module 'newman/npm/build-wiki' { + declare module.exports: any; +} + +declare module 'newman/npm/publish-docs' { + declare module.exports: any; +} + +declare module 'newman/npm/publish-wiki' { + declare module.exports: any; +} + +declare module 'newman/npm/test-cli' { + declare module.exports: any; +} + +declare module 'newman/npm/test-integration' { + declare module.exports: any; +} + +declare module 'newman/npm/test-lint' { + declare module.exports: any; +} + +declare module 'newman/npm/test-system' { + declare module.exports: any; +} + +declare module 'newman/npm/test-unit' { + declare module.exports: any; +} + +declare module 'newman/npm/test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/export-environment.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/export-globals.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/iteration-count.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/ssl-client-cert.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/suppress-exit-code.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/appveyor-yml.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/editorconfig.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/jsdoc-config.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/nsp.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/repository.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/travis-yml.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/cli-reporter-symbols.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/cli.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/run-summary.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/run.test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'newman/bin/newman.js' { + declare module.exports: $Exports<'newman/bin/newman'>; +} +declare module 'newman/examples/find-unique-urls-in-run.js' { + declare module.exports: $Exports<'newman/examples/find-unique-urls-in-run'>; +} +declare module 'newman/examples/parallel-collection-runs.js' { + declare module.exports: $Exports<'newman/examples/parallel-collection-runs'>; +} +declare module 'newman/examples/read-collection-from-file.js' { + declare module.exports: $Exports<'newman/examples/read-collection-from-file'>; +} +declare module 'newman/examples/run-collections-in-directory.js' { + declare module.exports: $Exports<'newman/examples/run-collections-in-directory'>; +} +declare module 'newman/index' { + declare module.exports: $Exports<'newman'>; +} +declare module 'newman/index.js' { + declare module.exports: $Exports<'newman'>; +} +declare module 'newman/lib/cli/index.js' { + declare module.exports: $Exports<'newman/lib/cli/index'>; +} +declare module 'newman/lib/config/index.js' { + declare module.exports: $Exports<'newman/lib/config/index'>; +} +declare module 'newman/lib/config/process-env.js' { + declare module.exports: $Exports<'newman/lib/config/process-env'>; +} +declare module 'newman/lib/config/rc-file.js' { + declare module.exports: $Exports<'newman/lib/config/rc-file'>; +} +declare module 'newman/lib/index.js' { + declare module.exports: $Exports<'newman/lib/index'>; +} +declare module 'newman/lib/node-version-check/index.js' { + declare module.exports: $Exports<'newman/lib/node-version-check/index'>; +} +declare module 'newman/lib/print/index.js' { + declare module.exports: $Exports<'newman/lib/print/index'>; +} +declare module 'newman/lib/reporters/cli/cli-utils-symbols.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/cli-utils-symbols'>; +} +declare module 'newman/lib/reporters/cli/cli-utils.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/cli-utils'>; +} +declare module 'newman/lib/reporters/cli/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/index'>; +} +declare module 'newman/lib/reporters/emojitrain.js' { + declare module.exports: $Exports<'newman/lib/reporters/emojitrain'>; +} +declare module 'newman/lib/reporters/html/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/html/index'>; +} +declare module 'newman/lib/reporters/json/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/json/index'>; +} +declare module 'newman/lib/reporters/junit/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/junit/index'>; +} +declare module 'newman/lib/reporters/progress.js' { + declare module.exports: $Exports<'newman/lib/reporters/progress'>; +} +declare module 'newman/lib/run/export-file.js' { + declare module.exports: $Exports<'newman/lib/run/export-file'>; +} +declare module 'newman/lib/run/index.js' { + declare module.exports: $Exports<'newman/lib/run/index'>; +} +declare module 'newman/lib/run/options.js' { + declare module.exports: $Exports<'newman/lib/run/options'>; +} +declare module 'newman/lib/run/summary.js' { + declare module.exports: $Exports<'newman/lib/run/summary'>; +} +declare module 'newman/lib/util.js' { + declare module.exports: $Exports<'newman/lib/util'>; +} +declare module 'newman/lib/version.js' { + declare module.exports: $Exports<'newman/lib/version'>; +} +declare module 'newman/npm/build-docs.js' { + declare module.exports: $Exports<'newman/npm/build-docs'>; +} +declare module 'newman/npm/build-wiki.js' { + declare module.exports: $Exports<'newman/npm/build-wiki'>; +} +declare module 'newman/npm/publish-docs.js' { + declare module.exports: $Exports<'newman/npm/publish-docs'>; +} +declare module 'newman/npm/publish-wiki.js' { + declare module.exports: $Exports<'newman/npm/publish-wiki'>; +} +declare module 'newman/npm/test-cli.js' { + declare module.exports: $Exports<'newman/npm/test-cli'>; +} +declare module 'newman/npm/test-integration.js' { + declare module.exports: $Exports<'newman/npm/test-integration'>; +} +declare module 'newman/npm/test-lint.js' { + declare module.exports: $Exports<'newman/npm/test-lint'>; +} +declare module 'newman/npm/test-system.js' { + declare module.exports: $Exports<'newman/npm/test-system'>; +} +declare module 'newman/npm/test-unit.js' { + declare module.exports: $Exports<'newman/npm/test-unit'>; +} +declare module 'newman/npm/test.js' { + declare module.exports: $Exports<'newman/npm/test'>; +} +declare module 'newman/test/cli/export-environment.test.js' { + declare module.exports: $Exports<'newman/test/cli/export-environment.test'>; +} +declare module 'newman/test/cli/export-globals.test.js' { + declare module.exports: $Exports<'newman/test/cli/export-globals.test'>; +} +declare module 'newman/test/cli/iteration-count.test.js' { + declare module.exports: $Exports<'newman/test/cli/iteration-count.test'>; +} +declare module 'newman/test/cli/ssl-client-cert.test.js' { + declare module.exports: $Exports<'newman/test/cli/ssl-client-cert.test'>; +} +declare module 'newman/test/cli/suppress-exit-code.test.js' { + declare module.exports: $Exports<'newman/test/cli/suppress-exit-code.test'>; +} +declare module 'newman/test/system/appveyor-yml.test.js' { + declare module.exports: $Exports<'newman/test/system/appveyor-yml.test'>; +} +declare module 'newman/test/system/editorconfig.test.js' { + declare module.exports: $Exports<'newman/test/system/editorconfig.test'>; +} +declare module 'newman/test/system/jsdoc-config.test.js' { + declare module.exports: $Exports<'newman/test/system/jsdoc-config.test'>; +} +declare module 'newman/test/system/nsp.test.js' { + declare module.exports: $Exports<'newman/test/system/nsp.test'>; +} +declare module 'newman/test/system/repository.test.js' { + declare module.exports: $Exports<'newman/test/system/repository.test'>; +} +declare module 'newman/test/system/travis-yml.test.js' { + declare module.exports: $Exports<'newman/test/system/travis-yml.test'>; +} +declare module 'newman/test/unit/cli-reporter-symbols.test.js' { + declare module.exports: $Exports<'newman/test/unit/cli-reporter-symbols.test'>; +} +declare module 'newman/test/unit/cli.test.js' { + declare module.exports: $Exports<'newman/test/unit/cli.test'>; +} +declare module 'newman/test/unit/run-summary.test.js' { + declare module.exports: $Exports<'newman/test/unit/run-summary.test'>; +} +declare module 'newman/test/unit/run.test.js' { + declare module.exports: $Exports<'newman/test/unit/run.test'>; +} diff --git a/services/logs2slack/flow-typed/npm/nodemon_vx.x.x.js b/services/logs2slack/flow-typed/npm/nodemon_vx.x.x.js new file mode 100644 index 000000000..b0229d730 --- /dev/null +++ b/services/logs2slack/flow-typed/npm/nodemon_vx.x.x.js @@ -0,0 +1,214 @@ +// flow-typed signature: eab46bce88fff52d1a9d8bec9a241fc5 +// flow-typed version: <>/nodemon_v^1.11.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'nodemon' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'nodemon' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'nodemon/bin/nodemon' { + declare module.exports: any; +} + +declare module 'nodemon/lib/cli/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/cli/parse' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/command' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/defaults' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/exec' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/load' { + declare module.exports: any; +} + +declare module 'nodemon/lib/help/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/match' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/run' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/watch' { + declare module.exports: any; +} + +declare module 'nodemon/lib/nodemon' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/add' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/parse' { + declare module.exports: any; +} + +declare module 'nodemon/lib/spawn' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/bus' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/clone' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/colour' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/log' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/merge' { + declare module.exports: any; +} + +declare module 'nodemon/lib/version' { + declare module.exports: any; +} + +declare module 'nodemon/web/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'nodemon/bin/nodemon.js' { + declare module.exports: $Exports<'nodemon/bin/nodemon'>; +} +declare module 'nodemon/lib/cli/index.js' { + declare module.exports: $Exports<'nodemon/lib/cli/index'>; +} +declare module 'nodemon/lib/cli/parse.js' { + declare module.exports: $Exports<'nodemon/lib/cli/parse'>; +} +declare module 'nodemon/lib/config/command.js' { + declare module.exports: $Exports<'nodemon/lib/config/command'>; +} +declare module 'nodemon/lib/config/defaults.js' { + declare module.exports: $Exports<'nodemon/lib/config/defaults'>; +} +declare module 'nodemon/lib/config/exec.js' { + declare module.exports: $Exports<'nodemon/lib/config/exec'>; +} +declare module 'nodemon/lib/config/index.js' { + declare module.exports: $Exports<'nodemon/lib/config/index'>; +} +declare module 'nodemon/lib/config/load.js' { + declare module.exports: $Exports<'nodemon/lib/config/load'>; +} +declare module 'nodemon/lib/help/index.js' { + declare module.exports: $Exports<'nodemon/lib/help/index'>; +} +declare module 'nodemon/lib/index.js' { + declare module.exports: $Exports<'nodemon/lib/index'>; +} +declare module 'nodemon/lib/monitor/index.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/index'>; +} +declare module 'nodemon/lib/monitor/match.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/match'>; +} +declare module 'nodemon/lib/monitor/run.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/run'>; +} +declare module 'nodemon/lib/monitor/watch.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/watch'>; +} +declare module 'nodemon/lib/nodemon.js' { + declare module.exports: $Exports<'nodemon/lib/nodemon'>; +} +declare module 'nodemon/lib/rules/add.js' { + declare module.exports: $Exports<'nodemon/lib/rules/add'>; +} +declare module 'nodemon/lib/rules/index.js' { + declare module.exports: $Exports<'nodemon/lib/rules/index'>; +} +declare module 'nodemon/lib/rules/parse.js' { + declare module.exports: $Exports<'nodemon/lib/rules/parse'>; +} +declare module 'nodemon/lib/spawn.js' { + declare module.exports: $Exports<'nodemon/lib/spawn'>; +} +declare module 'nodemon/lib/utils/bus.js' { + declare module.exports: $Exports<'nodemon/lib/utils/bus'>; +} +declare module 'nodemon/lib/utils/clone.js' { + declare module.exports: $Exports<'nodemon/lib/utils/clone'>; +} +declare module 'nodemon/lib/utils/colour.js' { + declare module.exports: $Exports<'nodemon/lib/utils/colour'>; +} +declare module 'nodemon/lib/utils/index.js' { + declare module.exports: $Exports<'nodemon/lib/utils/index'>; +} +declare module 'nodemon/lib/utils/log.js' { + declare module.exports: $Exports<'nodemon/lib/utils/log'>; +} +declare module 'nodemon/lib/utils/merge.js' { + declare module.exports: $Exports<'nodemon/lib/utils/merge'>; +} +declare module 'nodemon/lib/version.js' { + declare module.exports: $Exports<'nodemon/lib/version'>; +} +declare module 'nodemon/web/index.js' { + declare module.exports: $Exports<'nodemon/web/index'>; +} diff --git a/services/logs2slack/flow-typed/npm/winston_vx.x.x.js b/services/logs2slack/flow-typed/npm/winston_vx.x.x.js new file mode 100644 index 000000000..eaebbf00e --- /dev/null +++ b/services/logs2slack/flow-typed/npm/winston_vx.x.x.js @@ -0,0 +1,214 @@ +// flow-typed signature: 48dced19d396d69846f3d7727f01a59f +// flow-typed version: <>/winston_v^2.2.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'winston' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'winston' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'winston/lib/winston' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/common' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/cli-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/npm-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/syslog-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/container' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/exception' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/logger' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/console' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/file' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/http' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/memory' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/transport' { + declare module.exports: any; +} + +declare module 'winston/test/helpers' { + declare module.exports: any; +} + +declare module 'winston/test/transports/console-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-archive-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-maxfiles-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-maxsize-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-open-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-stress-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-tailrolling-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/http-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/memory-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/transport' { + declare module.exports: any; +} + +// Filename aliases +declare module 'winston/lib/winston.js' { + declare module.exports: $Exports<'winston/lib/winston'>; +} +declare module 'winston/lib/winston/common.js' { + declare module.exports: $Exports<'winston/lib/winston/common'>; +} +declare module 'winston/lib/winston/config.js' { + declare module.exports: $Exports<'winston/lib/winston/config'>; +} +declare module 'winston/lib/winston/config/cli-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/cli-config'>; +} +declare module 'winston/lib/winston/config/npm-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/npm-config'>; +} +declare module 'winston/lib/winston/config/syslog-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/syslog-config'>; +} +declare module 'winston/lib/winston/container.js' { + declare module.exports: $Exports<'winston/lib/winston/container'>; +} +declare module 'winston/lib/winston/exception.js' { + declare module.exports: $Exports<'winston/lib/winston/exception'>; +} +declare module 'winston/lib/winston/logger.js' { + declare module.exports: $Exports<'winston/lib/winston/logger'>; +} +declare module 'winston/lib/winston/transports.js' { + declare module.exports: $Exports<'winston/lib/winston/transports'>; +} +declare module 'winston/lib/winston/transports/console.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/console'>; +} +declare module 'winston/lib/winston/transports/file.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/file'>; +} +declare module 'winston/lib/winston/transports/http.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/http'>; +} +declare module 'winston/lib/winston/transports/memory.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/memory'>; +} +declare module 'winston/lib/winston/transports/transport.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/transport'>; +} +declare module 'winston/test/helpers.js' { + declare module.exports: $Exports<'winston/test/helpers'>; +} +declare module 'winston/test/transports/console-test.js' { + declare module.exports: $Exports<'winston/test/transports/console-test'>; +} +declare module 'winston/test/transports/file-archive-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-archive-test'>; +} +declare module 'winston/test/transports/file-maxfiles-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-maxfiles-test'>; +} +declare module 'winston/test/transports/file-maxsize-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-maxsize-test'>; +} +declare module 'winston/test/transports/file-open-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-open-test'>; +} +declare module 'winston/test/transports/file-stress-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-stress-test'>; +} +declare module 'winston/test/transports/file-tailrolling-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-tailrolling-test'>; +} +declare module 'winston/test/transports/file-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-test'>; +} +declare module 'winston/test/transports/http-test.js' { + declare module.exports: $Exports<'winston/test/transports/http-test'>; +} +declare module 'winston/test/transports/memory-test.js' { + declare module.exports: $Exports<'winston/test/transports/memory-test'>; +} +declare module 'winston/test/transports/transport.js' { + declare module.exports: $Exports<'winston/test/transports/transport'>; +} diff --git a/services/logs2slack/package.json b/services/logs2slack/package.json new file mode 100644 index 000000000..0cfcdd90a --- /dev/null +++ b/services/logs2slack/package.json @@ -0,0 +1,49 @@ +{ + "name": "amazeeio-webhook-handler", + "version": "0.9.0", + "description": "amazeeio handler for webhooks", + "main": "index.js", + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "jest", + "test:watch": "jest --watch", + "start": "node build/index.js", + "build": "babel src -d build", + "dev": "nodemon src/index.js --exec babel-node", + "newman:all": "newman run ./newman/amazeeio-webhook-handler.postman_collection.json -e ./newman/localhost.postman_environment.json" + }, + "author": "Rod Vagg (http://r.va.gg)", + "repository": { + "type": "git", + "url": "https://github.com/rvagg/github-webhook-handler.git" + }, + "license": "MIT", + "dependencies": { + "@amazeeio/amazeeio-api": "^0.1.3", + "@amazeeio/amazeeio-local-logging": "^0.1.3", + "@slack/client": "^3.9.0", + "amqp-connection-manager": "^1.3.5", + "amqplib": "^0.5.1", + "babel-cli": "^6.18.0", + "babel-core": "^6.21.0", + "babel-plugin-syntax-async-functions": "^6.13.0", + "babel-plugin-transform-flow-strip-types": "^6.21.0", + "babel-plugin-transform-object-rest-spread": "^6.20.2", + "babel-plugin-transform-regenerator": "^6.21.0", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.18.0", + "nodemon": "^1.11.0", + "uuid4": "^1.0.0", + "winston": "^2.2.0" + }, + "devDependencies": { + "flow-bin": "^0.37.4", + "jest": "^18.1.0" + }, + "jest": { + "rootDir": "src", + "testEnvironment": "node" + } +} diff --git a/services/logs2slack/src/index.js b/services/logs2slack/src/index.js new file mode 100644 index 000000000..f2ea0455e --- /dev/null +++ b/services/logs2slack/src/index.js @@ -0,0 +1,32 @@ +// @flow + +require("babel-polyfill"); + +import amqp from 'amqp-connection-manager'; + +import { logger, initLogger } from '@amazeeio/amazeeio-local-logging'; +import readFromRabbitMQ from './readFromRabbitMQ'; + +import type { ChannelWrapper } from './types'; + +// Initialize the logging mechanism +initLogger(); + +const rabbitmqhost = process.env.RABBITMQ_HOST || "localhost" +const connection = amqp.connect([`amqp://${rabbitmqhost}`], { json: true }); + +connection.on('connect', ({ url }) => logger.verbose('Connected to %s', url, { action: 'connected', url })); +connection.on('disconnect', params => logger.error('Not connected, error: %s', params.err.code, { action: 'disconnected', reason: params })); + +// Cast any to ChannelWrapper to get type-safetiness through our own code +const channelWrapper: ChannelWrapper = connection.createChannel({ + setup: channel => { + return Promise.all([ + channel.assertExchange('amazeeio-logs', 'direct', {durable: true}), + channel.assertQueue('amazeeio-logs:slack', {durable: true}), + channel.bindQueue('amazeeio-logs:slack', 'amazeeio-logs', ''), + channel.prefetch(1), + channel.consume('amazeeio-logs:slack', msg => readFromRabbitMQ(msg, channelWrapper), {noAck: false}), + ]); + } +}); diff --git a/services/logs2slack/src/readFromRabbitMQ.js b/services/logs2slack/src/readFromRabbitMQ.js new file mode 100644 index 000000000..f2a40ba60 --- /dev/null +++ b/services/logs2slack/src/readFromRabbitMQ.js @@ -0,0 +1,103 @@ +// @flow + +import { logger } from '@amazeeio/amazeeio-local-logging'; + +import { getSlackinfoForSiteGroup } from '@amazeeio/amazeeio-api'; + +var IncomingWebhook = require('@slack/client').IncomingWebhook; + +export type ChannelWrapper = { + ack: (msg: Object) => void, +} + +export type RabbitMQMsg = { + content: Buffer, + fields: Object, + properties: Object, +}; + +export type SiteGroup = { + slack: Object, + siteGroupName: string, +}; + +export default async function readFromRabbitMQ (msg: RabbitMQMsg, channelWrapper: ChannelWrapper): Promise { + const { + content, + fields, + properties, + } = msg; + + const logMessage = JSON.parse(content.toString()) + + const { + severity, + sitegroup, + uuid, + event, + meta, + message + } = logMessage + + logger.verbose(`received ${event}`, logMessage) + + switch (event) { + + case "github:pull_request:closed:receive": + case "github:delete:receive": + case "github:push:receive": + sendToSlack(sitegroup, message, '#E8E8E8', ':information_source:', channelWrapper, msg) + break; + + case "task:remove-openshift-resources:finished": + case "task:deploy-openshift:finished": + sendToSlack(sitegroup, message, 'good', ':white_check_mark:', channelWrapper, msg) + break; + + case "task:remove-openshift-resources:error": + case "task:deploy-openshift:error": + sendToSlack(sitegroup, message, 'danger', ':bangbang:', channelWrapper, msg) + break; + + case "task:remove-openshift-resources:start": + case "task:deploy-openshift:start": + sendToSlack(sitegroup, message, '#E8E8E8', ':clock1:', channelWrapper, msg) + break; + + case "unresolvedSitegroup:webhooks2tasks": + case "unhandledWebhook": + case "webhooks:receive": + // known logs entries that should never go to slack + channelWrapper.ack(msg) + break; + + default: + logger.warn(`unhandled log message ${event} ${JSON.stringify(logMessage)}`) + return channelWrapper.ack(msg) + } + +} + +const sendToSlack = async (sitegroup, message, color, emoji, channelWrapper, msg) => { + + let sitegroupSlack; + try { + sitegroupSlack = await getSlackinfoForSiteGroup(sitegroup) + } + catch (error) { + logger.error(`No Slack information found, error: ${error}`) + return channelWrapper.ack(msg) + } + + await new IncomingWebhook(sitegroupSlack.slack.webhook, { + channel: sitegroupSlack.slack.channel, + }).send({ + attachments: [{ + text: `${emoji} ${message}`, + color: color, + "mrkdwn_in": ["pretext", "text", "fields"] + }] + }); + channelWrapper.ack(msg) + return +} \ No newline at end of file diff --git a/services/logs2slack/src/types.js b/services/logs2slack/src/types.js new file mode 100644 index 000000000..baf6b6256 --- /dev/null +++ b/services/logs2slack/src/types.js @@ -0,0 +1,10 @@ +// @flow + +/** + * Webhook related types for incoming Events + */ + +export type ChannelWrapper = { + sendToQueue: (evt: string, data: Buffer, opts: Object) => void, +} + diff --git a/services/logs2slack/yarn.lock b/services/logs2slack/yarn.lock new file mode 100644 index 000000000..c3cb931ff --- /dev/null +++ b/services/logs2slack/yarn.lock @@ -0,0 +1,3188 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@amazeeio/amazeeio-api@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-api/-/amazeeio-api-0.1.3.tgz#829865b7ab698b3fbfcbda4766dfad16341557c5" + dependencies: + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + lokka "^1.7.0" + lokka-transport-http "^1.6.1" + winston "^2.2.0" + +"@amazeeio/amazeeio-local-logging@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-local-logging/-/amazeeio-local-logging-0.1.3.tgz#a7b83f4c95e3723ff5baafa01a2c376b9054410c" + dependencies: + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +"@slack/client@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@slack/client/-/client-3.9.0.tgz#bb1a89e93dcb461e44ef81527d1092a73631b66b" + dependencies: + async "^1.5.0" + bluebird "^3.3.3" + eventemitter3 "^1.1.1" + https-proxy-agent "^1.0.0" + inherits "^2.0.1" + lodash "^4.13.1" + pkginfo "^0.4.0" + request "^2.64.0" + retry "^0.9.0" + url-join "0.0.1" + winston "^2.1.1" + ws "^1.0.1" + +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn@^4.0.4: + version "4.0.11" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" + +agent-base@2: + version "2.0.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" + dependencies: + extend "~3.0.0" + semver "~5.0.1" + +ajv@^4.9.1: + version "4.11.7" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +amqp-connection-manager@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/amqp-connection-manager/-/amqp-connection-manager-1.3.5.tgz#4b4725fe96485ca0ad2aca8790e6d38800776449" + dependencies: + es6-promise "^3.0.2" + lodash "^4.15.0" + promise-breaker "^3.0.0" + when "^3.7.3" + +amqplib@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.1.tgz#7cccfebabe56c2e984ea7a2243f7cefe6fbfc6cf" + dependencies: + bitsyntax "~0.0.4" + bluebird "^3.4.6" + buffer-more-ints "0.0.2" + readable-stream "1.x >=1.1.9" + +ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^1.4.0, async@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.3.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9" + dependencies: + lodash "^4.14.0" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-cli@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" + dependencies: + babel-core "^6.24.1" + babel-polyfill "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.0.0, babel-core@^6.21.0, babel-core@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.18.0, babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^3.0.0" + babel-preset-jest "^18.0.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz#11d5abde18425ec24b5d648c7e0b5d25cd354a22" + dependencies: + find-up "^1.1.2" + istanbul-lib-instrument "^1.4.2" + object-assign "^4.1.0" + test-exclude "^3.3.0" + +babel-plugin-jest-hoist@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" + +babel-plugin-syntax-async-functions@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-flow-strip-types@^6.21.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.20.2: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.21.0, babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" + dependencies: + babel-plugin-jest-hoist "^18.0.0" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@6.x.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0, babel-template@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.18.0, babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +bitsyntax@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82" + dependencies: + buffer-more-ints "0.0.2" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.3.3, bluebird@^3.4.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +buffer-more-ints@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.4.3, chokidar@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" + dependencies: + marked "^0.3.6" + marked-terminal "^1.6.2" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@1.0.3, colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@2, debug@^2.1.1, debug@^2.2.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0" + dependencies: + ms "0.7.3" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +eventemitter3@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@3, extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^1.8.0, fb-watchman@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" + dependencies: + bser "1.0.2" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-up@^1.0.0, find-up@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flow-bin@^0.37.4: + version "0.37.4" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.37.4.tgz#3d8da2ef746e80e730d166e09040f4198969b76b" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + +got@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" + dependencies: + duplexify "^3.2.0" + infinity-agent "^2.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + nested-error-stacks "^1.0.0" + object-assign "^3.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" + dependencies: + agent-base "2" + debug "2" + extend "3" + +iconv-lite@0.4.13, iconv-lite@~0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +infinity-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-stream@^1.0.0, is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.0-alpha.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.7.tgz#f6f37f09f8002b130f891c646b70ee4a8e7345ae" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.2" + istanbul-lib-hook "^1.0.5" + istanbul-lib-instrument "^1.7.0" + istanbul-lib-report "^1.0.0" + istanbul-lib-source-maps "^1.1.1" + istanbul-reports "^1.0.2" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1" + +istanbul-lib-hook@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.0.2" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" + +jest-cli@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^17.0.2" + jest-config "^18.1.0" + jest-environment-jsdom "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-resolve-dependencies "^18.1.0" + jest-runtime "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + node-notifier "^4.6.1" + sane "~1.4.1" + strip-ansi "^3.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^18.1.0" + jest-environment-node "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" + +jest-environment-jsdom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + jsdom "^9.9.1" + +jest-environment-node@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-haste-map@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.4.1" + worker-farm "^1.3.1" + +jest-jasmine2@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^18.1.0" + jest-matchers "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" + dependencies: + chalk "^1.1.3" + pretty-format "^18.1.0" + +jest-matchers@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" + dependencies: + jest-diff "^18.1.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + pretty-format "^18.1.0" + +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" + +jest-resolve-dependencies@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" + dependencies: + jest-file-exists "^17.0.0" + jest-resolve "^18.1.0" + +jest-resolve@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" + dependencies: + browser-resolve "^1.11.2" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + resolve "^1.2.0" + +jest-runtime@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" + dependencies: + babel-core "^6.0.0" + babel-jest "^18.0.0" + babel-plugin-istanbul "^3.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + micromatch "^2.3.11" + yargs "^6.3.0" + +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" + dependencies: + jest-diff "^18.1.0" + jest-file-exists "^17.0.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + natural-compare "^1.4.0" + pretty-format "^18.1.0" + +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^18.0.0" + mkdirp "^0.5.1" + +jest@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" + dependencies: + jest-cli "^18.1.0" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@^3.7.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^9.9.1: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +latest-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" + dependencies: + package-json "^1.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.2.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lokka-transport-http@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/lokka-transport-http/-/lokka-transport-http-1.6.1.tgz#0dfbc2dc9e825f6e5821830f3f3f7f3f83a4ad65" + dependencies: + babel-runtime "6.x.x" + node-fetch "^1.5.2" + whatwg-fetch "^1.0.0" + +lokka@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/lokka/-/lokka-1.7.0.tgz#ab2e8334612d2afd359aa89047547bd7de21046c" + dependencies: + babel-runtime "6.x.x" + uuid "2.x.x" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" + dependencies: + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" + +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" + +nan@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +nested-error-stacks@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +node-emoji@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" + dependencies: + string.prototype.codepointat "^0.2.0" + +node-fetch@^1.5.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" + dependencies: + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" + +node-pre-gyp@^0.6.29: + version "0.6.34" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nodemon@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" + dependencies: + chokidar "^1.4.3" + debug "^2.2.0" + es6-promise "^3.0.2" + ignore-by-default "^1.0.0" + lodash.defaults "^3.1.2" + minimatch "^3.0.0" + ps-tree "^1.0.1" + touch "1.0.0" + undefsafe "0.0.3" + update-notifier "0.5.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npmlog@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + dependencies: + got "^3.2.0" + registry-url "^3.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkginfo@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" + +private@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +promise-breaker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-3.0.0.tgz#bed499d1a9c35944950462baf47246fc11f19d9f" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +ps-tree@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +rc@^1.0.1, rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1.x >=1.1.9": + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-url@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.64.0, request@^2.79.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.2.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +retry@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.9.0.tgz#6f697e50a0e4ddc8c8f7fb547a9b60dead43678d" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@^5.0.3, semver@~5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.14" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" + dependencies: + source-map "^0.5.6" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string.prototype.codepointat@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" + dependencies: + buffer-shims "~1.0.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +throat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +touch@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +uglify-js@^2.6: + version "2.8.22" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + +update-notifier@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" + dependencies: + chalk "^1.0.0" + configstore "^1.0.0" + is-npm "^1.0.0" + latest-version "^1.0.0" + repeating "^1.1.2" + semver-diff "^2.0.0" + string-length "^1.0.0" + +url-join@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid4@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/uuid4/-/uuid4-1.0.0.tgz#813aaeaf11ea2f68909c5ad57d894f83202d6720" + +uuid@2.x.x, uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.10: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-fetch@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319" + +whatwg-url@^4.3.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.0.tgz#202035ac1955b087cdd20fa8b58ded3ab1cd2af5" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +when@^3.7.3: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.0.5, which@^1.1.1: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^2.1.1, winston@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.3.tgz#831dd22d491bdc135180bb996a0eb3f8bf587791" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +ws@^1.0.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +"xtend@>=4.0.0 <4.1.0-0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs@^6.3.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/services/logstash/.openshift/app.yml b/services/logstash/.openshift/app.yml new file mode 100644 index 000000000..7324a1e7c --- /dev/null +++ b/services/logstash/.openshift/app.yml @@ -0,0 +1,95 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: TAG + description: Which tag should be deployed + required: true + - name: NAME + description: How is the resources are called + required: true + - name: SHORT_NAME + description: Name of resources in max 24 chars + required: true + - name: SITEGROUP + description: Name of the site group + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true + - name: ELASTICSEARCH_URL + description: URL of elasticsearch to contact to + - name: RABBITMQ_HOST + description: host of rabbitmq to connect to + - name: RABBITMQ_USER + description: user of rabbitmq to connect to + - name: RABBITMQ_PASSWORD + description: password of rabbitmq to connect to +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${SITEGROUP}:${TAG} + name: ${NAME} + env: + - name: ELASTICSEARCH_URL + value: ${ELASTICSEARCH_URL} + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: RABBITMQ_USER + value: ${RABBITMQ_USER} + - name: RABBITMQ_PASSWORD + value: ${RABBITMQ_PASSWORD} + - name: XPACK_MONITORING_ELASTICSEARCH_URL + value: ${ELASTICSEARCH_URL} + ports: + - containerPort: 9600 + name: http + protocol: TCP + resources: + limits: + memory: 1000Mi + requests: + cpu: 200m + memory: 300Mi + readinessProbe: + httpGet: + port: http + initialDelaySeconds: 20 + livenessProbe: + httpGet: + port: http + initialDelaySeconds: 120 + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${NAME} + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} diff --git a/services/logstash/Dockerfile b/services/logstash/Dockerfile new file mode 100644 index 000000000..bf2b3261a --- /dev/null +++ b/services/logstash/Dockerfile @@ -0,0 +1,11 @@ +FROM docker.elastic.co/logstash/logstash:5.4.0 + +USER root + +RUN curl -sLo /usr/local/bin/fix-permissions https://raw.githubusercontent.com/sclorg/s2i-base-container/master/bin/fix-permissions && \ + chmod +x /usr/local/bin/fix-permissions + +COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf +COPY logstash.yml /usr/share/logstash/config/logstash.yml + +RUN fix-permissions /usr/share/logstash \ No newline at end of file diff --git a/services/logstash/Jenkinsfile b/services/logstash/Jenkinsfile new file mode 100644 index 000000000..66db94490 --- /dev/null +++ b/services/logstash/Jenkinsfile @@ -0,0 +1,137 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-').replaceAll('/','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.SITEGROUP = "logstash" + env.NAME = "${env.SITEGROUP}-${env.BRANCH}" + + // Openshift does not really like names longer then 24 chars or ending in a hyphen. + // This strips that, but also makes sure that if the string is already less then 24 + // characters, Java is not confused. + // See: http://stackoverflow.com/questions/953527/java-substring-string-index-out-of-range + env.SHORT_NAME = "${env.SITEGROUP}-${env.BRANCH}" + if (env.SHORT_NAME.length() > 24) { + env.SHORT_NAME = env.SHORT_NAME.substring(0, 24).replaceFirst(/[^a-z0-9]+$/, ''); + } + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + env.ELASTICSEARCH_URL = "http://elasticsearch-${env.TARGET_BRANCH}:9200" + env.RABBITMQ_HOST = "rabbitmq-${env.TARGET_BRANCH}" + env.RABBITMQ_USER = "amazeeio" + env.RABBITMQ_PASSWORD = "NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3" + + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + env.OPENSHIFT_REGISTRY = "registry.appuio.ch" + env.OPENSHIFT_CONSOLE = "https://console.appuio.ch" + env.OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.OPENSHIFT_APP_YAML = "app.yml" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.SITEGROUP}/detail" + + if (env.BRANCH == 'master') { + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh """docker run --rm -v $WORKSPACE/.openshift:/tmp -e OPENSHIFT_CONSOLE=${env.OPENSHIFT_CONSOLE} -e OPENSHIFT_TOKEN=${env.OPENSHIFT_TOKEN} amazeeio/oc sh -c 'oc process \ + -n ${env.OPENSHIFT_PROJECT} \ + -f /tmp/${env.OPENSHIFT_APP_YAML} \ + -v TAG=${env.BRANCH} \ + -v NAME=${env.NAME} \ + -v SHORT_NAME=${env.SHORT_NAME} \ + -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} \ + -v SITEGROUP=${env.SITEGROUP} \ + -v ELASTICSEARCH_URL=${env.ELASTICSEARCH_URL} \ + -v RABBITMQ_HOST=${env.RABBITMQ_HOST} \ + -v RABBITMQ_USER=${env.RABBITMQ_USER} \ + -v RABBITMQ_PASSWORD=${env.RABBITMQ_PASSWORD} \ + | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'""" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.SITEGROUP}-registry") { + try { + sh "docker tag ${env.IMAGE} ${env.OPENSHIFT_REGISTRY}/${env.OPENSHIFT_PROJECT}/${env.SITEGROUP}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.docker docker login -u=jenkins -p='${env.OPENSHIFT_TOKEN}' ${env.OPENSHIFT_REGISTRY}" + sh "DOCKER_CONFIG=$WORKSPACE/.docker docker push ${env.OPENSHIFT_REGISTRY}/${env.OPENSHIFT_PROJECT}/${env.SITEGROUP}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: "${env.OPENSHIFT_CONSOLE}", authToken: env.OPENSHIFT_TOKEN, depCfg: "${env.NAME}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.SITEGROUP}/${env.BRANCH_NAME}] >${url}|Build #${env.BUILD_NUMBER}> failed* \\nStep: ${step} " + sendslack('danger', message) + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.SITEGROUP}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \\n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.SITEGROUP}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} \ No newline at end of file diff --git a/services/logstash/README.md b/services/logstash/README.md new file mode 100644 index 000000000..088236b35 --- /dev/null +++ b/services/logstash/README.md @@ -0,0 +1,5 @@ +# amazeeio-logstash + +This is a logstash used within the amazee.io lagoon deployment system. + +It connects to rabbitmq and creates a new `amazeeio-logs:logstash` queue and binds it to the `amazeeio-logs` exchange. Every message will be forwarded to Elasticsearch. \ No newline at end of file diff --git a/services/logstash/logstash.conf b/services/logstash/logstash.conf new file mode 100644 index 000000000..fa35a8533 --- /dev/null +++ b/services/logstash/logstash.conf @@ -0,0 +1,17 @@ +input { + rabbitmq { + host => "${RABBITMQ_HOST}" + user => "${RABBITMQ_USER}" + password => "${RABBITMQ_PASSWORD}" + exchange => "amazeeio-logs" + key => "" + durable => "true" + queue => "amazeeio-logs:logstash" + } +} +output { + elasticsearch { + hosts => ["${ELASTICSEARCH_URL}"] + } + stdout { codec => rubydebug } +} diff --git a/services/logstash/logstash.yml b/services/logstash/logstash.yml new file mode 100644 index 000000000..d8402236f --- /dev/null +++ b/services/logstash/logstash.yml @@ -0,0 +1,5 @@ +http.host: "0.0.0.0" +path.config: /usr/share/logstash/pipeline +xpack.monitoring.elasticsearch.url: http://elasticsearch:9200 +xpack.monitoring.elasticsearch.username: elastic +xpack.monitoring.elasticsearch.password: changeme diff --git a/services/openshiftdeploy/.amazeeio.app.yml b/services/openshiftdeploy/.amazeeio.app.yml new file mode 100644 index 000000000..121e49f6e --- /dev/null +++ b/services/openshiftdeploy/.amazeeio.app.yml @@ -0,0 +1,62 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeio-openshift-template +parameters: + - name: TAG + description: Which docker image tag should be deployed + required: true + - name: NAME + description: Name of the objects to create + required: true + - name: SHORT_NAME + description: Shorter name of the objects to create, can be max 24 chars + required: true + - name: SITEGROUP + description: Which sitegroup this belongs to + required: true + - name: ROUTER_URL + description: URL of the Router + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ' ' + name: nodejs + resources: + requests: + cpu: 100m + memory: 100Mi + test: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - nodejs + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} + type: ImageChange + status: {} \ No newline at end of file diff --git a/services/openshiftdeploy/.babelrc b/services/openshiftdeploy/.babelrc new file mode 100644 index 000000000..bb092de4b --- /dev/null +++ b/services/openshiftdeploy/.babelrc @@ -0,0 +1,9 @@ +{ + "presets": ["es2015"], + "plugins": [ + "transform-flow-strip-types", + "transform-regenerator", + "syntax-async-functions", + "transform-object-rest-spread" + ] +} diff --git a/services/openshiftdeploy/.dockerignore b/services/openshiftdeploy/.dockerignore new file mode 100644 index 000000000..06ef0ae48 --- /dev/null +++ b/services/openshiftdeploy/.dockerignore @@ -0,0 +1,5 @@ +.openshift/* +.cache/* +node_modules/* +Jenkinsfile +.dockerignore \ No newline at end of file diff --git a/services/openshiftdeploy/.gitignore b/services/openshiftdeploy/.gitignore new file mode 100644 index 000000000..dd87e2d73 --- /dev/null +++ b/services/openshiftdeploy/.gitignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/openshiftdeploy/.openshift/.kubeconfig b/services/openshiftdeploy/.openshift/.kubeconfig new file mode 100644 index 000000000..a79c97f77 --- /dev/null +++ b/services/openshiftdeploy/.openshift/.kubeconfig @@ -0,0 +1,17 @@ +apiVersion: v1 +clusters: +- cluster: + server: https://console.appuio.ch:443 + name: appuio +contexts: +- context: + cluster: appuio + user: system:serviceaccount:amze-amazeeio:jenkins + name: appuio:amze-amazeeio:jenkins +current-context: appuio:amze-amazeeio:jenkins +kind: Config +preferences: {} +users: +- name: system:serviceaccount:amze-amazeeio:jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg diff --git a/services/openshiftdeploy/.openshift/README.md b/services/openshiftdeploy/.openshift/README.md new file mode 100644 index 000000000..6a67200e6 --- /dev/null +++ b/services/openshiftdeploy/.openshift/README.md @@ -0,0 +1,53 @@ +# OpenShift + +## Jenkins Access to Openshift + +In order for Jenkins to deploy to openshift we need to create an openshift serviceaccount that has access to our project (regular username/password logins expire after a couple of hours, not very good for a CI/CD system) + +1. Login as your user + + oc login + +2. Create new serviceaccount with the name jenkins + + oc create serviceaccount jenkins + +3. Give this serviceaccount edit access (see the name of the serviceaccount contains the project name!) + + oc policy add-role-to-user edit system:serviceaccount:appuio-demo2:jenkins2 + +4. Get access token from serviceaccount, with first getting the name of the token and then accessing the secret + + oc describe serviceaccount jenkins2 + + oc describe secret jenkins2-token-7tawv + +5. Add the token inside the .kubeconfig: + + + apiVersion: v1 + clusters: + - cluster: + server: https://console.appuio.ch:443 + name: appuio + contexts: + - context: + cluster: appuio + user: jenkins + name: appuio:jenkins + current-context: appuio:jenkins + kind: Config + preferences: {} + users: + - name: jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLXJhcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJqZW5raW5zLXRva2VuLTFocW42Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImplbmtpbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZmM4ZTIzMi05ZDBhLTExZTYtYTdlZi1mYTE2M2VkOTVkYWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YW16ZS1yYXM6amVua2lucyJ9.BAeU6zXl0uPCD2DRGJeV1oxRbk3sA3M5tn7K6xPh5iv-etS8Q2lsF-OFwO7HVycvEckXh31KNUmQTzvn3keSDT0a8BqViBhGPKCfAw-vf3ElUnGFDCWN9IpITKJBWIxVdGyd5sPltBWkAVxl9JOwnu1vrBvSioYqwjzYkjStbfp7pzLXhSld9G4AXA_zBntDW633mujllT0z_5IMSJX_gKSZcrTN78KLdCMmuvIT_m7xZMp_r52daEu67DjsjYtVqVx4BsDVPdUZRQ9eJtodbtZ-FJV9w0W4H9nX3iyqCk7OriD4Xt68Z5cUK0tR-4hyyh_hL31c6vzGb_VosmAWWg + + +6. Test the kubeconfig - should return `system:serviceaccount:appuio-demo2:jenkins2` + + KUBECONFIG=.openshift/.kubeconfig oc whoami + +7. Create a Docker authentication config.json so Jenkins can push into the Openshift docker Registry + + DOCKER_CONFIG=.openshift/ docker login -u jenkins2 -p $(KUBECONFIG=.openshift/.kubeconfig oc whoami -t) registry.appuio.ch \ No newline at end of file diff --git a/services/openshiftdeploy/.openshift/app.yml b/services/openshiftdeploy/.openshift/app.yml new file mode 100644 index 000000000..c0e618bcc --- /dev/null +++ b/services/openshiftdeploy/.openshift/app.yml @@ -0,0 +1,80 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: RABBITMQ_HOST + description: Hostname of the RabbitMQ Server to connect to + required: true + - name: JENKINS_URL + description: Hostname of the Jenkins Server + required: true + - name: AMAZEEIO_API_HOST + description: Hostname of the API + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: JENKINS_URL + value: ${JENKINS_URL} + - name: AMAZEEIO_API_HOST + value: ${AMAZEEIO_API_HOST} + - name: BRANCH + value: ${BRANCH} + ports: + - containerPort: 7777 + protocol: TCP + resources: + limits: + memory: 500Mi + requests: + cpu: 200m + memory: 100Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} diff --git a/services/openshiftdeploy/.openshift/config.json b/services/openshiftdeploy/.openshift/config.json new file mode 100644 index 000000000..a526a5d46 --- /dev/null +++ b/services/openshiftdeploy/.openshift/config.json @@ -0,0 +1,7 @@ +{ + "auths": { + "registry.appuio.ch": { + "auth": "amVua2luczI6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoYlhwbExXRnRZWHBsWldsdklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltcGxibXRwYm5NdGRHOXJaVzR0TjJGcU5tOGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lhbVZ1YTJsdWN5SXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqRmlOelZoWXpkakxXTTJOV010TVRGbE5pMWlOelUxTFdaaE1UWXpaVE5sWXpjellTSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBoYlhwbExXRnRZWHBsWldsdk9tcGxibXRwYm5NaWZRLkRUSlpDd3BFWFlnenlaSmtDZHF6a0dHc0hWQWhNc0J0OGFtcmkydGZQYl9mOTZrZWxHOWFnVXBudzdZRmcweWkybEdGcjhTU1lMOEd2dXhuNHcwMXZXdHNMc2JhMjg5cFJNOUhiXzFJU2F0U1NWNTM5TXdQR2dpN2ZVN3F6Yk00ZzJpVmIxaW1sQkhJbW9tSkNXVzJDSW41aEF5VUR4Snd5OVh2Y0hyajZUYjE0X0c2YnVLT3JpR0JaejZ4Qmk5WWpOanh5eTlZem5WOVhkU1Z4THNXQjdFaG5yUnhveElFaWVPV0RaUHF1am9tSUFYczZ0TzdhcGFnNE1kZFl6LTVYdTg2Vm15SjZkS05KZUt2RUh0V1hUM081SUVqMEhmdlZGSnlKRTFKR3BfLVhnTzg4Ujh0WF9yOWYySU9PLXpyMU9OODVubUpjTDlGTGRLaFE4Z3dRZw==" + } + } +} \ No newline at end of file diff --git a/services/openshiftdeploy/Dockerfile b/services/openshiftdeploy/Dockerfile new file mode 100644 index 000000000..bbe47a8f8 --- /dev/null +++ b/services/openshiftdeploy/Dockerfile @@ -0,0 +1,21 @@ +FROM amazeeio/centos7-node-builder:6 as builder +ENV NODE_ENV production +COPY package.json yarn.lock /app/ +RUN BUILD_ONLY=true yarn install --pure-lockfile && yarn cache clean + +FROM amazeeio/centos7-node:6 +ENV NODE_ENV production +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +ARG AMAZEEIO_GIT_BRANCH=undefined + +ENV RABBITMQ_HOST "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@${AMAZEEIO_GIT_BRANCH}-rabbitmq" +ENV AMAZEEIO_API_HOST "http://${AMAZEEIO_GIT_BRANCH}-api:8080" +ENV JENKINS_URL "http://admin:fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR@${AMAZEEIO_GIT_BRANCH}-jenkins:8080" + +RUN yarn run build + +RUN fix-permissions /app/ + +CMD ["yarn", "start"] diff --git a/services/openshiftdeploy/Jenkinsfile b/services/openshiftdeploy/Jenkinsfile new file mode 100644 index 000000000..2da28c18d --- /dev/null +++ b/services/openshiftdeploy/Jenkinsfile @@ -0,0 +1,161 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.OPENSHIFT_APP_YAML = "app.yml" + env.AMAZEEIO_SERVICE = "openshiftdeploy" + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.AMAZEEIO_SERVICE}/detail" + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + env.RABBITMQ_HOST = "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@rabbitmq-${env.TARGET_BRANCH}" + env.JENKINS_URL = "http://admin:fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR@jenkins-${env.TARGET_BRANCH}.appuio.amazeeio.review/" + env.AMAZEEIO_API_HOST = "http://api-${env.TARGET_BRANCH}.appuio.amazeeio.review" + + if (env.BRANCH == "master") { + env.JENKINS_URL = "https://admin:fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR@jenkins.amazeeio.cloud/" + env.AMAZEEIO_API_HOST = "https://api.amazeeio.cloud" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + stage ('tests') { + // Running Tests in parallel, for faster completion + parallel ( + //test_unit: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-unit" + // } catch (e) { + // error(e, 'unit test') + // } + //}, + // test_http: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-http-ssr" + // } catch (e) { + // error(e, 'http test') + // } + // }, + //test_lint: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-lint" + // } catch (e) { + // error(e, 'lint') + // } + //} + ) + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh """docker run --rm -v $WORKSPACE/.openshift:/tmp -w /tmp/ -e KUBECONFIG=.kubeconfig michelesr/oc sh -c 'oc process \ + -n ${env.OPENSHIFT_PROJECT} \ + -f ${env.OPENSHIFT_APP_YAML} \ + -v BRANCH=${env.BRANCH} \ + -v RABBITMQ_HOST=${env.RABBITMQ_HOST} \ + -v AMAZEEIO_API_HOST=${env.AMAZEEIO_API_HOST} \ + -v JENKINS_URL=${env.JENKINS_URL} \ + -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} \ + -v AMAZEEIO_SERVICE=${env.AMAZEEIO_SERVICE} \ + | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'""" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.AMAZEEIO_SERVICE}-registry") { + try { + sh "docker tag ${env.IMAGE} registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.openshift docker push registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: 'https://console.appuio.ch:443', authToken: OPENSHIFT_TOKEN, depCfg: "${env.AMAZEEIO_SERVICE}-${env.BRANCH}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + + stage ('cleanup Docker Images') { + cleanupImage() + } + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> failed* \nStep: ${step} " + sendslack('danger', message) + cleanupImage() + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} + +def cleanupImage() { + try { + sh "docker rmi -f ${env.IMAGE}" + } catch (e) { + echo "Removal of Docker image '${env.IMAGE}' failed, ignoring this." + } +} diff --git a/services/openshiftdeploy/LICENSE.md b/services/openshiftdeploy/LICENSE.md new file mode 100644 index 000000000..79b52093e --- /dev/null +++ b/services/openshiftdeploy/LICENSE.md @@ -0,0 +1,11 @@ +The MIT License (MIT) +===================== + +Copyright (c) 2014 Rod Vagg +--------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/services/openshiftdeploy/README.md b/services/openshiftdeploy/README.md new file mode 100644 index 000000000..8c8b7fe13 --- /dev/null +++ b/services/openshiftdeploy/README.md @@ -0,0 +1,2 @@ +# OpenShift Remove + diff --git a/services/openshiftdeploy/package.json b/services/openshiftdeploy/package.json new file mode 100644 index 000000000..f92994e9c --- /dev/null +++ b/services/openshiftdeploy/package.json @@ -0,0 +1,42 @@ +{ + "name": "gitpush2ansibledeploy", + "version": "0.9.0", + "description": "Git Push 2 Ansible Deployment", + "main": "index.js", + "scripts": { + "start": "node build/index.js", + "build": "babel src -d build", + "dev": "nodemon src/index.js --exec babel-node" + }, + "author": "Michael Schmid (https://amazee.io)", + "repository": { + "type": "git", + "url": "https://github.com/amazeeio/gitpush2ansibledeploy" + }, + "license": "MIT", + "dependencies": { + "@amazeeio/amazeeio-logs": "^0.1.11", + "@amazeeio/amazeeio-local-logging": "^0.1.3", + "amqp-connection-manager": "^1.3.5", + "amqp-winston": "^1.0.7", + "amqplib": "^0.4.2", + "babel-cli": "^6.18.0", + "babel-core": "^6.21.0", + "babel-plugin-syntax-async-functions": "^6.13.0", + "babel-plugin-transform-flow-strip-types": "^6.21.0", + "babel-plugin-transform-object-rest-spread": "^6.20.2", + "babel-plugin-transform-regenerator": "^6.21.0", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.18.0", + "es7-sleep": "^1.0.0", + "jenkins": "^0.19.0", + "lokka": "^1.7.0", + "lokka-transport-http": "^1.4.0", + "nodemon": "^1.11.0", + "winston": "^2.2.0" + }, + "devDependencies": { + "flow-bin": "^0.37.4", + "jest": "^18.1.0" + } +} diff --git a/services/openshiftdeploy/src/index.js b/services/openshiftdeploy/src/index.js new file mode 100644 index 000000000..5b134b8f8 --- /dev/null +++ b/services/openshiftdeploy/src/index.js @@ -0,0 +1,351 @@ +// @flow + +require("babel-polyfill"); + +import sleep from "es7-sleep"; +import Lokka from 'lokka'; +import Transport from 'lokka-transport-http'; +import { logger, initLogger } from '@amazeeio/amazeeio-local-logging'; +import amqp from 'amqp-connection-manager'; +import jenkinsLib from 'jenkins' +import { sendToAmazeeioLogs, initSendToAmazeeioLogs } from '@amazeeio/amazeeio-logs'; + + +// Initialize the logging mechanism +initLogger(); +initSendToAmazeeioLogs(); + +const amazeeioapihost = process.env.AMAZEEIO_API_HOST || "https://api.amazeeio.cloud" +const rabbitmqhost = process.env.RABBITMQ_HOST || "localhost" + +const ocBuildDeployImageLocation = process.env.OC_BUILD_DEPLOY_IMAGE_LOCATION || "dockerhub" +const dockerRunParam = process.env.DOCKER_RUN_PARARM || "" +const ocBuildDeployBranch = process.env.BRANCH || "master" + +const connection = amqp.connect([`amqp://${rabbitmqhost}`], {json: true}); + +const amazeeioAPI = new Lokka({ + transport: new Transport(`${amazeeioapihost}/graphql`) +}); + +connection.on('connect', ({ url }) => logger.verbose('Connected to %s', url)); +connection.on('disconnect', params => logger.error('Not connected, error: %s', params.err.code, { reason: params })); + +const channelWrapper = connection.createChannel({ + setup: function(channel) { + return Promise.all([ + channel.assertQueue('amazeeio-tasks:deploy-openshift', {durable: true}), + channel.prefetch(2), + channel.consume('amazeeio-tasks:deploy-openshift', onMessage, {noAck: false}), + ]) + } +}); + + +var onMessage = async function(msg) { + var payload = JSON.parse(msg.content.toString()) + + const { + siteGroupName, + branchName, + sha + } = payload + + logger.verbose(`Received DeployOpenshift task for sitegroup ${siteGroupName}, branch ${branchName}`); + + const siteGroupOpenShift = await amazeeioAPI.query(` + { + siteGroup:siteGroupByName(name: "${siteGroupName}"){ + openshift + client { + deployPrivateKey + } + gitUrl + } + } + `) + + let jenkinsUrl + + try { + var safeBranchname = branchName.replace('/','-') + var gitSha = sha + var openshiftConsole = siteGroupOpenShift.siteGroup.openshift.console + var openshiftRegistry =siteGroupOpenShift.siteGroup.openshift.registry + var openshiftToken = siteGroupOpenShift.siteGroup.openshift.token || "" + var openshiftUsername = siteGroupOpenShift.siteGroup.openshift.username || "" + var openshiftPassword = siteGroupOpenShift.siteGroup.openshift.password || "" + var openshiftTemplate = siteGroupOpenShift.siteGroup.openshift.template + var openshiftFolder = siteGroupOpenShift.siteGroup.openshift.folder || "." + var openshiftNamingPullRequests = typeof siteGroupOpenShift.siteGroup.openshift.naming !== 'undefined' ? siteGroupOpenShift.siteGroup.openshift.naming.branch : "${sitegroup}-${branch}" || "${sitegroup}-${branch}" + var openshiftProject = siteGroupOpenShift.siteGroup.openshift.project || siteGroupOpenShift.siteGroup.siteGroupName + var openshiftRessourceAppName = openshiftNamingPullRequests.replace('${branch}', safeBranchname).replace('${sitegroup}', siteGroupName).replace('_','-') + var deployPrivateKey = siteGroupOpenShift.siteGroup.client.deployPrivateKey + var gitUrl = siteGroupOpenShift.siteGroup.gitUrl + var routerPattern = siteGroupOpenShift.siteGroup.openshift.router_pattern || "${sitegroup}.${branch}.appuio.amazee.io" + var openshiftRessourceRouterUrl = routerPattern.replace('${branch}', safeBranchname).replace('${sitegroup}', siteGroupName).replace('_','-') + + if (siteGroupOpenShift.siteGroup.openshift.jenkins) { + jenkinsUrl = siteGroupOpenShift.siteGroup.openshift.jenkins + } else { + jenkinsUrl = process.env.JENKINS_URL || "https://amazee:amazee4ever$1@ci-popo.amazeeio.cloud" + } + + } catch(err) { + logger.warn(`Error while loading information for sitegroup ${siteGroupName}: ${err}`) + channelWrapper.ack(msg) + return + } + + logger.info(`Will deploy OpenShift Resources with app name ${openshiftRessourceAppName} on ${openshiftConsole}`); + + try { + await deployOpenShift(siteGroupName, branchName, safeBranchname, gitSha, openshiftRessourceAppName, openshiftRessourceRouterUrl, openshiftConsole, openshiftRegistry, openshiftToken, openshiftUsername, openshiftPassword, openshiftProject, openshiftTemplate, openshiftFolder, deployPrivateKey, gitUrl, jenkinsUrl) + } + catch(error) { + logger.error(`Error deploying OpenShift Resources with app name ${openshiftRessourceAppName} on ${openshiftConsole}. The error was: ${error}`) + sendToAmazeeioLogs('error', siteGroupName, "", "task:deploy-openshift:error", {}, +`ERROR: Deploying with label \`${openshiftRessourceAppName}\`: +\`\`\` +${error} +\`\`\`` + ) + channelWrapper.ack(msg) + return + } + logger.info(`Deployed OpenShift Resources with app name ${openshiftRessourceAppName} on ${openshiftConsole}`); + channelWrapper.ack(msg) +} + +async function deployOpenShift(siteGroupName, branchName, safeBranchname, gitSha, openshiftRessourceAppName, openshiftRessourceRouterUrl, openshiftConsole, openshiftRegistry, openshiftToken, openshiftUsername, openshiftPassword, openshiftProject, openshiftTemplate, openshiftFolder, deployPrivateKey, gitUrl, jenkinsUrl) { + var folderxml = + ` + + + + + + + + All + false + false + + + + + + + + ` + + let ocBuildDeploystage + let ocBuildDeployImageName + if (ocBuildDeployImageLocation == "dockerhub") { + ocBuildDeployImageName = `amazeeio/oc-build-deploy:${ocBuildDeployBranch}` + ocBuildDeploystage = + ` + stage ('oc-build-deploy docker pull') { + sh ''' + docker pull ${ocBuildDeployImageName} + ''' + } + ` + } else if (ocBuildDeployImageLocation == "absolute") { + ocBuildDeployImageName = `oc-build-deploy` + ocBuildDeploystage = + ` + stage ('oc-build-deploy docker build') { + sh ''' + docker build -t ${ocBuildDeployImageName} /docker-oc-build-deploy + ''' + } + ` + } else { + ocBuildDeployImageName = `oc-build-deploy-${ocBuildDeployBranch}` + ocBuildDeploystage = + ` + stage ('oc-build-deploy git checkout') { + git branch: '${ocBuildDeployBranch}', changelog: false, poll: false, url: '${ocBuildDeployImageLocation}', credentialsId: 'amazeeio-github-bearer-token' + } + + stage ('oc-build-deploy docker build') { + sh ''' + docker build -t ${ocBuildDeployImageName} . + ''' + } + ` + } + + // If we don't have an OpenShift token, start an amazeeio/oc container which will log us in and then get the token. + let getTokenStage + if (openshiftToken == "") { + getTokenStage = + ` + stage ('get oc token') { + env.OPENSHIFT_TOKEN = sh script: 'docker run --rm -e OPENSHIFT_USERNAME="${openshiftUsername}" -e OPENSHIFT_PASSWORD="${openshiftPassword}" -e OPENSHIFT_CONSOLE="${openshiftConsole}" amazeeio/oc oc whoami -t', returnStdout: true + env.OPENSHIFT_TOKEN = env.OPENSHIFT_TOKEN.trim() + } + ` + } else { + getTokenStage = + ` + stage ('get oc token') { + env.OPENSHIFT_TOKEN = "${openshiftToken}" + } + ` + } + + var shortName = `${safeBranchname}-${siteGroupName}`.substring(0, 24).replace(/[^a-z0-9]+$/, '').replace('_','-') + var buildName = gitSha ? gitSha.substring(0, 7) : branchName + // Deciding which git REF we would like deployed, if we have a sha given, we use that, if not we fall back to the branch (which needs be prefixed by `origin/`) + var gitRef = gitSha ? gitSha : `origin/${branchName}` + var jobdsl = + ` +node { + currentBuild.displayName = "#$BUILD_ID - ${buildName}" + env.IMAGE = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-').replaceAll('/','-') + + ${ocBuildDeploystage} + + ${getTokenStage} + + stage ('Deploy') { + sh """docker run --rm \\ + ${dockerRunParam} \\ + -e GIT_REPO="${gitUrl}" \\ + -e GIT_REF="${gitRef}" \\ + -e OPENSHIFT_CONSOLE="${openshiftConsole}" \\ + -e OPENSHIFT_REGISTRY="${openshiftRegistry}" \\ + -e OPENSHIFT_TOKEN="\${env.OPENSHIFT_TOKEN}" \\ + -e OPENSHIFT_PROJECT="${openshiftProject}" \\ + -e OPENSHIFT_ROUTER_URL="${openshiftRessourceRouterUrl}" \\ + -e OPENSHIFT_TEMPLATE="${openshiftTemplate}" \\ + -e OPENSHIFT_FOLDER="${openshiftFolder}" \\ + -e SSH_PRIVATE_KEY="${deployPrivateKey}" \\ + -e TAG="${safeBranchname}" \\ + -e BRANCH="${branchName}" \\ + -e IMAGE=\${env.IMAGE} \\ + -e NAME="${openshiftRessourceAppName}" \\ + -e SHORT_NAME="${shortName}" \\ + -e SITEGROUP="${siteGroupName}" \\ + -v $WORKSPACE:/git \\ + -v /var/run/docker.sock:/var/run/docker.sock \\ + ${ocBuildDeployImageName}""" + } + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: "${openshiftConsole}", authToken: env.OPENSHIFT_TOKEN, depCfg: "${openshiftRessourceAppName}", namespace: "${openshiftProject}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } + +} + + ` + + var jobxml = + ` + + + ${openshiftRessourceAppName} + false + + + + + + true + + + 0 + + ` + + var foldername = `${siteGroupName}` + + var jobname = `${foldername}/deploy-${openshiftRessourceAppName}` + + const jenkins = jenkinsLib({ baseUrl: `${jenkinsUrl}`, promisify: true}); + + // First check if the Folder exists (hint: Folders are also called "job" in Jenkins) + if (await jenkins.job.exists(foldername)) { + // Folder exists, update current config. + await jenkins.job.config(foldername, folderxml) + } else { + // Folder does not exist, create it. + await jenkins.job.create(foldername, folderxml) + } + + if (await jenkins.job.exists(jobname)) { + // Update existing job + logger.verbose("Job '%s' already existed, updating", jobname) + await jenkins.job.config(jobname, jobxml) + } else { + // Job does not exist yet, create new one + logger.verbose("New Job '%s' created", jobname) + await jenkins.job.create(jobname, jobxml) + } + + logger.verbose(`Queued job build: ${jobname}`) + let jenkinsJobBuildResponse = await jenkins.job.build(jobname) + + + let getJenkinsJobID = async jenkinsJobBuildResponse => { + while (true) { + let jenkinsQueueItem = await jenkins.queue.item(jenkinsJobBuildResponse) + if (jenkinsQueueItem.blocked == false) { + if (jenkinsQueueItem.executable) { + return jenkinsQueueItem.executable.number + } else { + logger.warn(`weird response from Jenkins. Trying again in 2 Secs. Reponse was: ${JSON.stringify(jenkinsQueueItem)}`) + await sleep(2000); + } + } else { + logger.verbose(`Job Build blocked, will try in 5 secs. Reason: ${jenkinsQueueItem.why}`) + await sleep(5000); + } + } + } + + let jenkinsJobID = await getJenkinsJobID(jenkinsJobBuildResponse) + + logger.verbose(`Running job build: ${jobname}, job id: ${jenkinsJobID}`) + + sendToAmazeeioLogs('start', siteGroupName, "", "task:deploy-openshift:start", {}, + `Start: Deploying \`${openshiftRessourceAppName}\`` + ) + + let log = jenkins.build.logStream(jobname, jenkinsJobID) + + return new Promise((resolve, reject) => { + log.on('data', text => { + logger.silly(text) + }); + + log.on('error', error => { + sendToAmazeeioLogs('error', siteGroupName, "", "task:deploy-openshift:error", {}, + `ERROR: Deploying \`${openshiftRessourceAppName}\`: + \`\`\` + ${error} + \`\`\`` + ) + logger.error(error) + throw error + }); + + log.on('end', async () => { + const result = await jenkins.build.get(jobname, jenkinsJobID) + if (result.result === "SUCCESS") { + sendToAmazeeioLogs('success', siteGroupName, "", "task:deploy-openshift:finished", {}, + `Finished: \`${openshiftRessourceAppName}\` ${openshiftRessourceRouterUrl}` + ) + logger.verbose(`Finished job build: ${jobname}, job id: ${jenkinsJobID}`) + } else { + sendToAmazeeioLogs('error', siteGroupName, "", "task:deploy-openshift:error", {}, `ERROR: Deploying \`${openshiftRessourceAppName}\``) + logger.error(`Finished FAILURE job build: ${jobname}, job id: ${jenkinsJobID}`) + } + resolve() + }); + }) +} \ No newline at end of file diff --git a/services/openshiftdeploy/yarn.lock b/services/openshiftdeploy/yarn.lock new file mode 100644 index 000000000..d71716299 --- /dev/null +++ b/services/openshiftdeploy/yarn.lock @@ -0,0 +1,3186 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@amazeeio/amazeeio-logs@^0.1.11": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-logs/-/amazeeio-logs-0.1.11.tgz#36ff8db6e9f1f83f65ad1906f338b4363d43d854" + dependencies: + amqp-connection-manager "^1.3.5" + amqplib "^0.5.1" + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn@^4.0.4: + version "4.0.11" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +amqp-connection-manager@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/amqp-connection-manager/-/amqp-connection-manager-1.3.5.tgz#4b4725fe96485ca0ad2aca8790e6d38800776449" + dependencies: + es6-promise "^3.0.2" + lodash "^4.15.0" + promise-breaker "^3.0.0" + when "^3.7.3" + +amqp-winston@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/amqp-winston/-/amqp-winston-1.0.7.tgz#017e267e54a1f26719f2401c4b9bb4585f3c0e27" + dependencies: + amqp "^0.2.0" + winston "^0.8.3" + +amqp@^0.2.0: + version "0.2.6" + resolved "https://registry.yarnpkg.com/amqp/-/amqp-0.2.6.tgz#d97fee5143026fa0b4fd6a5d56485f0448eb37ca" + dependencies: + lodash "^4.0.0" + +amqplib@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.4.2.tgz#5e4a2a914ccb3125f9cb91f6da07c97aa4cb13a6" + dependencies: + bitsyntax "~0.0.4" + buffer-more-ints "0.0.2" + readable-stream "1.x >=1.1.9" + when "~3.6.2" + +amqplib@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.1.tgz#7cccfebabe56c2e984ea7a2243f7cefe6fbfc6cf" + dependencies: + bitsyntax "~0.0.4" + bluebird "^3.4.6" + buffer-more-ints "0.0.2" + readable-stream "1.x >=1.1.9" + +ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@0.2.x: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.3.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9" + dependencies: + lodash "^4.14.0" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-cli@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" + dependencies: + babel-core "^6.24.1" + babel-polyfill "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.0.0, babel-core@^6.21.0, babel-core@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.18.0, babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^3.0.0" + babel-preset-jest "^18.0.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz#11d5abde18425ec24b5d648c7e0b5d25cd354a22" + dependencies: + find-up "^1.1.2" + istanbul-lib-instrument "^1.4.2" + object-assign "^4.1.0" + test-exclude "^3.3.0" + +babel-plugin-jest-hoist@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" + +babel-plugin-syntax-async-functions@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-flow-strip-types@^6.21.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.20.2: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.21.0, babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" + dependencies: + babel-plugin-jest-hoist "^18.0.0" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@6.x.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0, babel-template@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.18.0, babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +bitsyntax@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82" + dependencies: + buffer-more-ints "0.0.2" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.4.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +buffer-more-ints@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.4.3, chokidar@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" + dependencies: + marked "^0.3.6" + marked-terminal "^1.6.2" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@0.6.x: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + +colors@1.0.3, colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.8.1, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.1.1, debug@^2.2.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +es7-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es7-sleep/-/es7-sleep-1.0.0.tgz#d58a37c2504e81d50ad9885ba76baf3e8a8b5a87" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^1.8.0, fb-watchman@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" + dependencies: + bser "1.0.2" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-up@^1.0.0, find-up@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flow-bin@^0.37.4: + version "0.37.4" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.37.4.tgz#3d8da2ef746e80e730d166e09040f4198969b76b" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +from@~0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.15" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + supports-color "^0.2.0" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + +got@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" + dependencies: + duplexify "^3.2.0" + infinity-agent "^2.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + nested-error-stacks "^1.0.0" + object-assign "^3.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@~0.4.13: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +infinity-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-stream@^1.0.0, is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.0-alpha.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.7.tgz#f6f37f09f8002b130f891c646b70ee4a8e7345ae" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.2" + istanbul-lib-hook "^1.0.5" + istanbul-lib-instrument "^1.7.0" + istanbul-lib-report "^1.0.0" + istanbul-lib-source-maps "^1.1.1" + istanbul-reports "^1.0.2" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1" + +istanbul-lib-hook@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.0.2" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa" + dependencies: + handlebars "^4.0.3" + +jenkins@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/jenkins/-/jenkins-0.19.0.tgz#922af9c98b73dfd728cac92f8ad8bee2b91cd7f2" + dependencies: + papi "^0.26.0" + +jest-changed-files@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" + +jest-cli@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^17.0.2" + jest-config "^18.1.0" + jest-environment-jsdom "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-resolve-dependencies "^18.1.0" + jest-runtime "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + node-notifier "^4.6.1" + sane "~1.4.1" + strip-ansi "^3.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^18.1.0" + jest-environment-node "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" + +jest-environment-jsdom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + jsdom "^9.9.1" + +jest-environment-node@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-haste-map@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.4.1" + worker-farm "^1.3.1" + +jest-jasmine2@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^18.1.0" + jest-matchers "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" + dependencies: + chalk "^1.1.3" + pretty-format "^18.1.0" + +jest-matchers@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" + dependencies: + jest-diff "^18.1.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + pretty-format "^18.1.0" + +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" + +jest-resolve-dependencies@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" + dependencies: + jest-file-exists "^17.0.0" + jest-resolve "^18.1.0" + +jest-resolve@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" + dependencies: + browser-resolve "^1.11.2" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + resolve "^1.2.0" + +jest-runtime@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" + dependencies: + babel-core "^6.0.0" + babel-jest "^18.0.0" + babel-plugin-istanbul "^3.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + micromatch "^2.3.11" + yargs "^6.3.0" + +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" + dependencies: + jest-diff "^18.1.0" + jest-file-exists "^17.0.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + natural-compare "^1.4.0" + pretty-format "^18.1.0" + +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^18.0.0" + mkdirp "^0.5.1" + +jest@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" + dependencies: + jest-cli "^18.1.0" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@^3.7.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsdom@^9.9.1: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +latest-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" + dependencies: + package-json "^1.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.2.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" + +lokka-transport-http@^1.4.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/lokka-transport-http/-/lokka-transport-http-1.6.1.tgz#0dfbc2dc9e825f6e5821830f3f3f7f3f83a4ad65" + dependencies: + babel-runtime "6.x.x" + node-fetch "^1.5.2" + whatwg-fetch "^1.0.0" + +lokka@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/lokka/-/lokka-1.7.0.tgz#ab2e8334612d2afd359aa89047547bd7de21046c" + dependencies: + babel-runtime "6.x.x" + uuid "2.x.x" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" + dependencies: + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" + +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.13" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" + dependencies: + mime-db "~1.25.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +nan@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +nested-error-stacks@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +node-emoji@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" + dependencies: + string.prototype.codepointat "^0.2.0" + +node-fetch@^1.5.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" + dependencies: + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" + +node-pre-gyp@^0.6.29: + version "0.6.32" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" + dependencies: + mkdirp "~0.5.1" + nopt "~3.0.6" + npmlog "^4.0.1" + rc "~1.1.6" + request "^2.79.0" + rimraf "~2.5.4" + semver "~5.3.0" + tar "~2.2.1" + tar-pack "~3.3.0" + +nodemon@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" + dependencies: + chokidar "^1.4.3" + debug "^2.2.0" + es6-promise "^3.0.2" + ignore-by-default "^1.0.0" + lodash.defaults "^3.1.2" + minimatch "^3.0.0" + ps-tree "^1.0.1" + touch "1.0.0" + undefsafe "0.0.3" + update-notifier "0.5.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@~1.3.0, once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + dependencies: + got "^3.2.0" + registry-url "^3.0.0" + +papi@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/papi/-/papi-0.26.0.tgz#d6136a1492075ebc26452bd8e09e449980c47dd3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" + +private@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +promise-breaker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-3.0.0.tgz#bed499d1a9c35944950462baf47246fc11f19d9f" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +ps-tree@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +rc@^1.0.1, rc@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1.x >=1.1.9": + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-url@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.2.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.14" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" + dependencies: + source-map "^0.5.6" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string.prototype.codepointat@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +tar-pack@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +throat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +touch@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.4" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.4.tgz#8c9dbfb52795686f166cd2023794bcf103d13c2b" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +uglify-js@^2.6: + version "2.8.22" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + +update-notifier@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" + dependencies: + chalk "^1.0.0" + configstore "^1.0.0" + is-npm "^1.0.0" + latest-version "^1.0.0" + repeating "^1.1.2" + semver-diff "^2.0.0" + string-length "^1.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@2.x.x, uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.10: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-fetch@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319" + +whatwg-url@^4.3.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.0.tgz#202035ac1955b087cdd20fa8b58ded3ab1cd2af5" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +when@^3.7.3: + version "3.7.7" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.7.tgz#aba03fc3bb736d6c88b091d013d8a8e590d84718" + +when@~3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.0.5, which@^1.1.1: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +winston@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.0.tgz#207faaab6fccf3fe493743dd2b03dbafc7ceb78c" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs@^6.3.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/services/openshiftremove/.amazeeio.app.yml b/services/openshiftremove/.amazeeio.app.yml new file mode 100644 index 000000000..121e49f6e --- /dev/null +++ b/services/openshiftremove/.amazeeio.app.yml @@ -0,0 +1,62 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeio-openshift-template +parameters: + - name: TAG + description: Which docker image tag should be deployed + required: true + - name: NAME + description: Name of the objects to create + required: true + - name: SHORT_NAME + description: Shorter name of the objects to create, can be max 24 chars + required: true + - name: SITEGROUP + description: Which sitegroup this belongs to + required: true + - name: ROUTER_URL + description: URL of the Router + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ' ' + name: nodejs + resources: + requests: + cpu: 100m + memory: 100Mi + test: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - nodejs + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} + type: ImageChange + status: {} \ No newline at end of file diff --git a/services/openshiftremove/.babelrc b/services/openshiftremove/.babelrc new file mode 100644 index 000000000..bb092de4b --- /dev/null +++ b/services/openshiftremove/.babelrc @@ -0,0 +1,9 @@ +{ + "presets": ["es2015"], + "plugins": [ + "transform-flow-strip-types", + "transform-regenerator", + "syntax-async-functions", + "transform-object-rest-spread" + ] +} diff --git a/services/openshiftremove/.dockerignore b/services/openshiftremove/.dockerignore new file mode 100644 index 000000000..06ef0ae48 --- /dev/null +++ b/services/openshiftremove/.dockerignore @@ -0,0 +1,5 @@ +.openshift/* +.cache/* +node_modules/* +Jenkinsfile +.dockerignore \ No newline at end of file diff --git a/services/openshiftremove/.gitignore b/services/openshiftremove/.gitignore new file mode 100644 index 000000000..dd87e2d73 --- /dev/null +++ b/services/openshiftremove/.gitignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/openshiftremove/.openshift/.kubeconfig b/services/openshiftremove/.openshift/.kubeconfig new file mode 100644 index 000000000..a79c97f77 --- /dev/null +++ b/services/openshiftremove/.openshift/.kubeconfig @@ -0,0 +1,17 @@ +apiVersion: v1 +clusters: +- cluster: + server: https://console.appuio.ch:443 + name: appuio +contexts: +- context: + cluster: appuio + user: system:serviceaccount:amze-amazeeio:jenkins + name: appuio:amze-amazeeio:jenkins +current-context: appuio:amze-amazeeio:jenkins +kind: Config +preferences: {} +users: +- name: system:serviceaccount:amze-amazeeio:jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg diff --git a/services/openshiftremove/.openshift/README.md b/services/openshiftremove/.openshift/README.md new file mode 100644 index 000000000..6a67200e6 --- /dev/null +++ b/services/openshiftremove/.openshift/README.md @@ -0,0 +1,53 @@ +# OpenShift + +## Jenkins Access to Openshift + +In order for Jenkins to deploy to openshift we need to create an openshift serviceaccount that has access to our project (regular username/password logins expire after a couple of hours, not very good for a CI/CD system) + +1. Login as your user + + oc login + +2. Create new serviceaccount with the name jenkins + + oc create serviceaccount jenkins + +3. Give this serviceaccount edit access (see the name of the serviceaccount contains the project name!) + + oc policy add-role-to-user edit system:serviceaccount:appuio-demo2:jenkins2 + +4. Get access token from serviceaccount, with first getting the name of the token and then accessing the secret + + oc describe serviceaccount jenkins2 + + oc describe secret jenkins2-token-7tawv + +5. Add the token inside the .kubeconfig: + + + apiVersion: v1 + clusters: + - cluster: + server: https://console.appuio.ch:443 + name: appuio + contexts: + - context: + cluster: appuio + user: jenkins + name: appuio:jenkins + current-context: appuio:jenkins + kind: Config + preferences: {} + users: + - name: jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLXJhcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJqZW5raW5zLXRva2VuLTFocW42Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImplbmtpbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZmM4ZTIzMi05ZDBhLTExZTYtYTdlZi1mYTE2M2VkOTVkYWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YW16ZS1yYXM6amVua2lucyJ9.BAeU6zXl0uPCD2DRGJeV1oxRbk3sA3M5tn7K6xPh5iv-etS8Q2lsF-OFwO7HVycvEckXh31KNUmQTzvn3keSDT0a8BqViBhGPKCfAw-vf3ElUnGFDCWN9IpITKJBWIxVdGyd5sPltBWkAVxl9JOwnu1vrBvSioYqwjzYkjStbfp7pzLXhSld9G4AXA_zBntDW633mujllT0z_5IMSJX_gKSZcrTN78KLdCMmuvIT_m7xZMp_r52daEu67DjsjYtVqVx4BsDVPdUZRQ9eJtodbtZ-FJV9w0W4H9nX3iyqCk7OriD4Xt68Z5cUK0tR-4hyyh_hL31c6vzGb_VosmAWWg + + +6. Test the kubeconfig - should return `system:serviceaccount:appuio-demo2:jenkins2` + + KUBECONFIG=.openshift/.kubeconfig oc whoami + +7. Create a Docker authentication config.json so Jenkins can push into the Openshift docker Registry + + DOCKER_CONFIG=.openshift/ docker login -u jenkins2 -p $(KUBECONFIG=.openshift/.kubeconfig oc whoami -t) registry.appuio.ch \ No newline at end of file diff --git a/services/openshiftremove/.openshift/app.yml b/services/openshiftremove/.openshift/app.yml new file mode 100644 index 000000000..fe3daa4a5 --- /dev/null +++ b/services/openshiftremove/.openshift/app.yml @@ -0,0 +1,77 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: RABBITMQ_HOST + description: Hostname of the RabbitMQ Server to connect to + required: true + - name: JENKINS_URL + description: Hostname of the Jenkins Server + required: true + - name: AMAZEEIO_API_HOST + description: Hostname of the API + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: JENKINS_URL + value: ${JENKINS_URL} + - name: AMAZEEIO_API_HOST + value: ${AMAZEEIO_API_HOST} + - name: BRANCH + value: ${BRANCH} + resources: + limits: + memory: 500Mi + requests: + cpu: 200m + memory: 100Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} diff --git a/services/openshiftremove/.openshift/config.json b/services/openshiftremove/.openshift/config.json new file mode 100644 index 000000000..a526a5d46 --- /dev/null +++ b/services/openshiftremove/.openshift/config.json @@ -0,0 +1,7 @@ +{ + "auths": { + "registry.appuio.ch": { + "auth": "amVua2luczI6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoYlhwbExXRnRZWHBsWldsdklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltcGxibXRwYm5NdGRHOXJaVzR0TjJGcU5tOGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lhbVZ1YTJsdWN5SXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqRmlOelZoWXpkakxXTTJOV010TVRGbE5pMWlOelUxTFdaaE1UWXpaVE5sWXpjellTSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBoYlhwbExXRnRZWHBsWldsdk9tcGxibXRwYm5NaWZRLkRUSlpDd3BFWFlnenlaSmtDZHF6a0dHc0hWQWhNc0J0OGFtcmkydGZQYl9mOTZrZWxHOWFnVXBudzdZRmcweWkybEdGcjhTU1lMOEd2dXhuNHcwMXZXdHNMc2JhMjg5cFJNOUhiXzFJU2F0U1NWNTM5TXdQR2dpN2ZVN3F6Yk00ZzJpVmIxaW1sQkhJbW9tSkNXVzJDSW41aEF5VUR4Snd5OVh2Y0hyajZUYjE0X0c2YnVLT3JpR0JaejZ4Qmk5WWpOanh5eTlZem5WOVhkU1Z4THNXQjdFaG5yUnhveElFaWVPV0RaUHF1am9tSUFYczZ0TzdhcGFnNE1kZFl6LTVYdTg2Vm15SjZkS05KZUt2RUh0V1hUM081SUVqMEhmdlZGSnlKRTFKR3BfLVhnTzg4Ujh0WF9yOWYySU9PLXpyMU9OODVubUpjTDlGTGRLaFE4Z3dRZw==" + } + } +} \ No newline at end of file diff --git a/services/openshiftremove/Dockerfile b/services/openshiftremove/Dockerfile new file mode 100644 index 000000000..bbe47a8f8 --- /dev/null +++ b/services/openshiftremove/Dockerfile @@ -0,0 +1,21 @@ +FROM amazeeio/centos7-node-builder:6 as builder +ENV NODE_ENV production +COPY package.json yarn.lock /app/ +RUN BUILD_ONLY=true yarn install --pure-lockfile && yarn cache clean + +FROM amazeeio/centos7-node:6 +ENV NODE_ENV production +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +ARG AMAZEEIO_GIT_BRANCH=undefined + +ENV RABBITMQ_HOST "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@${AMAZEEIO_GIT_BRANCH}-rabbitmq" +ENV AMAZEEIO_API_HOST "http://${AMAZEEIO_GIT_BRANCH}-api:8080" +ENV JENKINS_URL "http://admin:fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR@${AMAZEEIO_GIT_BRANCH}-jenkins:8080" + +RUN yarn run build + +RUN fix-permissions /app/ + +CMD ["yarn", "start"] diff --git a/services/openshiftremove/Jenkinsfile b/services/openshiftremove/Jenkinsfile new file mode 100644 index 000000000..d5baa7937 --- /dev/null +++ b/services/openshiftremove/Jenkinsfile @@ -0,0 +1,161 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.OPENSHIFT_APP_YAML = "app.yml" + env.AMAZEEIO_SERVICE = "openshiftremove" + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.AMAZEEIO_SERVICE}/detail" + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + env.RABBITMQ_HOST = "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@rabbitmq-${env.TARGET_BRANCH}" + env.JENKINS_URL = "http://admin:fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR@jenkins-${env.TARGET_BRANCH}.appuio.amazeeio.review/" + env.AMAZEEIO_API_HOST = "http://api-${env.TARGET_BRANCH}.appuio.amazeeio.review" + + if (env.BRANCH == "master") { + env.JENKINS_URL = "https://admin:fZk3bf7hsbZCQ4kYHeYkXYNitCoy6u3BbmZrm9FR@jenkins.amazeeio.cloud/" + env.AMAZEEIO_API_HOST = "https://api.amazeeio.cloud" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + stage ('tests') { + // Running Tests in parallel, for faster completion + parallel ( + //test_unit: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-unit" + // } catch (e) { + // error(e, 'unit test') + // } + //}, + // test_http: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-http-ssr" + // } catch (e) { + // error(e, 'http test') + // } + // }, + //test_lint: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-lint" + // } catch (e) { + // error(e, 'lint') + // } + //} + ) + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh """docker run --rm -v $WORKSPACE/.openshift:/tmp -w /tmp/ -e KUBECONFIG=.kubeconfig michelesr/oc sh -c 'oc process \ + -n ${env.OPENSHIFT_PROJECT} \ + -f ${env.OPENSHIFT_APP_YAML} \ + -v BRANCH=${env.BRANCH} \ + -v RABBITMQ_HOST=${env.RABBITMQ_HOST} \ + -v AMAZEEIO_API_HOST=${env.AMAZEEIO_API_HOST} \ + -v JENKINS_URL=${env.JENKINS_URL} \ + -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} \ + -v AMAZEEIO_SERVICE=${env.AMAZEEIO_SERVICE} \ + | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'""" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.AMAZEEIO_SERVICE}-registry") { + try { + sh "docker tag ${env.IMAGE} registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.openshift docker push registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: 'https://console.appuio.ch:443', authToken: OPENSHIFT_TOKEN, depCfg: "${env.AMAZEEIO_SERVICE}-${env.BRANCH}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + + stage ('cleanup Docker Images') { + cleanupImage() + } + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> failed* \nStep: ${step} " + sendslack('danger', message) + cleanupImage() + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} + +def cleanupImage() { + try { + sh "docker rmi -f ${env.IMAGE}" + } catch (e) { + echo "Removal of Docker image '${env.IMAGE}' failed, ignoring this." + } +} diff --git a/services/openshiftremove/LICENSE.md b/services/openshiftremove/LICENSE.md new file mode 100644 index 000000000..79b52093e --- /dev/null +++ b/services/openshiftremove/LICENSE.md @@ -0,0 +1,11 @@ +The MIT License (MIT) +===================== + +Copyright (c) 2014 Rod Vagg +--------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/services/openshiftremove/README.md b/services/openshiftremove/README.md new file mode 100644 index 000000000..342c19031 --- /dev/null +++ b/services/openshiftremove/README.md @@ -0,0 +1,29 @@ +# amazeeio-openshiftremove + +This service is called 'openShiftRemove', is part of the amazee.io lagoon deployment system and is responsible for removing OpenShift Resources for each task in the rabbitmq queue `amazeeio-tasks:remove-openshift-resources` + +It does the following: +1. read message from a rabbitmq queue called `amazeeio-tasks:remove-openshift-resources`, which have the following information: + +- `siteGroupName` (name of the sitegroup that should be handled) +- `openshiftRessourceAppName` (name of ressource in openshift that should be removed, it use them as an openshift label with the key `app`) +- `openshiftProject` (name of the openshift project that should be removed) + +2. connect to the amazeeio api and load additional openshift information (token and the console url) for the given sitegroup +3. create a new jenkinsjob which runs `oc delete all -l app={openshiftRessourceAppName}` against the found OpenShift console + +It logs the start, success and error of the jenkins jobs into amazeeio-logs. + +It uses https://github.com/benbria/node-amqp-connection-manager for connecting to rabbitmq, so it can handle situations were rabbitmq is not reachable and still receive webhooks, process them and keep them in memory. As soon as rabbitmq is rechable again, it will send the messages there. + +## Hosting + +Fully developed in Docker and hosted on amazee.io Openshift, see the `.openshift` folder. Deployed via Jenkinsfile. + +Uses `amazeeio/centos7-node:node6` as base image. + +## Development + +Via the existing docker-compose.yml (see the file for defining the Api, Jenkins and RabbitMQ Host to be used) + + docker-compose up -d diff --git a/services/openshiftremove/package.json b/services/openshiftremove/package.json new file mode 100644 index 000000000..f92994e9c --- /dev/null +++ b/services/openshiftremove/package.json @@ -0,0 +1,42 @@ +{ + "name": "gitpush2ansibledeploy", + "version": "0.9.0", + "description": "Git Push 2 Ansible Deployment", + "main": "index.js", + "scripts": { + "start": "node build/index.js", + "build": "babel src -d build", + "dev": "nodemon src/index.js --exec babel-node" + }, + "author": "Michael Schmid (https://amazee.io)", + "repository": { + "type": "git", + "url": "https://github.com/amazeeio/gitpush2ansibledeploy" + }, + "license": "MIT", + "dependencies": { + "@amazeeio/amazeeio-logs": "^0.1.11", + "@amazeeio/amazeeio-local-logging": "^0.1.3", + "amqp-connection-manager": "^1.3.5", + "amqp-winston": "^1.0.7", + "amqplib": "^0.4.2", + "babel-cli": "^6.18.0", + "babel-core": "^6.21.0", + "babel-plugin-syntax-async-functions": "^6.13.0", + "babel-plugin-transform-flow-strip-types": "^6.21.0", + "babel-plugin-transform-object-rest-spread": "^6.20.2", + "babel-plugin-transform-regenerator": "^6.21.0", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.18.0", + "es7-sleep": "^1.0.0", + "jenkins": "^0.19.0", + "lokka": "^1.7.0", + "lokka-transport-http": "^1.4.0", + "nodemon": "^1.11.0", + "winston": "^2.2.0" + }, + "devDependencies": { + "flow-bin": "^0.37.4", + "jest": "^18.1.0" + } +} diff --git a/services/openshiftremove/src/index.js b/services/openshiftremove/src/index.js new file mode 100644 index 000000000..bf80f9758 --- /dev/null +++ b/services/openshiftremove/src/index.js @@ -0,0 +1,256 @@ +// @flow + +require("babel-polyfill"); + +import sleep from "es7-sleep"; +import Lokka from 'lokka'; +import Transport from 'lokka-transport-http'; +import { logger, initLogger } from '@amazeeio/amazeeio-local-logging'; +import amqp from 'amqp-connection-manager'; +import jenkinsLib from 'jenkins' +import { sendToAmazeeioLogs, initSendToAmazeeioLogs } from '@amazeeio/amazeeio-logs'; + + +// Initialize the logging mechanism +initLogger(); +initSendToAmazeeioLogs(); + +const amazeeioapihost = process.env.AMAZEEIO_API_HOST || "https://api.amazeeio.cloud" +const rabbitmqhost = process.env.RABBITMQ_HOST || "localhost" +const jenkinsurl = process.env.JENKINS_URL || "https://amazee:amazee4ever$1@ci-popo.amazeeio.cloud" + +const connection = amqp.connect([`amqp://${rabbitmqhost}`], {json: true}); +const jenkins = jenkinsLib({ baseUrl: `${jenkinsurl}`, promisify: true}); + +const amazeeioAPI = new Lokka({ + transport: new Transport(`${amazeeioapihost}/graphql`) +}); + +connection.on('connect', ({ url }) => logger.verbose('Connected to %s', url)); +connection.on('disconnect', params => logger.error('Not connected, error: %s', params.err.code, { reason: params })); + +const channelWrapper = connection.createChannel({ + setup: function(channel) { + return Promise.all([ + channel.assertQueue('amazeeio-tasks:remove-openshift-resources', {durable: true}), + channel.prefetch(2), + channel.consume('amazeeio-tasks:remove-openshift-resources', onMessage, {noAck: false}), + ]) + } +}); + + +var onMessage = async function(msg) { + var payload = JSON.parse(msg.content.toString()) + + const { + siteGroupName, + openshiftRessourceAppName, + } = payload + + logger.verbose(`Received RemoveOpenshiftResources task for sitegroup ${siteGroupName}, app name ${openshiftRessourceAppName}`); + + const siteGroupOpenShift = await amazeeioAPI.query(` + { + siteGroup:siteGroupByName(name: "${siteGroupName}"){ + openshift + } + } + `) + + try { + var openshiftConsole = siteGroupOpenShift.siteGroup.openshift.console + var openshiftToken = siteGroupOpenShift.siteGroup.openshift.token || "" + var openshiftUsername = siteGroupOpenShift.siteGroup.openshift.username || "" + var openshiftPassword = siteGroupOpenShift.siteGroup.openshift.password || "" + var openshiftProject = siteGroupOpenShift.siteGroup.openshift.project || siteGroupName + } catch(err) { + logger.warn(`Cannot find openshift token and console information for sitegroup ${siteGroupName}`) + channelWrapper.ack(msg) + return + } + + logger.info(`Will remove OpenShift Resources with app name ${openshiftRessourceAppName} on ${openshiftConsole}`); + + + + try { + await deleteOpenShiftRessources(siteGroupName, openshiftRessourceAppName, openshiftConsole, openshiftToken, openshiftUsername, openshiftPassword, openshiftProject) + } + catch(error) { + logger.error(`Error removing OpenShift Resources with app name ${openshiftRessourceAppName} on ${openshiftConsole}. The error was: ${error}`) + sendToAmazeeioLogs('error', siteGroupName, "", "task:remove-openshift-resources:error", {}, +`ERROR: removing ${openshiftRessourceAppName} on ${openshiftConsole}: +\`\`\` +${error} +\`\`\`` + ) + channelWrapper.ack(msg) + return + } + logger.info(`Removed OpenShift Resources with app name ${openshiftRessourceAppName} on ${openshiftConsole}`); + channelWrapper.ack(msg) +} + +async function deleteOpenShiftRessources(siteGroupName, openshiftRessourceAppName, openshiftConsole, openshiftToken, openshiftUsername, openshiftPassword, openshiftProject) { + var folderxml = + ` + + + + + + + + All + false + false + + + + + + + + ` + + // If we don't have an OpenShift token, start an amazeeio/oc container which will log us in and then get the token. + let getTokenStage + if (openshiftToken == "") { + getTokenStage = + ` + stage ('get oc token') { + env.OPENSHIFT_TOKEN = sh script: 'docker run --rm -e OPENSHIFT_USERNAME="${openshiftUsername}" -e OPENSHIFT_PASSWORD="${openshiftPassword}" -e OPENSHIFT_CONSOLE="${openshiftConsole}" amazeeio/oc oc whoami -t', returnStdout: true + env.OPENSHIFT_TOKEN = env.OPENSHIFT_TOKEN.trim() + } + ` + } else { + getTokenStage = + ` + stage ('get oc token') { + env.OPENSHIFT_TOKEN = "${openshiftToken}" + } + ` + } + + var jobdsl = + ` + node { + + ${getTokenStage} + + stage ('oc delete') { + sh """ + docker run --rm -e OPENSHIFT_CONSOLE=${openshiftConsole} -e OPENSHIFT_TOKEN="\${env.OPENSHIFT_TOKEN}" amazeeio/oc oc --insecure-skip-tls-verify delete all -l app=${openshiftRessourceAppName} -n ${openshiftProject} + """ + } + } + ` + + var jobxml = + ` + + + ${openshiftRessourceAppName} + false + + + + + + true + + + 0 + + ` + + var foldername = `${siteGroupName}` + + var jobname = `${foldername}/remove-${openshiftRessourceAppName}` + + + // First check if the Folder exists (hint: Folders are also called "job" in Jenkins) + if (await jenkins.job.exists(foldername)) { + // Folder exists, update current config. + await jenkins.job.config(foldername, folderxml) + } else { + // Folder does not exist, create it. + await jenkins.job.create(foldername, folderxml) + } + + if (await jenkins.job.exists(jobname)) { + // Update existing job + logger.verbose("Job '%s' already existed, updating", jobname) + await jenkins.job.config(jobname, jobxml) + } else { + // Job does not exist yet, create new one + logger.verbose("New Job '%s' created", jobname) + await jenkins.job.create(jobname, jobxml) + } + + logger.verbose(`Queued job build: ${jobname}`) + let jenkinsJobBuildResponse = await jenkins.job.build(jobname) + + + let getJenkinsJobID = async jenkinsJobBuildResponse => { + while (true) { + let jenkinsQueueItem = await jenkins.queue.item(jenkinsJobBuildResponse) + if (jenkinsQueueItem.blocked == false) { + if (jenkinsQueueItem.executable) { + return jenkinsQueueItem.executable.number + } else { + logger.warn(`weird response from Jenkins. Trying again in 2 Secs. Reponse was: ${JSON.stringify(jenkinsQueueItem)}`) + await sleep(2000); + } + } else { + logger.verbose(`Job Build blocked, will try in 5 secs. Reason: ${jenkinsQueueItem.why}`) + await sleep(5000); + } + } + } + + let jenkinsJobID = await getJenkinsJobID(jenkinsJobBuildResponse) + + logger.verbose(`Running job build: ${jobname}, job id: ${jenkinsJobID}`) + + const amazeeioLogsText = `resources with label \`${openshiftRessourceAppName}\` on \`${openshiftConsole}\` in \`${openshiftProject}\`` + + sendToAmazeeioLogs('start', siteGroupName, "", "task:remove-openshift-resources:start", {}, + `Start: remove ${amazeeioLogsText}` + ) + + let log = jenkins.build.logStream(jobname, jenkinsJobID) + + return new Promise((resolve, reject) => { + log.on('data', text => { + logger.silly(text) + }); + + log.on('error', error => { + sendToAmazeeioLogs('error', siteGroupName, "", "task:remove-openshift-resources:error", {}, + `ERROR: removing ${amazeeioLogsText}: + \`\`\` + ${error} + \`\`\`` + ) + logger.error(error) + throw error + }); + + log.on('end', async () => { + const result = await jenkins.build.get(jobname, jenkinsJobID) + + if (result.result === "SUCCESS") { + sendToAmazeeioLogs('success', siteGroupName, "", "task:remove-openshift-resources:finished", {}, + `Finished: remove ${amazeeioLogsText}` + ) + logger.verbose(`Finished job build: ${jobname}, job id: ${jenkinsJobID}`) + } else { + sendToAmazeeioLogs('error', siteGroupName, "", "task:remove-openshift-resources:error", {}, `ERROR: Removing \`${openshiftRessourceAppName}\``) + logger.error(`Finished FAILURE job removal: ${jobname}, job id: ${jenkinsJobID}`) + } + resolve() + }); + }) +} \ No newline at end of file diff --git a/services/openshiftremove/yarn.lock b/services/openshiftremove/yarn.lock new file mode 100644 index 000000000..d71716299 --- /dev/null +++ b/services/openshiftremove/yarn.lock @@ -0,0 +1,3186 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@amazeeio/amazeeio-logs@^0.1.11": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-logs/-/amazeeio-logs-0.1.11.tgz#36ff8db6e9f1f83f65ad1906f338b4363d43d854" + dependencies: + amqp-connection-manager "^1.3.5" + amqplib "^0.5.1" + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn@^4.0.4: + version "4.0.11" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +amqp-connection-manager@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/amqp-connection-manager/-/amqp-connection-manager-1.3.5.tgz#4b4725fe96485ca0ad2aca8790e6d38800776449" + dependencies: + es6-promise "^3.0.2" + lodash "^4.15.0" + promise-breaker "^3.0.0" + when "^3.7.3" + +amqp-winston@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/amqp-winston/-/amqp-winston-1.0.7.tgz#017e267e54a1f26719f2401c4b9bb4585f3c0e27" + dependencies: + amqp "^0.2.0" + winston "^0.8.3" + +amqp@^0.2.0: + version "0.2.6" + resolved "https://registry.yarnpkg.com/amqp/-/amqp-0.2.6.tgz#d97fee5143026fa0b4fd6a5d56485f0448eb37ca" + dependencies: + lodash "^4.0.0" + +amqplib@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.4.2.tgz#5e4a2a914ccb3125f9cb91f6da07c97aa4cb13a6" + dependencies: + bitsyntax "~0.0.4" + buffer-more-ints "0.0.2" + readable-stream "1.x >=1.1.9" + when "~3.6.2" + +amqplib@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.1.tgz#7cccfebabe56c2e984ea7a2243f7cefe6fbfc6cf" + dependencies: + bitsyntax "~0.0.4" + bluebird "^3.4.6" + buffer-more-ints "0.0.2" + readable-stream "1.x >=1.1.9" + +ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@0.2.x: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.3.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9" + dependencies: + lodash "^4.14.0" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-cli@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" + dependencies: + babel-core "^6.24.1" + babel-polyfill "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.0.0, babel-core@^6.21.0, babel-core@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.18.0, babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^3.0.0" + babel-preset-jest "^18.0.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz#11d5abde18425ec24b5d648c7e0b5d25cd354a22" + dependencies: + find-up "^1.1.2" + istanbul-lib-instrument "^1.4.2" + object-assign "^4.1.0" + test-exclude "^3.3.0" + +babel-plugin-jest-hoist@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" + +babel-plugin-syntax-async-functions@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-flow-strip-types@^6.21.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.20.2: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.21.0, babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" + dependencies: + babel-plugin-jest-hoist "^18.0.0" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@6.x.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0, babel-template@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.18.0, babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +bitsyntax@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82" + dependencies: + buffer-more-ints "0.0.2" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.4.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +buffer-more-ints@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.4.3, chokidar@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" + dependencies: + marked "^0.3.6" + marked-terminal "^1.6.2" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@0.6.x: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + +colors@1.0.3, colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.8.1, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.1.1, debug@^2.2.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +es7-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es7-sleep/-/es7-sleep-1.0.0.tgz#d58a37c2504e81d50ad9885ba76baf3e8a8b5a87" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^1.8.0, fb-watchman@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" + dependencies: + bser "1.0.2" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-up@^1.0.0, find-up@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flow-bin@^0.37.4: + version "0.37.4" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.37.4.tgz#3d8da2ef746e80e730d166e09040f4198969b76b" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +from@~0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.15" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + supports-color "^0.2.0" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + +got@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" + dependencies: + duplexify "^3.2.0" + infinity-agent "^2.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + nested-error-stacks "^1.0.0" + object-assign "^3.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@~0.4.13: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +infinity-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-stream@^1.0.0, is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.0-alpha.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.7.tgz#f6f37f09f8002b130f891c646b70ee4a8e7345ae" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.2" + istanbul-lib-hook "^1.0.5" + istanbul-lib-instrument "^1.7.0" + istanbul-lib-report "^1.0.0" + istanbul-lib-source-maps "^1.1.1" + istanbul-reports "^1.0.2" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1" + +istanbul-lib-hook@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.0.2" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa" + dependencies: + handlebars "^4.0.3" + +jenkins@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/jenkins/-/jenkins-0.19.0.tgz#922af9c98b73dfd728cac92f8ad8bee2b91cd7f2" + dependencies: + papi "^0.26.0" + +jest-changed-files@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" + +jest-cli@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^17.0.2" + jest-config "^18.1.0" + jest-environment-jsdom "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-resolve-dependencies "^18.1.0" + jest-runtime "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + node-notifier "^4.6.1" + sane "~1.4.1" + strip-ansi "^3.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^18.1.0" + jest-environment-node "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" + +jest-environment-jsdom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + jsdom "^9.9.1" + +jest-environment-node@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-haste-map@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.4.1" + worker-farm "^1.3.1" + +jest-jasmine2@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^18.1.0" + jest-matchers "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" + dependencies: + chalk "^1.1.3" + pretty-format "^18.1.0" + +jest-matchers@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" + dependencies: + jest-diff "^18.1.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + pretty-format "^18.1.0" + +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" + +jest-resolve-dependencies@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" + dependencies: + jest-file-exists "^17.0.0" + jest-resolve "^18.1.0" + +jest-resolve@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" + dependencies: + browser-resolve "^1.11.2" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + resolve "^1.2.0" + +jest-runtime@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" + dependencies: + babel-core "^6.0.0" + babel-jest "^18.0.0" + babel-plugin-istanbul "^3.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + micromatch "^2.3.11" + yargs "^6.3.0" + +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" + dependencies: + jest-diff "^18.1.0" + jest-file-exists "^17.0.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + natural-compare "^1.4.0" + pretty-format "^18.1.0" + +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^18.0.0" + mkdirp "^0.5.1" + +jest@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" + dependencies: + jest-cli "^18.1.0" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@^3.7.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsdom@^9.9.1: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +latest-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" + dependencies: + package-json "^1.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.2.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" + +lokka-transport-http@^1.4.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/lokka-transport-http/-/lokka-transport-http-1.6.1.tgz#0dfbc2dc9e825f6e5821830f3f3f7f3f83a4ad65" + dependencies: + babel-runtime "6.x.x" + node-fetch "^1.5.2" + whatwg-fetch "^1.0.0" + +lokka@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/lokka/-/lokka-1.7.0.tgz#ab2e8334612d2afd359aa89047547bd7de21046c" + dependencies: + babel-runtime "6.x.x" + uuid "2.x.x" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" + dependencies: + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" + +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.13" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" + dependencies: + mime-db "~1.25.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +nan@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +nested-error-stacks@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +node-emoji@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" + dependencies: + string.prototype.codepointat "^0.2.0" + +node-fetch@^1.5.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" + dependencies: + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" + +node-pre-gyp@^0.6.29: + version "0.6.32" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" + dependencies: + mkdirp "~0.5.1" + nopt "~3.0.6" + npmlog "^4.0.1" + rc "~1.1.6" + request "^2.79.0" + rimraf "~2.5.4" + semver "~5.3.0" + tar "~2.2.1" + tar-pack "~3.3.0" + +nodemon@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" + dependencies: + chokidar "^1.4.3" + debug "^2.2.0" + es6-promise "^3.0.2" + ignore-by-default "^1.0.0" + lodash.defaults "^3.1.2" + minimatch "^3.0.0" + ps-tree "^1.0.1" + touch "1.0.0" + undefsafe "0.0.3" + update-notifier "0.5.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@~1.3.0, once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + dependencies: + got "^3.2.0" + registry-url "^3.0.0" + +papi@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/papi/-/papi-0.26.0.tgz#d6136a1492075ebc26452bd8e09e449980c47dd3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" + +private@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +promise-breaker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-3.0.0.tgz#bed499d1a9c35944950462baf47246fc11f19d9f" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +ps-tree@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +rc@^1.0.1, rc@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1.x >=1.1.9": + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-url@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.2.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.14" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" + dependencies: + source-map "^0.5.6" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string.prototype.codepointat@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +tar-pack@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +throat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +touch@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.4" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.4.tgz#8c9dbfb52795686f166cd2023794bcf103d13c2b" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +uglify-js@^2.6: + version "2.8.22" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + +update-notifier@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" + dependencies: + chalk "^1.0.0" + configstore "^1.0.0" + is-npm "^1.0.0" + latest-version "^1.0.0" + repeating "^1.1.2" + semver-diff "^2.0.0" + string-length "^1.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@2.x.x, uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.10: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-fetch@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319" + +whatwg-url@^4.3.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.0.tgz#202035ac1955b087cdd20fa8b58ded3ab1cd2af5" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +when@^3.7.3: + version "3.7.7" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.7.tgz#aba03fc3bb736d6c88b091d013d8a8e590d84718" + +when@~3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.0.5, which@^1.1.1: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +winston@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.0.tgz#207faaab6fccf3fe493743dd2b03dbafc7ceb78c" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs@^6.3.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/services/rabbitmq/.amazeeio.app.yml b/services/rabbitmq/.amazeeio.app.yml new file mode 100644 index 000000000..66d42f782 --- /dev/null +++ b/services/rabbitmq/.amazeeio.app.yml @@ -0,0 +1,125 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeio-openshift-template-rabbitmq +parameters: + - name: TAG + description: Which docker image tag should be deployed + required: true + - name: NAME + description: Name of the objects to create + required: true + - name: SHORT_NAME + description: Shorter name of the objects to create, can be max 24 chars + required: true + - name: SITEGROUP + description: Which sitegroup this belongs to + required: true + - name: ROUTER_URL + description: URL of the Router + required: true +objects: +- apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: ${NAME}-volume + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ' ' + name: rabbitmq + ports: + - containerPort: 15672 + protocol: TCP + - containerPort: 5672 + protocol: TCP + readinessProbe: + tcpSocket: + port: 5672 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + requests: + cpu: 100m + memory: 100Mi + volumeMounts: + - mountPath: /var/lib/rabbitmq + name: ${NAME}-volume + volumes: + - name: ${NAME}-volume + persistentVolumeClaim: + claimName: ${NAME}-volume + test: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - rabbitmq + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} + type: ImageChange + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: 15672-tcp + port: 15672 + protocol: TCP + targetPort: 15672 + - name: 5672-tcp + port: 5672 + protocol: TCP + targetPort: 5672 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + host: ${ROUTER_URL} + port: + targetPort: 15672-tcp + to: + kind: Service + name: ${SHORT_NAME} \ No newline at end of file diff --git a/services/rabbitmq/.dockerignore b/services/rabbitmq/.dockerignore new file mode 100644 index 000000000..8613356a1 --- /dev/null +++ b/services/rabbitmq/.dockerignore @@ -0,0 +1,3 @@ +.openshift/* +Jenkinsfile +.dockerignore \ No newline at end of file diff --git a/services/rabbitmq/.openshift/.kubeconfig b/services/rabbitmq/.openshift/.kubeconfig new file mode 100644 index 000000000..a79c97f77 --- /dev/null +++ b/services/rabbitmq/.openshift/.kubeconfig @@ -0,0 +1,17 @@ +apiVersion: v1 +clusters: +- cluster: + server: https://console.appuio.ch:443 + name: appuio +contexts: +- context: + cluster: appuio + user: system:serviceaccount:amze-amazeeio:jenkins + name: appuio:amze-amazeeio:jenkins +current-context: appuio:amze-amazeeio:jenkins +kind: Config +preferences: {} +users: +- name: system:serviceaccount:amze-amazeeio:jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg diff --git a/services/rabbitmq/.openshift/README.md b/services/rabbitmq/.openshift/README.md new file mode 100644 index 000000000..6a67200e6 --- /dev/null +++ b/services/rabbitmq/.openshift/README.md @@ -0,0 +1,53 @@ +# OpenShift + +## Jenkins Access to Openshift + +In order for Jenkins to deploy to openshift we need to create an openshift serviceaccount that has access to our project (regular username/password logins expire after a couple of hours, not very good for a CI/CD system) + +1. Login as your user + + oc login + +2. Create new serviceaccount with the name jenkins + + oc create serviceaccount jenkins + +3. Give this serviceaccount edit access (see the name of the serviceaccount contains the project name!) + + oc policy add-role-to-user edit system:serviceaccount:appuio-demo2:jenkins2 + +4. Get access token from serviceaccount, with first getting the name of the token and then accessing the secret + + oc describe serviceaccount jenkins2 + + oc describe secret jenkins2-token-7tawv + +5. Add the token inside the .kubeconfig: + + + apiVersion: v1 + clusters: + - cluster: + server: https://console.appuio.ch:443 + name: appuio + contexts: + - context: + cluster: appuio + user: jenkins + name: appuio:jenkins + current-context: appuio:jenkins + kind: Config + preferences: {} + users: + - name: jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLXJhcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJqZW5raW5zLXRva2VuLTFocW42Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImplbmtpbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZmM4ZTIzMi05ZDBhLTExZTYtYTdlZi1mYTE2M2VkOTVkYWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YW16ZS1yYXM6amVua2lucyJ9.BAeU6zXl0uPCD2DRGJeV1oxRbk3sA3M5tn7K6xPh5iv-etS8Q2lsF-OFwO7HVycvEckXh31KNUmQTzvn3keSDT0a8BqViBhGPKCfAw-vf3ElUnGFDCWN9IpITKJBWIxVdGyd5sPltBWkAVxl9JOwnu1vrBvSioYqwjzYkjStbfp7pzLXhSld9G4AXA_zBntDW633mujllT0z_5IMSJX_gKSZcrTN78KLdCMmuvIT_m7xZMp_r52daEu67DjsjYtVqVx4BsDVPdUZRQ9eJtodbtZ-FJV9w0W4H9nX3iyqCk7OriD4Xt68Z5cUK0tR-4hyyh_hL31c6vzGb_VosmAWWg + + +6. Test the kubeconfig - should return `system:serviceaccount:appuio-demo2:jenkins2` + + KUBECONFIG=.openshift/.kubeconfig oc whoami + +7. Create a Docker authentication config.json so Jenkins can push into the Openshift docker Registry + + DOCKER_CONFIG=.openshift/ docker login -u jenkins2 -p $(KUBECONFIG=.openshift/.kubeconfig oc whoami -t) registry.appuio.ch \ No newline at end of file diff --git a/services/rabbitmq/.openshift/config.json b/services/rabbitmq/.openshift/config.json new file mode 100644 index 000000000..a526a5d46 --- /dev/null +++ b/services/rabbitmq/.openshift/config.json @@ -0,0 +1,7 @@ +{ + "auths": { + "registry.appuio.ch": { + "auth": "amVua2luczI6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoYlhwbExXRnRZWHBsWldsdklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltcGxibXRwYm5NdGRHOXJaVzR0TjJGcU5tOGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lhbVZ1YTJsdWN5SXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqRmlOelZoWXpkakxXTTJOV010TVRGbE5pMWlOelUxTFdaaE1UWXpaVE5sWXpjellTSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBoYlhwbExXRnRZWHBsWldsdk9tcGxibXRwYm5NaWZRLkRUSlpDd3BFWFlnenlaSmtDZHF6a0dHc0hWQWhNc0J0OGFtcmkydGZQYl9mOTZrZWxHOWFnVXBudzdZRmcweWkybEdGcjhTU1lMOEd2dXhuNHcwMXZXdHNMc2JhMjg5cFJNOUhiXzFJU2F0U1NWNTM5TXdQR2dpN2ZVN3F6Yk00ZzJpVmIxaW1sQkhJbW9tSkNXVzJDSW41aEF5VUR4Snd5OVh2Y0hyajZUYjE0X0c2YnVLT3JpR0JaejZ4Qmk5WWpOanh5eTlZem5WOVhkU1Z4THNXQjdFaG5yUnhveElFaWVPV0RaUHF1am9tSUFYczZ0TzdhcGFnNE1kZFl6LTVYdTg2Vm15SjZkS05KZUt2RUh0V1hUM081SUVqMEhmdlZGSnlKRTFKR3BfLVhnTzg4Ujh0WF9yOWYySU9PLXpyMU9OODVubUpjTDlGTGRLaFE4Z3dRZw==" + } + } +} \ No newline at end of file diff --git a/services/rabbitmq/.openshift/development.app.yml b/services/rabbitmq/.openshift/development.app.yml new file mode 100644 index 000000000..63813446d --- /dev/null +++ b/services/rabbitmq/.openshift/development.app.yml @@ -0,0 +1,131 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true +objects: +- apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +- apiVersion: v1 + kind: DeploymentConfig + metadata: + annotations: + openshift.io/generated-by: OpenShiftNewApp + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + strategy: + type: Rolling + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: appuio-demo2/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: NODENAME + value: "${AMAZEEIO_SERVICE}@localhost" + ports: + - containerPort: 4369 + protocol: TCP + - containerPort: 5671 + protocol: TCP + - containerPort: 5672 + protocol: TCP + - containerPort: 25672 + protocol: TCP + - containerPort: 15672 + protocol: TCP + readinessProbe: + tcpSocket: + port: 5672 + initialDelaySeconds: 5 + timeoutSeconds: 1 + resources: + limits: + cpu: 1 + memory: 500Mi + requests: + cpu: 200m + memory: 200Mi + volumeMounts: + - mountPath: /var/lib/${AMAZEEIO_SERVICE} + name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + volumes: + - name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + persistentVolumeClaim: + claimName: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + test: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + type: ImageChange + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + ports: + - name: 5672-tcp + port: 5672 + protocol: TCP + targetPort: 5672 + - name: 15672-tcp + port: 80 + protocol: TCP + targetPort: 15672 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + host: ${AMAZEEIO_SERVICE}-${BRANCH}.appuio.amazeeio.review + port: + targetPort: 15672-tcp + to: + kind: Service + name: ${AMAZEEIO_SERVICE}-${BRANCH} diff --git a/services/rabbitmq/.openshift/production.app.yml b/services/rabbitmq/.openshift/production.app.yml new file mode 100644 index 000000000..92f4ce92d --- /dev/null +++ b/services/rabbitmq/.openshift/production.app.yml @@ -0,0 +1,134 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true +objects: +- apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +- apiVersion: v1 + kind: DeploymentConfig + metadata: + annotations: + openshift.io/generated-by: OpenShiftNewApp + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + strategy: + type: Rolling + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: appuio-demo2/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: HOSTNAME + value: ${AMAZEEIO_SERVICE} + - name: NODENAME + value: ${AMAZEEIO_SERVICE} + ports: + - containerPort: 4369 + protocol: TCP + - containerPort: 5671 + protocol: TCP + - containerPort: 5672 + protocol: TCP + - containerPort: 25672 + protocol: TCP + - containerPort: 15672 + protocol: TCP + readinessProbe: + tcpSocket: + port: 5672 + initialDelaySeconds: 5 + timeoutSeconds: 3 + failureThreshold: 10 + resources: + limits: + memory: 500Mi + requests: + cpu: 200m + memory: 200Mi + volumeMounts: + - mountPath: /var/lib/${AMAZEEIO_SERVICE} + name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + volumes: + - name: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + persistentVolumeClaim: + claimName: ${AMAZEEIO_SERVICE}-${BRANCH}-volume + test: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + type: ImageChange + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + ports: + - name: 5672-tcp + port: 5672 + protocol: TCP + targetPort: 5672 + - name: 15672-tcp + port: 80 + protocol: TCP + targetPort: 15672 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +## ## No route for production right now, until https://ticket.vshn.net/browse/AMZE-329 is figured out +##- apiVersion: v1 +## kind: Route +## metadata: +## creationTimestamp: null +## labels: +## app: ${AMAZEEIO_SERVICE}-${BRANCH} +## name: ${AMAZEEIO_SERVICE}-${BRANCH} +## spec: +## host: rabbitmq.amazeeio.cloud +## port: +## targetPort: 15672-tcp +## to: +## kind: Service +## name: ${AMAZEEIO_SERVICE}-${BRANCH} diff --git a/services/rabbitmq/Dockerfile b/services/rabbitmq/Dockerfile new file mode 100644 index 000000000..3243fa6b2 --- /dev/null +++ b/services/rabbitmq/Dockerfile @@ -0,0 +1,5 @@ +FROM rabbitmq:3-management + +ENV RABBITMQ_DEFAULT_USER=amazeeio \ + RABBITMQ_DEFAULT_PASS="NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3" \ + NODENAME="rabbitmq@localhost" \ No newline at end of file diff --git a/services/rabbitmq/Jenkinsfile b/services/rabbitmq/Jenkinsfile new file mode 100644 index 000000000..265f065f2 --- /dev/null +++ b/services/rabbitmq/Jenkinsfile @@ -0,0 +1,147 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.OPENSHIFT_APP_YAML = "development.app.yml" + env.AMAZEEIO_SERVICE = "rabbitmq" + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.AMAZEEIO_SERVICE}/detail" + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + if (env.BRANCH == 'master') { + env.OPENSHIFT_APP_YAML = "production.app.yml" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --no-cache --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + stage ('tests') { + // Running Tests in parallel, for faster completion + parallel ( + //test_unit: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-unit" + // } catch (e) { + // error(e, 'unit test') + // } + //}, + // test_http: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-http-ssr" + // } catch (e) { + // error(e, 'http test') + // } + // }, + //test_lint: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-lint" + // } catch (e) { + // error(e, 'lint') + // } + //} + ) + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh "docker run --rm -v $WORKSPACE/.openshift:/tmp -w /tmp/ -e KUBECONFIG=.kubeconfig michelesr/oc sh -c 'oc process -n ${env.OPENSHIFT_PROJECT} -f ${env.OPENSHIFT_APP_YAML} -v BRANCH=${env.BRANCH} -v AMAZEEIO_SERVICE=${env.AMAZEEIO_SERVICE} | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock('webhook-handler-registry') { + try { + sh "docker tag ${env.IMAGE} registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.openshift docker push registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: 'https://console.appuio.ch:443', authToken: OPENSHIFT_TOKEN, depCfg: "${env.AMAZEEIO_SERVICE}-${env.BRANCH}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + + stage ('cleanup Docker Images') { + cleanupImage() + } + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> failed* \nStep: ${step} " + sendslack('danger', message) + cleanupImage() + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} + +def cleanupImage() { + try { + sh "docker rmi -f ${env.IMAGE}" + } catch (e) { + echo "Removal of Docker image '${env.IMAGE}' failed, ignoring this." + } +} diff --git a/services/rabbitmq/docker-compose.yml b/services/rabbitmq/docker-compose.yml new file mode 100644 index 000000000..e1d21ca35 --- /dev/null +++ b/services/rabbitmq/docker-compose.yml @@ -0,0 +1,7 @@ +version: '2' +services: + rabbitmq: + build: . + ports: + - "15672:15672" + - "5672:5672" diff --git a/services/rest2tasks/.babelrc b/services/rest2tasks/.babelrc new file mode 100755 index 000000000..bb092de4b --- /dev/null +++ b/services/rest2tasks/.babelrc @@ -0,0 +1,9 @@ +{ + "presets": ["es2015"], + "plugins": [ + "transform-flow-strip-types", + "transform-regenerator", + "syntax-async-functions", + "transform-object-rest-spread" + ] +} diff --git a/services/rest2tasks/.dockerignore b/services/rest2tasks/.dockerignore new file mode 100644 index 000000000..27d9b664a --- /dev/null +++ b/services/rest2tasks/.dockerignore @@ -0,0 +1,4 @@ +node_modules +.dockerignore +.openshift +Jenkinsfile \ No newline at end of file diff --git a/services/rest2tasks/.gitignore b/services/rest2tasks/.gitignore new file mode 100755 index 000000000..b7dab5e9c --- /dev/null +++ b/services/rest2tasks/.gitignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/rest2tasks/.openshift/development.app.yml b/services/rest2tasks/.openshift/development.app.yml new file mode 100644 index 000000000..cf611f09a --- /dev/null +++ b/services/rest2tasks/.openshift/development.app.yml @@ -0,0 +1,111 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: TAG + description: Which tag should be deployed + required: true + - name: NAME + description: How is the resources are called + required: true + - name: SHORT_NAME + description: Name of resources in max 24 chars + required: true + - name: SITEGROUP + description: Name of the site group + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true + - name: RABBITMQ_HOST + description: Host of rabbitmq +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ' ' + name: ${NAME} + ports: + - containerPort: 8000 + name: http + protocol: TCP + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + resources: + limits: + cpu: 500m + memory: 800Mi + requests: + cpu: 200m + memory: 300Mi + readinessProbe: + httpGet: + port: http + initialDelaySeconds: 20 + livenessProbe: + httpGet: + port: http + initialDelaySeconds: 120 + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${NAME} + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: http + targetPort: http + port: 80 + selector: + app: ${NAME} + deploymentconfig: ${NAME} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + host: ${NAME}.appuio.amazeeio.review + port: + targetPort: http + to: + kind: Service + name: ${SHORT_NAME} diff --git a/services/rest2tasks/.openshift/production.app.yml b/services/rest2tasks/.openshift/production.app.yml new file mode 100644 index 000000000..093e441b1 --- /dev/null +++ b/services/rest2tasks/.openshift/production.app.yml @@ -0,0 +1,112 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeioservice-template +parameters: + - name: TAG + description: Which tag should be deployed + required: true + - name: NAME + description: How is the resources are called + required: true + - name: SHORT_NAME + description: Name of resources in max 24 chars + required: true + - name: SITEGROUP + description: Name of the site group + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true + - name: RABBITMQ_HOST + description: Host of rabbitmq +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ' ' + name: ${NAME} + ports: + - containerPort: 8000 + name: http + protocol: TCP + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + resources: + limits: + cpu: 500m + memory: 800Mi + requests: + cpu: 200m + memory: 300Mi + readinessProbe: + httpGet: + port: http + initialDelaySeconds: 20 + livenessProbe: + httpGet: + port: http + initialDelaySeconds: 120 + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${NAME} + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${SHORT_NAME} + spec: + ports: + - name: http + targetPort: http + port: 80 + selector: + app: ${NAME} + deploymentconfig: ${NAME} +## ## No route for production right now, until https://ticket.vshn.net/browse/AMZE-329 is figured out +##- apiVersion: v1 +## kind: Route +## metadata: +## creationTimestamp: null +## labels: +## app: ${NAME} +## name: ${NAME} +## spec: +## host: kibana.amazeeio.cloud +## port: +## targetPort: http +## to: +## kind: Service +## name: ${SHORT_NAME} diff --git a/services/rest2tasks/Dockerfile b/services/rest2tasks/Dockerfile new file mode 100644 index 000000000..3106d9e61 --- /dev/null +++ b/services/rest2tasks/Dockerfile @@ -0,0 +1,22 @@ +FROM amazeeio/centos7-node-builder:6 as builder +ENV NODE_ENV production +COPY package.json yarn.lock /app/ +RUN BUILD_ONLY=true yarn install --pure-lockfile && yarn cache clean + +FROM amazeeio/centos7-node:6 +ENV NODE_ENV production +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +ARG AMAZEEIO_GIT_BRANCH=undefined +ENV RABBITMQ_HOST "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@${AMAZEEIO_GIT_BRANCH}-rabbitmq" + +ENV AMAZEEIO_API_HOST "http://${AMAZEEIO_GIT_BRANCH}-api:8080" + +RUN yarn run build + +RUN fix-permissions /app/ + +CMD ["yarn", "start"] + +EXPOSE 3000 \ No newline at end of file diff --git a/services/rest2tasks/Jenkinsfile b/services/rest2tasks/Jenkinsfile new file mode 100644 index 000000000..cdf2e0002 --- /dev/null +++ b/services/rest2tasks/Jenkinsfile @@ -0,0 +1,132 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-').replaceAll('/','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.SITEGROUP = "rest2tasks" + env.NAME = "${env.SITEGROUP}-${env.BRANCH}" + + // Openshift does not really like names longer then 24 chars or ending in a hyphen. + // This strips that, but also makes sure that if the string is already less then 24 + // characters, Java is not confused. + // See: http://stackoverflow.com/questions/953527/java-substring-string-index-out-of-range + env.SHORT_NAME = "${env.SITEGROUP}-${env.BRANCH}" + if (env.SHORT_NAME.length() > 24) { + env.SHORT_NAME = env.SHORT_NAME.substring(0, 24).replaceFirst(/[^a-z0-9]+$/, ''); + } + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + env.RABBITMQ_HOST = "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@rabbitmq-${env.TARGET_BRANCH}" + + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + env.OPENSHIFT_REGISTRY = "registry.appuio.ch" + env.OPENSHIFT_CONSOLE = "https://console.appuio.ch" + env.OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.OPENSHIFT_APP_YAML = "development.app.yml" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.SITEGROUP}/detail" + + if (env.BRANCH == 'master') { + env.OPENSHIFT_APP_YAML = "production.app.yml" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh """docker run --rm -v $WORKSPACE/.openshift:/tmp -e OPENSHIFT_CONSOLE=${env.OPENSHIFT_CONSOLE} -e OPENSHIFT_TOKEN=${env.OPENSHIFT_TOKEN} amazeeio/oc sh -c 'oc process \ + -n ${env.OPENSHIFT_PROJECT} \ + -f /tmp/${env.OPENSHIFT_APP_YAML} \ + -v TAG=${env.BRANCH} \ + -v NAME=${env.NAME} \ + -v SHORT_NAME=${env.SHORT_NAME} \ + -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} \ + -v SITEGROUP=${env.SITEGROUP} \ + -v RABBITMQ_HOST=${env.RABBITMQ_HOST} \ + | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'""" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.SITEGROUP}-registry") { + try { + sh "docker tag ${env.IMAGE} ${env.OPENSHIFT_REGISTRY}/${env.OPENSHIFT_PROJECT}/${env.SITEGROUP}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.docker docker login -u=jenkins -p='${env.OPENSHIFT_TOKEN}' ${env.OPENSHIFT_REGISTRY}" + sh "DOCKER_CONFIG=$WORKSPACE/.docker docker push ${env.OPENSHIFT_REGISTRY}/${env.OPENSHIFT_PROJECT}/${env.SITEGROUP}:${env.BRANCH}" + } catch (e) { + error(e, 'tag and push image') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: "${env.OPENSHIFT_CONSOLE}", authToken: env.OPENSHIFT_TOKEN, depCfg: "${env.NAME}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.SITEGROUP}/${env.BRANCH_NAME}] >${url}|Build #${env.BUILD_NUMBER}> failed* \\nStep: ${step} " + sendslack('danger', message) + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.SITEGROUP}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \\n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.SITEGROUP}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} \ No newline at end of file diff --git a/services/rest2tasks/README.md b/services/rest2tasks/README.md new file mode 100755 index 000000000..6e6d54567 --- /dev/null +++ b/services/rest2tasks/README.md @@ -0,0 +1 @@ +# rest2tasks \ No newline at end of file diff --git a/services/rest2tasks/package.json b/services/rest2tasks/package.json new file mode 100755 index 000000000..346c2fec0 --- /dev/null +++ b/services/rest2tasks/package.json @@ -0,0 +1,35 @@ +{ + "name": "react-isomorphic-form-demo", + "version": "1.0.0", + "description": "Demo app for react-isomorphic-form", + "main": "index.js", + "scripts": { + "start": "node build/index.js", + "build": "babel src -d build", + "dev": "nodemon src/index.js --exec babel-node" + }, + "author": "Gert Hengeveld (https://github.com/ghengeveld)", + "license": "ISC", + "dependencies": { + "@amazeeio/amazeeio-local-logging": "^0.1.3", + "@amazeeio/amazeeio-logs": "^0.1.11", + "@amazeeio/amazeeio-tasks": "^1.0.1", + "babel-cli": "^6.18.0", + "babel-core": "^6.21.0", + "babel-plugin-syntax-async-functions": "^6.13.0", + "babel-plugin-transform-flow-strip-types": "^6.21.0", + "babel-plugin-transform-object-rest-spread": "^6.20.2", + "babel-plugin-transform-regenerator": "^6.21.0", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.18.0", + "body-parser": "^1.17.2", + "cors": "^2.8.3", + "express": "^4.15.3", + "express-validator": "^3.2.0", + "nodemon": "^1.11.0" + }, + "devDependencies": { + "flow-bin": "^0.37.4", + "jest": "^18.1.0" + } +} diff --git a/services/rest2tasks/src/index.js b/services/rest2tasks/src/index.js new file mode 100755 index 000000000..7d2a8dc4c --- /dev/null +++ b/services/rest2tasks/src/index.js @@ -0,0 +1,147 @@ +// @flow + +require("babel-polyfill"); + +import bodyParser from 'body-parser' +import expressValidator from 'express-validator' +import express from 'express' +import cors from 'cors' +import util from 'util' + +import { createDeployTask, createRemoveTask, initSendToAmazeeioTasks } from '@amazeeio/amazeeio-tasks'; +import { logger, initLogger } from '@amazeeio/amazeeio-local-logging'; + +initLogger(); +initSendToAmazeeioTasks(); + +const app = express() +const server = app.listen(process.env.PORT || 3000, () => { + console.log(`Listening on port ${server.address().port}`) // eslint-disable-line no-console +}) + +app.use(cors()) +app.use(bodyParser.json()) +app.use(bodyParser.urlencoded({ extended: true })) +app.use(expressValidator()); + +app.get('/', (req, res) => { + return res.status(200).send('welcome to rest2tasks') +}) + +app.post('/deploy', async (req, res) => { + + req.checkBody({ + 'siteGroupName': { + notEmpty: true, + matches: { + options: [/^[a-zA-Z0-9-_]+$/], + errorMessage: 'siteGroupName must be defined and must only contain alphanumeric, dashes and underline' + }, + }, + 'branchName': { + notEmpty: true, + matches: { + options: [/^[a-zA-Z0-9-_\/]+$/], + errorMessage: 'branchName must be defined and must only contain alphanumeric, dashes, underline and slashes' + }, + }, + 'sha': { // + optional: { + options: { checkFalsy: true } // or: [{ checkFalsy: true }] + }, + isLength: { + options: [{ min: 40, max: 40 }], + errorMessage: 'Must be 40 chars long' // Error message for the validator, takes precedent over parameter message + }, + matches: { + options: [/^[a-f0-9]+$/], + errorMessage: 'sha needs to be a valid GIT SHA1' + } + } + }); + + const result = await req.getValidationResult() + + if (!result.isEmpty()) { + res.status(400).send('There have been validation errors: ' + util.inspect(result.mapped())); + return; + } + + const data = { + siteGroupName: req.body.siteGroupName, + branchName: req.body.branchName, + sha: req.body.sha + } + + try { + const taskResult = await createDeployTask(data); + res.status(200).type('json').send({ "ok": "true", "message": taskResult}) + return; + } catch (error) { + switch (error.name) { + case "SiteGroupNotFound": + case "ActiveSystemsNotFound": + res.status(404).type('json').send({ "ok": "false", "message": error.message}) + return; + break; + + default: + res.status(500).type('json').send({ "ok": "false", "message": `Internal Error: ${error}`}) + return; + break; + } + } + +}) + +app.post('/remove', async (req, res) => { + + req.checkBody({ + 'siteGroupName': { + notEmpty: true, + matches: { + options: [/^[a-zA-Z0-9-_]+$/], + errorMessage: 'siteGroupName must be defined and must only contain alphanumeric, dashes and underline' + }, + }, + 'openshiftRessourceAppName': { + notEmpty: true, + matches: { + options: [/^[a-zA-Z0-9-]+$/], + errorMessage: 'openshiftRessourceAppName must be defined and must only contain alphanumeric and dashes' + }, + } + }); + + const result = await req.getValidationResult() + + if (!result.isEmpty()) { + res.status(400).send('There have been validation errors: ' + util.inspect(result.mapped())); + return; + } + + const data = { + siteGroupName: req.body.siteGroupName, + openshiftRessourceAppName: req.body.openshiftRessourceAppName + } + + try { + const taskResult = await createRemoveTask(data); + res.status(200).type('json').send({ "ok": "true", "message": taskResult}) + return; + } catch (error) { + switch (error.name) { + case "SiteGroupNotFound": + case "ActiveSystemsNotFound": + res.status(404).type('json').send({ "ok": "false", "message": error.message}) + return; + break; + + default: + res.status(500).type('json').send({ "ok": "false", "message": `Internal Error: ${error}`}) + return; + break; + } + } + +}) diff --git a/services/rest2tasks/yarn.lock b/services/rest2tasks/yarn.lock new file mode 100644 index 000000000..6c2d62845 --- /dev/null +++ b/services/rest2tasks/yarn.lock @@ -0,0 +1,3452 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@amazeeio/amazeeio-api@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-api/-/amazeeio-api-1.0.0.tgz#131ea0fe005457495c2b744a10d493e4b0a66843" + dependencies: + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + lokka "^1.7.0" + lokka-transport-http "^1.6.1" + winston "^2.2.0" + +"@amazeeio/amazeeio-local-logging@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-local-logging/-/amazeeio-local-logging-0.1.3.tgz#a7b83f4c95e3723ff5baafa01a2c376b9054410c" + dependencies: + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +"@amazeeio/amazeeio-logs@^0.1.11": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-logs/-/amazeeio-logs-0.1.11.tgz#36ff8db6e9f1f83f65ad1906f338b4363d43d854" + dependencies: + amqp-connection-manager "^1.3.5" + amqplib "^0.5.1" + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +"@amazeeio/amazeeio-tasks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-tasks/-/amazeeio-tasks-1.0.1.tgz#38939c9ee38483c181d150af617032615a2f43bd" + dependencies: + "@amazeeio/amazeeio-api" "^1.0.0" + "@amazeeio/amazeeio-local-logging" "^0.1.3" + amqp-connection-manager "^1.3.5" + amqplib "^0.5.1" + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + +"@types/bluebird@~3.0.36": + version "3.0.37" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.0.37.tgz#2e76b394aa9bea40d04241a31c0887a260283388" + +"@types/express-serve-static-core@*": + version "4.0.46" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.46.tgz#52040d5e37da132296e333be79e3befa1b02b34a" + dependencies: + "@types/node" "*" + +"@types/express@~4.0.34": + version "4.0.35" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.35.tgz#6267c7b60a51fac473467b3c4a02cd1e441805fe" + dependencies: + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + +"@types/mime@*": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" + +"@types/node@*": + version "7.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.31.tgz#80ea4d175599b2a00149c29a10a4eb2dff592e86" + +"@types/serve-static@*": + version "1.7.31" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.31.tgz#15456de8d98d6b4cff31be6c6af7492ae63f521a" + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn@^4.0.4: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +amqp-connection-manager@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/amqp-connection-manager/-/amqp-connection-manager-1.3.5.tgz#4b4725fe96485ca0ad2aca8790e6d38800776449" + dependencies: + es6-promise "^3.0.2" + lodash "^4.15.0" + promise-breaker "^3.0.0" + when "^3.7.3" + +amqplib@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.1.tgz#7cccfebabe56c2e984ea7a2243f7cefe6fbfc6cf" + dependencies: + bitsyntax "~0.0.4" + bluebird "^3.4.6" + buffer-more-ints "0.0.2" + readable-stream "1.x >=1.1.9" + +ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.4.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" + dependencies: + lodash "^4.14.0" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-cli@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" + dependencies: + babel-core "^6.24.1" + babel-polyfill "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.0.0, babel-core@^6.21.0, babel-core@^6.24.1: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.25.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.25.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.18.0, babel-generator@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^3.0.0" + babel-preset-jest "^18.0.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz#11d5abde18425ec24b5d648c7e0b5d25cd354a22" + dependencies: + find-up "^1.1.2" + istanbul-lib-instrument "^1.4.2" + object-assign "^4.1.0" + test-exclude "^3.3.0" + +babel-plugin-jest-hoist@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" + +babel-plugin-syntax-async-functions@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-flow-strip-types@^6.21.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.20.2: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.21.0, babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" + dependencies: + babel-plugin-jest-hoist "^18.0.0" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@6.x.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + lodash "^4.2.0" + +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + babylon "^6.17.2" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.13.0, babylon@^6.17.2: + version "6.17.3" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.3.tgz#1327d709950b558f204e5352587fd0290f8d8e48" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +bitsyntax@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82" + dependencies: + buffer-more-ints "0.0.2" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.4.0, bluebird@^3.4.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +body-parser@^1.17.2: + version "1.17.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.7" + depd "~1.1.0" + http-errors "~1.6.1" + iconv-lite "0.4.15" + on-finished "~2.3.0" + qs "6.4.0" + raw-body "~2.2.0" + type-is "~1.6.15" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +buffer-more-ints@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.4.3, chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" + dependencies: + marked "^0.3.6" + marked-terminal "^1.6.2" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@1.0.3, colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cors@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.3.tgz#4cf78e1d23329a7496b2fc2225b77ca5bb5eb802" + dependencies: + object-assign "^4" + vary "^1" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@2.6.7, debug@^2.1.1, debug@^2.2.0, debug@^2.6.3: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express-validator@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-3.2.0.tgz#9537abeb0f66e439f9e30b4ed16c4c6c231318e2" + dependencies: + "@types/bluebird" "~3.0.36" + "@types/express" "~4.0.34" + bluebird "^3.4.0" + lodash "^4.16.0" + validator "~6.2.0" + +express@^4.15.3: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.7" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.4" + qs "6.4.0" + range-parser "~1.2.0" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^1.8.0, fb-watchman@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" + dependencies: + bser "1.0.2" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-up@^1.0.0, find-up@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flow-bin@^0.37.4: + version "0.37.4" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.37.4.tgz#3d8da2ef746e80e730d166e09040f4198969b76b" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +got@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" + dependencies: + duplexify "^3.2.0" + infinity-agent "^2.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + nested-error-stacks "^1.0.0" + object-assign "^3.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.3: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@0.4.15, iconv-lite@~0.4.13: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +infinity-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ipaddr.js@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-stream@^1.0.0, is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.0-alpha.1: + version "1.1.9" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-hook "^1.0.7" + istanbul-lib-instrument "^1.7.2" + istanbul-lib-report "^1.1.1" + istanbul-lib-source-maps "^1.2.1" + istanbul-reports "^1.1.1" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + +istanbul-lib-hook@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.1.1" + semver "^5.3.0" + +istanbul-lib-report@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" + dependencies: + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" + dependencies: + debug "^2.6.3" + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" + +jest-cli@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^17.0.2" + jest-config "^18.1.0" + jest-environment-jsdom "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-resolve-dependencies "^18.1.0" + jest-runtime "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + node-notifier "^4.6.1" + sane "~1.4.1" + strip-ansi "^3.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^18.1.0" + jest-environment-node "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" + +jest-environment-jsdom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + jsdom "^9.9.1" + +jest-environment-node@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-haste-map@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.4.1" + worker-farm "^1.3.1" + +jest-jasmine2@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^18.1.0" + jest-matchers "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" + dependencies: + chalk "^1.1.3" + pretty-format "^18.1.0" + +jest-matchers@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" + dependencies: + jest-diff "^18.1.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + pretty-format "^18.1.0" + +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" + +jest-resolve-dependencies@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" + dependencies: + jest-file-exists "^17.0.0" + jest-resolve "^18.1.0" + +jest-resolve@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" + dependencies: + browser-resolve "^1.11.2" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + resolve "^1.2.0" + +jest-runtime@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" + dependencies: + babel-core "^6.0.0" + babel-jest "^18.0.0" + babel-plugin-istanbul "^3.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + micromatch "^2.3.11" + yargs "^6.3.0" + +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" + dependencies: + jest-diff "^18.1.0" + jest-file-exists "^17.0.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + natural-compare "^1.4.0" + pretty-format "^18.1.0" + +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^18.0.0" + mkdirp "^0.5.1" + +jest@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" + dependencies: + jest-cli "^18.1.0" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@^3.7.0: + version "3.8.4" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^9.9.1: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +latest-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" + dependencies: + package-json "^1.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.0, lodash@^4.2.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lokka-transport-http@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/lokka-transport-http/-/lokka-transport-http-1.6.1.tgz#0dfbc2dc9e825f6e5821830f3f3f7f3f83a4ad65" + dependencies: + babel-runtime "6.x.x" + node-fetch "^1.5.2" + whatwg-fetch "^1.0.0" + +lokka@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/lokka/-/lokka-1.7.0.tgz#ab2e8334612d2afd359aa89047547bd7de21046c" + dependencies: + babel-runtime "6.x.x" + uuid "2.x.x" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" + dependencies: + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" + +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +nan@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +nested-error-stacks@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +node-emoji@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" + dependencies: + string.prototype.codepointat "^0.2.0" + +node-fetch@^1.5.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" + dependencies: + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" + +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nodemon@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" + dependencies: + chokidar "^1.4.3" + debug "^2.2.0" + es6-promise "^3.0.2" + ignore-by-default "^1.0.0" + lodash.defaults "^3.1.2" + minimatch "^3.0.0" + ps-tree "^1.0.1" + touch "1.0.0" + undefsafe "0.0.3" + update-notifier "0.5.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npmlog@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.0.tgz#b4389362170e7ef9798c3c7716d80ebc0106fccf" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + dependencies: + got "^3.2.0" + registry-url "^3.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" + +private@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +promise-breaker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-3.0.0.tgz#bed499d1a9c35944950462baf47246fc11f19d9f" + +proxy-addr@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.3.0" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +ps-tree@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@6.4.0, qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1.x >=1.1.9": + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.2.11" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.0.1" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-url@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.79.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.2.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +safe-buffer@^5.0.1, safe-buffer@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.3" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" + dependencies: + source-map "^0.5.6" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string.prototype.codepointat@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a533737b7491e179" + dependencies: + safe-buffer "~5.0.1" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +throat@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +touch@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +uglify-js@^2.6: + version "2.8.28" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.28.tgz#e335032df9bb20dcb918f164589d5af47f38834a" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +update-notifier@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" + dependencies: + chalk "^1.0.0" + configstore "^1.0.0" + is-npm "^1.0.0" + latest-version "^1.0.0" + repeating "^1.1.2" + semver-diff "^2.0.0" + string-length "^1.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@2.x.x, uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.10: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +validator@~6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/validator/-/validator-6.2.1.tgz#bc575b78d15beb2e338a665ba9530c7f409ef667" + +vary@^1, vary@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-fetch@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319" + +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +when@^3.7.3: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.0.5, which@^1.1.1: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +"xtend@>=4.0.0 <4.1.0-0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs@^6.3.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/services/webhook-handler/.babelrc b/services/webhook-handler/.babelrc new file mode 100644 index 000000000..bb092de4b --- /dev/null +++ b/services/webhook-handler/.babelrc @@ -0,0 +1,9 @@ +{ + "presets": ["es2015"], + "plugins": [ + "transform-flow-strip-types", + "transform-regenerator", + "syntax-async-functions", + "transform-object-rest-spread" + ] +} diff --git a/services/webhook-handler/.dockerignore b/services/webhook-handler/.dockerignore new file mode 100644 index 000000000..06ef0ae48 --- /dev/null +++ b/services/webhook-handler/.dockerignore @@ -0,0 +1,5 @@ +.openshift/* +.cache/* +node_modules/* +Jenkinsfile +.dockerignore \ No newline at end of file diff --git a/services/webhook-handler/.flowconfig b/services/webhook-handler/.flowconfig new file mode 100644 index 000000000..4a58bdcde --- /dev/null +++ b/services/webhook-handler/.flowconfig @@ -0,0 +1,7 @@ +[ignore] + +[include] + +[libs] + +[options] diff --git a/services/webhook-handler/.gitignore b/services/webhook-handler/.gitignore new file mode 100644 index 000000000..dd87e2d73 --- /dev/null +++ b/services/webhook-handler/.gitignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/webhook-handler/.openshift/.kubeconfig b/services/webhook-handler/.openshift/.kubeconfig new file mode 100644 index 000000000..a79c97f77 --- /dev/null +++ b/services/webhook-handler/.openshift/.kubeconfig @@ -0,0 +1,17 @@ +apiVersion: v1 +clusters: +- cluster: + server: https://console.appuio.ch:443 + name: appuio +contexts: +- context: + cluster: appuio + user: system:serviceaccount:amze-amazeeio:jenkins + name: appuio:amze-amazeeio:jenkins +current-context: appuio:amze-amazeeio:jenkins +kind: Config +preferences: {} +users: +- name: system:serviceaccount:amze-amazeeio:jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg diff --git a/services/webhook-handler/.openshift/README.md b/services/webhook-handler/.openshift/README.md new file mode 100644 index 000000000..6a67200e6 --- /dev/null +++ b/services/webhook-handler/.openshift/README.md @@ -0,0 +1,53 @@ +# OpenShift + +## Jenkins Access to Openshift + +In order for Jenkins to deploy to openshift we need to create an openshift serviceaccount that has access to our project (regular username/password logins expire after a couple of hours, not very good for a CI/CD system) + +1. Login as your user + + oc login + +2. Create new serviceaccount with the name jenkins + + oc create serviceaccount jenkins + +3. Give this serviceaccount edit access (see the name of the serviceaccount contains the project name!) + + oc policy add-role-to-user edit system:serviceaccount:appuio-demo2:jenkins2 + +4. Get access token from serviceaccount, with first getting the name of the token and then accessing the secret + + oc describe serviceaccount jenkins2 + + oc describe secret jenkins2-token-7tawv + +5. Add the token inside the .kubeconfig: + + + apiVersion: v1 + clusters: + - cluster: + server: https://console.appuio.ch:443 + name: appuio + contexts: + - context: + cluster: appuio + user: jenkins + name: appuio:jenkins + current-context: appuio:jenkins + kind: Config + preferences: {} + users: + - name: jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLXJhcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJqZW5raW5zLXRva2VuLTFocW42Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImplbmtpbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZmM4ZTIzMi05ZDBhLTExZTYtYTdlZi1mYTE2M2VkOTVkYWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YW16ZS1yYXM6amVua2lucyJ9.BAeU6zXl0uPCD2DRGJeV1oxRbk3sA3M5tn7K6xPh5iv-etS8Q2lsF-OFwO7HVycvEckXh31KNUmQTzvn3keSDT0a8BqViBhGPKCfAw-vf3ElUnGFDCWN9IpITKJBWIxVdGyd5sPltBWkAVxl9JOwnu1vrBvSioYqwjzYkjStbfp7pzLXhSld9G4AXA_zBntDW633mujllT0z_5IMSJX_gKSZcrTN78KLdCMmuvIT_m7xZMp_r52daEu67DjsjYtVqVx4BsDVPdUZRQ9eJtodbtZ-FJV9w0W4H9nX3iyqCk7OriD4Xt68Z5cUK0tR-4hyyh_hL31c6vzGb_VosmAWWg + + +6. Test the kubeconfig - should return `system:serviceaccount:appuio-demo2:jenkins2` + + KUBECONFIG=.openshift/.kubeconfig oc whoami + +7. Create a Docker authentication config.json so Jenkins can push into the Openshift docker Registry + + DOCKER_CONFIG=.openshift/ docker login -u jenkins2 -p $(KUBECONFIG=.openshift/.kubeconfig oc whoami -t) registry.appuio.ch \ No newline at end of file diff --git a/services/webhook-handler/.openshift/config.json b/services/webhook-handler/.openshift/config.json new file mode 100644 index 000000000..a526a5d46 --- /dev/null +++ b/services/webhook-handler/.openshift/config.json @@ -0,0 +1,7 @@ +{ + "auths": { + "registry.appuio.ch": { + "auth": "amVua2luczI6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoYlhwbExXRnRZWHBsWldsdklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltcGxibXRwYm5NdGRHOXJaVzR0TjJGcU5tOGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lhbVZ1YTJsdWN5SXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqRmlOelZoWXpkakxXTTJOV010TVRGbE5pMWlOelUxTFdaaE1UWXpaVE5sWXpjellTSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBoYlhwbExXRnRZWHBsWldsdk9tcGxibXRwYm5NaWZRLkRUSlpDd3BFWFlnenlaSmtDZHF6a0dHc0hWQWhNc0J0OGFtcmkydGZQYl9mOTZrZWxHOWFnVXBudzdZRmcweWkybEdGcjhTU1lMOEd2dXhuNHcwMXZXdHNMc2JhMjg5cFJNOUhiXzFJU2F0U1NWNTM5TXdQR2dpN2ZVN3F6Yk00ZzJpVmIxaW1sQkhJbW9tSkNXVzJDSW41aEF5VUR4Snd5OVh2Y0hyajZUYjE0X0c2YnVLT3JpR0JaejZ4Qmk5WWpOanh5eTlZem5WOVhkU1Z4THNXQjdFaG5yUnhveElFaWVPV0RaUHF1am9tSUFYczZ0TzdhcGFnNE1kZFl6LTVYdTg2Vm15SjZkS05KZUt2RUh0V1hUM081SUVqMEhmdlZGSnlKRTFKR3BfLVhnTzg4Ujh0WF9yOWYySU9PLXpyMU9OODVubUpjTDlGTGRLaFE4Z3dRZw==" + } + } +} \ No newline at end of file diff --git a/services/webhook-handler/.openshift/development.app.yml b/services/webhook-handler/.openshift/development.app.yml new file mode 100644 index 000000000..bea68bd0d --- /dev/null +++ b/services/webhook-handler/.openshift/development.app.yml @@ -0,0 +1,108 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: ${AMAZEEIO_SERVICE}-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: RABBITMQ_HOST + description: Hostname of the RabbitMQ Server to connect to + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: NODE_ENV + value: production + ports: + - containerPort: 7777 + protocol: TCP + readinessProbe: + tcpSocket: + port: 7777 + initialDelaySeconds: 3 + timeoutSeconds: 1 + resources: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 200m + memory: 200Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + ports: + - name: 7777-tcp + port: 80 + protocol: TCP + targetPort: 7777 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +- apiVersion: v1 + kind: Route + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + host: ${AMAZEEIO_SERVICE}-${BRANCH}.appuio.amazeeio.review + port: + targetPort: 7777-tcp + to: + kind: Service + name: ${AMAZEEIO_SERVICE}-${BRANCH} diff --git a/services/webhook-handler/.openshift/production.app.yml b/services/webhook-handler/.openshift/production.app.yml new file mode 100644 index 000000000..5d6529c5c --- /dev/null +++ b/services/webhook-handler/.openshift/production.app.yml @@ -0,0 +1,123 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: ${AMAZEEIO_SERVICE}-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: RABBITMQ_HOST + description: Hostname of the RabbitMQ Server to connect to + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: NODE_ENV + value: production + ports: + - containerPort: 7777 + protocol: TCP + readinessProbe: + tcpSocket: + port: 7777 + initialDelaySeconds: 3 + timeoutSeconds: 1 + resources: + limits: + cpu: 250m + memory: 250Mi + requests: + cpu: 250m + memory: 250Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} +- apiVersion: v1 + kind: Service + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + ports: + - name: 7777-tcp + port: 80 + protocol: TCP + targetPort: 7777 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + status: + loadBalancer: {} +## ## No route for production right now, until https://ticket.vshn.net/browse/AMZE-329 is figured out +##- apiVersion: v1 +## kind: Route +## metadata: +## creationTimestamp: null +## labels: +## app: ${AMAZEEIO_SERVICE}-${BRANCH} +## name: ${AMAZEEIO_SERVICE}-${BRANCH}-io +## spec: +## host: hooks.amazeeio.cloud +## port: +## targetPort: 7777-tcp +## to: +## kind: Service +## name: ${AMAZEEIO_SERVICE}-${BRANCH} +##- apiVersion: v1 +## kind: Route +## metadata: +## creationTimestamp: null +## labels: +## app: ${AMAZEEIO_SERVICE}-${BRANCH} +## name: ${AMAZEEIO_SERVICE}-${BRANCH}-cloud +## spec: +## host: hooks.amazee.io +## port: +## targetPort: 7777-tcp +## to: +## kind: Service +## name: ${AMAZEEIO_SERVICE}-${BRANCH} diff --git a/services/webhook-handler/.vscode/settings.json b/services/webhook-handler/.vscode/settings.json new file mode 100644 index 000000000..4f2bf5f8a --- /dev/null +++ b/services/webhook-handler/.vscode/settings.json @@ -0,0 +1,4 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "javascript.validate.enable": false +} \ No newline at end of file diff --git a/services/webhook-handler/Dockerfile b/services/webhook-handler/Dockerfile new file mode 100644 index 000000000..ce6d8a7a8 --- /dev/null +++ b/services/webhook-handler/Dockerfile @@ -0,0 +1,20 @@ +FROM amazeeio/centos7-node-builder:6 as builder +ENV NODE_ENV production +COPY package.json yarn.lock /app/ +RUN BUILD_ONLY=true yarn install --pure-lockfile && yarn cache clean + +FROM amazeeio/centos7-node:6 +ENV NODE_ENV production +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +ARG AMAZEEIO_GIT_BRANCH=undefined +ENV RABBITMQ_HOST "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@${AMAZEEIO_GIT_BRANCH}-rabbitmq" + +RUN yarn run build + +RUN fix-permissions /app/ + +CMD ["yarn", "start"] + +EXPOSE 3000 \ No newline at end of file diff --git a/services/webhook-handler/Jenkinsfile b/services/webhook-handler/Jenkinsfile new file mode 100644 index 000000000..114954bea --- /dev/null +++ b/services/webhook-handler/Jenkinsfile @@ -0,0 +1,150 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.OPENSHIFT_APP_YAML = "development.app.yml" + env.AMAZEEIO_SERVICE = "webhook-handler" + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.AMAZEEIO_SERVICE}/detail" + + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + if (env.BRANCH == 'master') { + env.OPENSHIFT_APP_YAML = "production.app.yml" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + env.RABBITMQ_HOST = "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@rabbitmq-${env.TARGET_BRANCH}" + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + stage ('tests') { + // Running Tests in parallel, for faster completion + parallel ( + //test_unit: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-unit" + // } catch (e) { + // error(e, 'unit test') + // } + //}, + // test_http: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-http-ssr" + // } catch (e) { + // error(e, 'http test') + // } + // }, + //test_lint: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-lint" + // } catch (e) { + // error(e, 'lint') + // } + //} + ) + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh "docker run --rm -v $WORKSPACE/.openshift:/tmp -w /tmp/ -e KUBECONFIG=.kubeconfig michelesr/oc sh -c 'oc process -n ${env.OPENSHIFT_PROJECT} -f ${env.OPENSHIFT_APP_YAML} -v BRANCH=${env.BRANCH} -v RABBITMQ_HOST=${env.RABBITMQ_HOST} -v AMAZEEIO_SERVICE=${env.AMAZEEIO_SERVICE} -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.AMAZEEIO_SERVICE}-registry") { + try { + sh "docker tag ${env.IMAGE} registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.openshift docker push registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + } catch (e) { + error(e, 'docker tag and push') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: 'https://console.appuio.ch:443', authToken: OPENSHIFT_TOKEN, depCfg: "${env.AMAZEEIO_SERVICE}-${env.BRANCH}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + + stage ('cleanup Docker Images') { + cleanupImage() + } + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> failed* \nStep: ${step} " + sendslack('danger', message) + cleanupImage() + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} + +def cleanupImage() { + try { + sh "docker rmi -f ${env.IMAGE}" + } catch (e) { + echo "Removal of Docker image '${env.IMAGE}' failed, ignoring this." + } +} diff --git a/services/webhook-handler/LICENSE.md b/services/webhook-handler/LICENSE.md new file mode 100644 index 000000000..79b52093e --- /dev/null +++ b/services/webhook-handler/LICENSE.md @@ -0,0 +1,11 @@ +The MIT License (MIT) +===================== + +Copyright (c) 2014 Rod Vagg +--------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/services/webhook-handler/README.md b/services/webhook-handler/README.md new file mode 100644 index 000000000..56424a749 --- /dev/null +++ b/services/webhook-handler/README.md @@ -0,0 +1,38 @@ +# amazeeio-webhook-handler + +This webhook handler is part of the amazee.io lagoon deployment system and is responsible for receiving webhooks from github, bitbucket, gitlab or any other system, parse them and add them in a unified format (as each of the different git hosters have different webhook formats) to a rabbitmq queue. For each webhook the following information are extracted: + +- `webhooktype` (`github`, `gitlab`, etc.) +- `event` (event type, like `push` `pull_request`, specific for each webhook type) +- `giturl` (URL of the git repo) +- `body` (full body of webhook payload) + +It uses https://github.com/benbria/node-amqp-connection-manager for connecting to rabbitmq, so it can handle situations were rabbitmq is not reachable and still receive webhooks, process them and keep them in memory. As soon as rabbitmq is rechable again, it will send the messages there. + +Logs each received webhook to the amazeeio-logs queue. + +## Hosting + +Fully developed in Docker and hosted on amazee.io Openshift, see the `.openshift` folder. Deployed via Jenkinsfile. + +Uses `amazeeio/centos7-node:node6` as base image. + +## Development + +Can be used with a local nodejs and connect to a rabbitmq of your choice. + + yarn install + RABBITMQ_HOST=guest:guest@rabbitmqhost yarn run start + +Or via the existing docker-compose.yml + + docker-compose up -d + +## Testdata + +There is testdata available from Postman. In order to use it, download [Postman](https://www.getpostman.com/) and import the `amazeeio-webhook-handler.postman_collection.json` as collection, plus the `localhost.postman_environment.json` as environment. +Now you can send single requests to the webhook handler. + +You can also run all tests from the CLI via newman + + yarn run newman-runall diff --git a/services/webhook-handler/docker-compose.yaml b/services/webhook-handler/docker-compose.yaml new file mode 100644 index 000000000..ad4cf7d41 --- /dev/null +++ b/services/webhook-handler/docker-compose.yaml @@ -0,0 +1,23 @@ +version: '2' +services: + rabbitmq: + image: rabbitmq + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + ports: + - "15672:15672" + - "5672:5672" + webhooks: + build: . + command: yarn run dev + ports: + - "3000:3000" + user: "11111112" + links: + - rabbitmq:3-management + environment: + - RABBITMQ_HOST=rabbitmq + volumes: + - ./src:/app/src + - ./package.json:/app/package.json diff --git a/services/webhook-handler/flow-typed/npm/amqp-connection-manager_vx.x.x.js b/services/webhook-handler/flow-typed/npm/amqp-connection-manager_vx.x.x.js new file mode 100644 index 000000000..0157a3e0b --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/amqp-connection-manager_vx.x.x.js @@ -0,0 +1,53 @@ +// flow-typed signature: 3ddc7df9039bdc85876cd47fd95c3a7c +// flow-typed version: <>/amqp-connection-manager_v^1.3.5/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'amqp-connection-manager' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'amqp-connection-manager' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'amqp-connection-manager/lib/AmqpConnectionManager' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/ChannelWrapper' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/helpers' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'amqp-connection-manager/lib/AmqpConnectionManager.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/AmqpConnectionManager'>; +} +declare module 'amqp-connection-manager/lib/ChannelWrapper.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/ChannelWrapper'>; +} +declare module 'amqp-connection-manager/lib/helpers.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/helpers'>; +} +declare module 'amqp-connection-manager/lib/index.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/index'>; +} diff --git a/services/webhook-handler/flow-typed/npm/amqplib_vx.x.x.js b/services/webhook-handler/flow-typed/npm/amqplib_vx.x.x.js new file mode 100644 index 000000000..45cf39175 --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/amqplib_vx.x.x.js @@ -0,0 +1,410 @@ +// flow-typed signature: 22527bc8d3379eac0db4cfac36bdc337 +// flow-typed version: <>/amqplib_vhttps://registry.npmjs.org/amqplib/-/amqplib-0.4.2.tgz/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'amqplib' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'amqplib' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'amqplib/callback_api' { + declare module.exports: any; +} + +declare module 'amqplib/channel_api' { + declare module.exports: any; +} + +declare module 'amqplib/examples/headers' { + declare module.exports: any; +} + +declare module 'amqplib/examples/ssl' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/new_task' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/rpc_client' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/rpc_server' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/send' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/worker' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/new_task' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/rpc_client' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/rpc_server' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/send' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/worker' { + declare module.exports: any; +} + +declare module 'amqplib/examples/waitForConfirms' { + declare module.exports: any; +} + +declare module 'amqplib/lib/api_args' { + declare module.exports: any; +} + +declare module 'amqplib/lib/bitset' { + declare module.exports: any; +} + +declare module 'amqplib/lib/callback_model' { + declare module.exports: any; +} + +declare module 'amqplib/lib/channel_model' { + declare module.exports: any; +} + +declare module 'amqplib/lib/channel' { + declare module.exports: any; +} + +declare module 'amqplib/lib/codec' { + declare module.exports: any; +} + +declare module 'amqplib/lib/connect' { + declare module.exports: any; +} + +declare module 'amqplib/lib/connection' { + declare module.exports: any; +} + +declare module 'amqplib/lib/credentials' { + declare module.exports: any; +} + +declare module 'amqplib/lib/defs' { + declare module.exports: any; +} + +declare module 'amqplib/lib/error' { + declare module.exports: any; +} + +declare module 'amqplib/lib/format' { + declare module.exports: any; +} + +declare module 'amqplib/lib/frame' { + declare module.exports: any; +} + +declare module 'amqplib/lib/heartbeat' { + declare module.exports: any; +} + +declare module 'amqplib/lib/mux' { + declare module.exports: any; +} + +declare module 'amqplib/test/bitset' { + declare module.exports: any; +} + +declare module 'amqplib/test/callback_api' { + declare module.exports: any; +} + +declare module 'amqplib/test/channel_api' { + declare module.exports: any; +} + +declare module 'amqplib/test/channel' { + declare module.exports: any; +} + +declare module 'amqplib/test/codec' { + declare module.exports: any; +} + +declare module 'amqplib/test/connect' { + declare module.exports: any; +} + +declare module 'amqplib/test/connection' { + declare module.exports: any; +} + +declare module 'amqplib/test/data' { + declare module.exports: any; +} + +declare module 'amqplib/test/frame' { + declare module.exports: any; +} + +declare module 'amqplib/test/mux' { + declare module.exports: any; +} + +declare module 'amqplib/test/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'amqplib/callback_api.js' { + declare module.exports: $Exports<'amqplib/callback_api'>; +} +declare module 'amqplib/channel_api.js' { + declare module.exports: $Exports<'amqplib/channel_api'>; +} +declare module 'amqplib/examples/headers.js' { + declare module.exports: $Exports<'amqplib/examples/headers'>; +} +declare module 'amqplib/examples/ssl.js' { + declare module.exports: $Exports<'amqplib/examples/ssl'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log_direct'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log_topic'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log'>; +} +declare module 'amqplib/examples/tutorials/callback_api/new_task.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/new_task'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs_direct'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs_topic'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive'>; +} +declare module 'amqplib/examples/tutorials/callback_api/rpc_client.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/rpc_client'>; +} +declare module 'amqplib/examples/tutorials/callback_api/rpc_server.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/rpc_server'>; +} +declare module 'amqplib/examples/tutorials/callback_api/send.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/send'>; +} +declare module 'amqplib/examples/tutorials/callback_api/worker.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/worker'>; +} +declare module 'amqplib/examples/tutorials/emit_log_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log_direct'>; +} +declare module 'amqplib/examples/tutorials/emit_log_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log_topic'>; +} +declare module 'amqplib/examples/tutorials/emit_log.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log'>; +} +declare module 'amqplib/examples/tutorials/new_task.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/new_task'>; +} +declare module 'amqplib/examples/tutorials/receive_logs_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs_direct'>; +} +declare module 'amqplib/examples/tutorials/receive_logs_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs_topic'>; +} +declare module 'amqplib/examples/tutorials/receive_logs.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs'>; +} +declare module 'amqplib/examples/tutorials/receive.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive'>; +} +declare module 'amqplib/examples/tutorials/rpc_client.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/rpc_client'>; +} +declare module 'amqplib/examples/tutorials/rpc_server.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/rpc_server'>; +} +declare module 'amqplib/examples/tutorials/send.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/send'>; +} +declare module 'amqplib/examples/tutorials/worker.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/worker'>; +} +declare module 'amqplib/examples/waitForConfirms.js' { + declare module.exports: $Exports<'amqplib/examples/waitForConfirms'>; +} +declare module 'amqplib/lib/api_args.js' { + declare module.exports: $Exports<'amqplib/lib/api_args'>; +} +declare module 'amqplib/lib/bitset.js' { + declare module.exports: $Exports<'amqplib/lib/bitset'>; +} +declare module 'amqplib/lib/callback_model.js' { + declare module.exports: $Exports<'amqplib/lib/callback_model'>; +} +declare module 'amqplib/lib/channel_model.js' { + declare module.exports: $Exports<'amqplib/lib/channel_model'>; +} +declare module 'amqplib/lib/channel.js' { + declare module.exports: $Exports<'amqplib/lib/channel'>; +} +declare module 'amqplib/lib/codec.js' { + declare module.exports: $Exports<'amqplib/lib/codec'>; +} +declare module 'amqplib/lib/connect.js' { + declare module.exports: $Exports<'amqplib/lib/connect'>; +} +declare module 'amqplib/lib/connection.js' { + declare module.exports: $Exports<'amqplib/lib/connection'>; +} +declare module 'amqplib/lib/credentials.js' { + declare module.exports: $Exports<'amqplib/lib/credentials'>; +} +declare module 'amqplib/lib/defs.js' { + declare module.exports: $Exports<'amqplib/lib/defs'>; +} +declare module 'amqplib/lib/error.js' { + declare module.exports: $Exports<'amqplib/lib/error'>; +} +declare module 'amqplib/lib/format.js' { + declare module.exports: $Exports<'amqplib/lib/format'>; +} +declare module 'amqplib/lib/frame.js' { + declare module.exports: $Exports<'amqplib/lib/frame'>; +} +declare module 'amqplib/lib/heartbeat.js' { + declare module.exports: $Exports<'amqplib/lib/heartbeat'>; +} +declare module 'amqplib/lib/mux.js' { + declare module.exports: $Exports<'amqplib/lib/mux'>; +} +declare module 'amqplib/test/bitset.js' { + declare module.exports: $Exports<'amqplib/test/bitset'>; +} +declare module 'amqplib/test/callback_api.js' { + declare module.exports: $Exports<'amqplib/test/callback_api'>; +} +declare module 'amqplib/test/channel_api.js' { + declare module.exports: $Exports<'amqplib/test/channel_api'>; +} +declare module 'amqplib/test/channel.js' { + declare module.exports: $Exports<'amqplib/test/channel'>; +} +declare module 'amqplib/test/codec.js' { + declare module.exports: $Exports<'amqplib/test/codec'>; +} +declare module 'amqplib/test/connect.js' { + declare module.exports: $Exports<'amqplib/test/connect'>; +} +declare module 'amqplib/test/connection.js' { + declare module.exports: $Exports<'amqplib/test/connection'>; +} +declare module 'amqplib/test/data.js' { + declare module.exports: $Exports<'amqplib/test/data'>; +} +declare module 'amqplib/test/frame.js' { + declare module.exports: $Exports<'amqplib/test/frame'>; +} +declare module 'amqplib/test/mux.js' { + declare module.exports: $Exports<'amqplib/test/mux'>; +} +declare module 'amqplib/test/util.js' { + declare module.exports: $Exports<'amqplib/test/util'>; +} diff --git a/services/webhook-handler/flow-typed/npm/babel-cli_vx.x.x.js b/services/webhook-handler/flow-typed/npm/babel-cli_vx.x.x.js new file mode 100644 index 000000000..90936acc2 --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/babel-cli_vx.x.x.js @@ -0,0 +1,108 @@ +// flow-typed signature: beb19de904b0159b454a839011b2f0f3 +// flow-typed version: <>/babel-cli_v^6.18.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-cli' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-cli' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-cli/bin/babel-doctor' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/_babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/dir' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/file' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/index' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-cli/bin/babel-doctor.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-doctor'>; +} +declare module 'babel-cli/bin/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-external-helpers'>; +} +declare module 'babel-cli/bin/babel-node.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-node'>; +} +declare module 'babel-cli/bin/babel.js' { + declare module.exports: $Exports<'babel-cli/bin/babel'>; +} +declare module 'babel-cli/index' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/index.js' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/lib/_babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/_babel-node'>; +} +declare module 'babel-cli/lib/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-external-helpers'>; +} +declare module 'babel-cli/lib/babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-node'>; +} +declare module 'babel-cli/lib/babel/dir.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/dir'>; +} +declare module 'babel-cli/lib/babel/file.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/file'>; +} +declare module 'babel-cli/lib/babel/index.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/index'>; +} +declare module 'babel-cli/lib/babel/util.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/util'>; +} diff --git a/services/webhook-handler/flow-typed/npm/babel-core_vx.x.x.js b/services/webhook-handler/flow-typed/npm/babel-core_vx.x.x.js new file mode 100644 index 000000000..fa0a81eac --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/babel-core_vx.x.x.js @@ -0,0 +1,192 @@ +// flow-typed signature: ac28d744323eadd55d2ad2588d34e2df +// flow-typed version: <>/babel-core_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-core' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-core' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-core/lib/api/browser' { + declare module.exports: any; +} + +declare module 'babel-core/lib/api/node' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/merge' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/normalize-ast' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/resolve' { + declare module.exports: any; +} + +declare module 'babel-core/lib/store' { + declare module.exports: any; +} + +declare module 'babel-core/lib/tools/build-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/index' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/logger' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/metadata' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/build-config-chain' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/config' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/index' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/option-manager' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/parsers' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/removed' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/internal-plugins/block-hoist' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/pipeline' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/plugin-pass' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/plugin' { + declare module.exports: any; +} + +declare module 'babel-core/lib/util' { + declare module.exports: any; +} + +declare module 'babel-core/register' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-core/index' { + declare module.exports: $Exports<'babel-core'>; +} +declare module 'babel-core/index.js' { + declare module.exports: $Exports<'babel-core'>; +} +declare module 'babel-core/lib/api/browser.js' { + declare module.exports: $Exports<'babel-core/lib/api/browser'>; +} +declare module 'babel-core/lib/api/node.js' { + declare module.exports: $Exports<'babel-core/lib/api/node'>; +} +declare module 'babel-core/lib/helpers/merge.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/merge'>; +} +declare module 'babel-core/lib/helpers/normalize-ast.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/normalize-ast'>; +} +declare module 'babel-core/lib/helpers/resolve.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/resolve'>; +} +declare module 'babel-core/lib/store.js' { + declare module.exports: $Exports<'babel-core/lib/store'>; +} +declare module 'babel-core/lib/tools/build-external-helpers.js' { + declare module.exports: $Exports<'babel-core/lib/tools/build-external-helpers'>; +} +declare module 'babel-core/lib/transformation/file/index.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/index'>; +} +declare module 'babel-core/lib/transformation/file/logger.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/logger'>; +} +declare module 'babel-core/lib/transformation/file/metadata.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/metadata'>; +} +declare module 'babel-core/lib/transformation/file/options/build-config-chain.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/build-config-chain'>; +} +declare module 'babel-core/lib/transformation/file/options/config.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/config'>; +} +declare module 'babel-core/lib/transformation/file/options/index.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/index'>; +} +declare module 'babel-core/lib/transformation/file/options/option-manager.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/option-manager'>; +} +declare module 'babel-core/lib/transformation/file/options/parsers.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/parsers'>; +} +declare module 'babel-core/lib/transformation/file/options/removed.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/removed'>; +} +declare module 'babel-core/lib/transformation/internal-plugins/block-hoist.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/block-hoist'>; +} +declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/shadow-functions'>; +} +declare module 'babel-core/lib/transformation/pipeline.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/pipeline'>; +} +declare module 'babel-core/lib/transformation/plugin-pass.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/plugin-pass'>; +} +declare module 'babel-core/lib/transformation/plugin.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/plugin'>; +} +declare module 'babel-core/lib/util.js' { + declare module.exports: $Exports<'babel-core/lib/util'>; +} +declare module 'babel-core/register.js' { + declare module.exports: $Exports<'babel-core/register'>; +} diff --git a/services/webhook-handler/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js b/services/webhook-handler/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js new file mode 100644 index 000000000..45456f9af --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 5a103fdda313008fdca7bebe21e57625 +// flow-typed version: <>/babel-plugin-syntax-async-functions_v^6.13.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-syntax-async-functions' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-syntax-async-functions' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-syntax-async-functions/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-syntax-async-functions/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-syntax-async-functions/lib/index'>; +} diff --git a/services/webhook-handler/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js b/services/webhook-handler/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js new file mode 100644 index 000000000..5b2ee307e --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 2338f781b6ad44daa64ebdfeb6dfa8a2 +// flow-typed version: <>/babel-plugin-transform-flow-strip-types_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-flow-strip-types' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-flow-strip-types' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-flow-strip-types/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-flow-strip-types/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-flow-strip-types/lib/index'>; +} diff --git a/services/webhook-handler/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js b/services/webhook-handler/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js new file mode 100644 index 000000000..2ae1ecfe5 --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 8858d79f83612f0bb3a574ae5ae9234d +// flow-typed version: <>/babel-plugin-transform-regenerator_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-regenerator' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-regenerator' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-regenerator/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-regenerator/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-regenerator/lib/index'>; +} diff --git a/services/webhook-handler/flow-typed/npm/babel-preset-es2015_vx.x.x.js b/services/webhook-handler/flow-typed/npm/babel-preset-es2015_vx.x.x.js new file mode 100644 index 000000000..91438db13 --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/babel-preset-es2015_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 26c4ebbcdba0a8e2ddf27f0591f5b220 +// flow-typed version: <>/babel-preset-es2015_v^6.18.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-es2015' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-es2015' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-es2015/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-es2015/lib/index.js' { + declare module.exports: $Exports<'babel-preset-es2015/lib/index'>; +} diff --git a/services/webhook-handler/flow-typed/npm/bl_vx.x.x.js b/services/webhook-handler/flow-typed/npm/bl_vx.x.x.js new file mode 100644 index 000000000..53fab3cbb --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/bl_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 2fa1bf3f484943a1d0f8c19ab090255b +// flow-typed version: <>/bl_v~1.1.2/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'bl' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'bl' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'bl/bl' { + declare module.exports: any; +} + +declare module 'bl/test/test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'bl/bl.js' { + declare module.exports: $Exports<'bl/bl'>; +} +declare module 'bl/test/test.js' { + declare module.exports: $Exports<'bl/test/test'>; +} diff --git a/services/webhook-handler/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js b/services/webhook-handler/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js new file mode 100644 index 000000000..fd33d73eb --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js @@ -0,0 +1,38 @@ +// flow-typed signature: bf317b1ec6a1c6f983be1f89706e1779 +// flow-typed version: <>/buffer-equal-constant-time_v~1.0.1/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'buffer-equal-constant-time' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'buffer-equal-constant-time' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'buffer-equal-constant-time/test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'buffer-equal-constant-time/index' { + declare module.exports: $Exports<'buffer-equal-constant-time'>; +} +declare module 'buffer-equal-constant-time/index.js' { + declare module.exports: $Exports<'buffer-equal-constant-time'>; +} +declare module 'buffer-equal-constant-time/test.js' { + declare module.exports: $Exports<'buffer-equal-constant-time/test'>; +} diff --git a/services/webhook-handler/flow-typed/npm/flow-bin_v0.x.x.js b/services/webhook-handler/flow-typed/npm/flow-bin_v0.x.x.js new file mode 100644 index 000000000..c538e2086 --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/flow-bin_v0.x.x.js @@ -0,0 +1,6 @@ +// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 +// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x + +declare module "flow-bin" { + declare module.exports: string; +} diff --git a/services/webhook-handler/flow-typed/npm/jest_v18.x.x.js b/services/webhook-handler/flow-typed/npm/jest_v18.x.x.js new file mode 100644 index 000000000..f4202e82a --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/jest_v18.x.x.js @@ -0,0 +1,439 @@ +// flow-typed signature: f9adc1fe5500052e55205636d0f376a7 +// flow-typed version: c17c09b83f/jest_v18.x.x/flow_>=v0.33.x + +type JestMockFn = { + (...args: Array): any, + /** + * An object for introspecting mock calls + */ + mock: { + /** + * An array that represents all calls that have been made into this mock + * function. Each call is represented by an array of arguments that were + * passed during the call. + */ + calls: Array>, + /** + * An array that contains all the object instances that have been + * instantiated from this mock function. + */ + instances: mixed, + }, + /** + * Resets all information stored in the mockFn.mock.calls and + * mockFn.mock.instances arrays. Often this is useful when you want to clean + * up a mock's usage data between two assertions. + */ + mockClear(): Function, + /** + * Resets all information stored in the mock. This is useful when you want to + * completely restore a mock back to its initial state. + */ + mockReset(): Function, + /** + * Accepts a function that should be used as the implementation of the mock. + * The mock itself will still record all calls that go into and instances + * that come from itself -- the only difference is that the implementation + * will also be executed when the mock is called. + */ + mockImplementation(fn: Function): JestMockFn, + /** + * Accepts a function that will be used as an implementation of the mock for + * one call to the mocked function. Can be chained so that multiple function + * calls produce different results. + */ + mockImplementationOnce(fn: Function): JestMockFn, + /** + * Just a simple sugar function for returning `this` + */ + mockReturnThis(): void, + /** + * Deprecated: use jest.fn(() => value) instead + */ + mockReturnValue(value: any): JestMockFn, + /** + * Sugar for only returning a value once inside your mock + */ + mockReturnValueOnce(value: any): JestMockFn, +} + +type JestAsymmetricEqualityType = { + /** + * A custom Jasmine equality tester + */ + asymmetricMatch(value: mixed): boolean, +} + +type JestCallsType = { + allArgs(): mixed, + all(): mixed, + any(): boolean, + count(): number, + first(): mixed, + mostRecent(): mixed, + reset(): void, +} + +type JestClockType = { + install(): void, + mockDate(date: Date): void, + tick(): void, + uninstall(): void, +} + +type JestMatcherResult = { + message?: string | ()=>string, + pass: boolean, +} + +type JestMatcher = (actual: any, expected: any) => JestMatcherResult; + +type JestExpectType = { + not: JestExpectType, + /** + * If you have a mock function, you can use .lastCalledWith to test what + * arguments it was last called with. + */ + lastCalledWith(...args: Array): void, + /** + * toBe just checks that a value is what you expect. It uses === to check + * strict equality. + */ + toBe(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toBeCalled(): void, + /** + * Use .toBeCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toBeCalledWith(...args: Array): void, + /** + * Using exact equality with floating point numbers is a bad idea. Rounding + * means that intuitive things fail. + */ + toBeCloseTo(num: number, delta: any): void, + /** + * Use .toBeDefined to check that a variable is not undefined. + */ + toBeDefined(): void, + /** + * Use .toBeFalsy when you don't care what a value is, you just want to + * ensure a value is false in a boolean context. + */ + toBeFalsy(): void, + /** + * To compare floating point numbers, you can use toBeGreaterThan. + */ + toBeGreaterThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeGreaterThanOrEqual. + */ + toBeGreaterThanOrEqual(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThan. + */ + toBeLessThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThanOrEqual. + */ + toBeLessThanOrEqual(number: number): void, + /** + * Use .toBeInstanceOf(Class) to check that an object is an instance of a + * class. + */ + toBeInstanceOf(cls: Class<*>): void, + /** + * .toBeNull() is the same as .toBe(null) but the error messages are a bit + * nicer. + */ + toBeNull(): void, + /** + * Use .toBeTruthy when you don't care what a value is, you just want to + * ensure a value is true in a boolean context. + */ + toBeTruthy(): void, + /** + * Use .toBeUndefined to check that a variable is undefined. + */ + toBeUndefined(): void, + /** + * Use .toContain when you want to check that an item is in a list. For + * testing the items in the list, this uses ===, a strict equality check. + */ + toContain(item: any): void, + /** + * Use .toContainEqual when you want to check that an item is in a list. For + * testing the items in the list, this matcher recursively checks the + * equality of all fields, rather than checking for object identity. + */ + toContainEqual(item: any): void, + /** + * Use .toEqual when you want to check that two objects have the same value. + * This matcher recursively checks the equality of all fields, rather than + * checking for object identity. + */ + toEqual(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toHaveBeenCalled(): void, + /** + * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact + * number of times. + */ + toHaveBeenCalledTimes(number: number): void, + /** + * Use .toHaveBeenCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toHaveBeenCalledWith(...args: Array): void, + /** + * Check that an object has a .length property and it is set to a certain + * numeric value. + */ + toHaveLength(number: number): void, + /** + * + */ + toHaveProperty(propPath: string, value?: any): void, + /** + * Use .toMatch to check that a string matches a regular expression. + */ + toMatch(regexp: RegExp): void, + /** + * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. + */ + toMatchObject(object: Object): void, + /** + * This ensures that a React component matches the most recent snapshot. + */ + toMatchSnapshot(name?: string): void, + /** + * Use .toThrow to test that a function throws when it is called. + */ + toThrow(message?: string | Error): void, + /** + * Use .toThrowError to test that a function throws a specific error when it + * is called. The argument can be a string for the error message, a class for + * the error, or a regex that should match the error. + */ + toThrowError(message?: string | Error | RegExp): void, + /** + * Use .toThrowErrorMatchingSnapshot to test that a function throws a error + * matching the most recent snapshot when it is called. + */ + toThrowErrorMatchingSnapshot(): void, +} + +type JestObjectType = { + /** + * Disables automatic mocking in the module loader. + * + * After this method is called, all `require()`s will return the real + * versions of each module (rather than a mocked version). + */ + disableAutomock(): JestObjectType, + /** + * An un-hoisted version of disableAutomock + */ + autoMockOff(): JestObjectType, + /** + * Enables automatic mocking in the module loader. + */ + enableAutomock(): JestObjectType, + /** + * An un-hoisted version of enableAutomock + */ + autoMockOn(): JestObjectType, + /** + * Resets the state of all mocks. Equivalent to calling .mockReset() on every + * mocked function. + */ + resetAllMocks(): JestObjectType, + /** + * Removes any pending timers from the timer system. + */ + clearAllTimers(): void, + /** + * The same as `mock` but not moved to the top of the expectation by + * babel-jest. + */ + doMock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * The same as `unmock` but not moved to the top of the expectation by + * babel-jest. + */ + dontMock(moduleName: string): JestObjectType, + /** + * Returns a new, unused mock function. Optionally takes a mock + * implementation. + */ + fn(implementation?: Function): JestMockFn, + /** + * Determines if the given function is a mocked function. + */ + isMockFunction(fn: Function): boolean, + /** + * Given the name of a module, use the automatic mocking system to generate a + * mocked version of the module for you. + */ + genMockFromModule(moduleName: string): any, + /** + * Mocks a module with an auto-mocked version when it is being required. + * + * The second argument can be used to specify an explicit module factory that + * is being run instead of using Jest's automocking feature. + * + * The third argument can be used to create virtual mocks -- mocks of modules + * that don't exist anywhere in the system. + */ + mock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * Resets the module registry - the cache of all required modules. This is + * useful to isolate modules where local state might conflict between tests. + */ + resetModules(): JestObjectType, + /** + * Exhausts the micro-task queue (usually interfaced in node via + * process.nextTick). + */ + runAllTicks(): void, + /** + * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), + * setInterval(), and setImmediate()). + */ + runAllTimers(): void, + /** + * Exhausts all tasks queued by setImmediate(). + */ + runAllImmediates(): void, + /** + * Executes only the macro task queue (i.e. all tasks queued by setTimeout() + * or setInterval() and setImmediate()). + */ + runTimersToTime(msToRun: number): void, + /** + * Executes only the macro-tasks that are currently pending (i.e., only the + * tasks that have been queued by setTimeout() or setInterval() up to this + * point) + */ + runOnlyPendingTimers(): void, + /** + * Explicitly supplies the mock object that the module system should return + * for the specified module. Note: It is recommended to use jest.mock() + * instead. + */ + setMock(moduleName: string, moduleExports: any): JestObjectType, + /** + * Indicates that the module system should never return a mocked version of + * the specified module from require() (e.g. that it should always return the + * real module). + */ + unmock(moduleName: string): JestObjectType, + /** + * Instructs Jest to use fake versions of the standard timer functions + * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, + * setImmediate and clearImmediate). + */ + useFakeTimers(): JestObjectType, + /** + * Instructs Jest to use the real versions of the standard timer functions. + */ + useRealTimers(): JestObjectType, +} + +type JestSpyType = { + calls: JestCallsType, +} + +/** Runs this function after every test inside this context */ +declare function afterEach(fn: Function): void; +/** Runs this function before every test inside this context */ +declare function beforeEach(fn: Function): void; +/** Runs this function after all tests have finished inside this context */ +declare function afterAll(fn: Function): void; +/** Runs this function before any tests have started inside this context */ +declare function beforeAll(fn: Function): void; +/** A context for grouping tests together */ +declare function describe(name: string, fn: Function): void; + +/** An individual test unit */ +declare var it: { + /** + * An individual test unit + * + * @param {string} Name of Test + * @param {Function} Test + */ + (name: string, fn?: Function): ?Promise, + /** + * Only run this test + * + * @param {string} Name of Test + * @param {Function} Test + */ + only(name: string, fn?: Function): ?Promise, + /** + * Skip running this test + * + * @param {string} Name of Test + * @param {Function} Test + */ + skip(name: string, fn?: Function): ?Promise, + /** + * Run the test concurrently + * + * @param {string} Name of Test + * @param {Function} Test + */ + concurrent(name: string, fn?: Function): ?Promise, +}; +declare function fit(name: string, fn: Function): ?Promise; +/** An individual test unit */ +declare var test: typeof it; +/** A disabled group of tests */ +declare var xdescribe: typeof describe; +/** A focused group of tests */ +declare var fdescribe: typeof describe; +/** A disabled individual test */ +declare var xit: typeof it; +/** A disabled individual test */ +declare var xtest: typeof it; + +/** The expect function is used every time you want to test a value */ +declare var expect: { + /** The object that you want to make assertions against */ + (value: any): JestExpectType, + /** Add additional Jasmine matchers to Jest's roster */ + extend(matchers: {[name:string]: JestMatcher}): void, + assertions(expectedAssertions: number): void, + any(value: mixed): JestAsymmetricEqualityType, + anything(): void, + arrayContaining(value: Array): void, + objectContaining(value: Object): void, + stringMatching(value: string): void, +}; + +// TODO handle return type +// http://jasmine.github.io/2.4/introduction.html#section-Spies +declare function spyOn(value: mixed, method: string): Object; + +/** Holds all functions related to manipulating test runner */ +declare var jest: JestObjectType + +/** + * The global Jamine object, this is generally not exposed as the public API, + * using features inside here could break in later versions of Jest. + */ +declare var jasmine: { + DEFAULT_TIMEOUT_INTERVAL: number, + any(value: mixed): JestAsymmetricEqualityType, + anything(): void, + arrayContaining(value: Array): void, + clock(): JestClockType, + createSpy(name: string): JestSpyType, + objectContaining(value: Object): void, + stringMatching(value: string): void, +} diff --git a/services/webhook-handler/flow-typed/npm/loggly-winston-bulk_vx.x.x.js b/services/webhook-handler/flow-typed/npm/loggly-winston-bulk_vx.x.x.js new file mode 100644 index 000000000..b8f6002aa --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/loggly-winston-bulk_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: b34e50fae7ffa8ef3a3235ddcc2881ea +// flow-typed version: <>/loggly-winston-bulk_v^1.0.1/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'loggly-winston-bulk' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'loggly-winston-bulk' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'loggly-winston-bulk/lib/winston-loggly' { + declare module.exports: any; +} + +declare module 'loggly-winston-bulk/test/winston-loggly-test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'loggly-winston-bulk/lib/winston-loggly.js' { + declare module.exports: $Exports<'loggly-winston-bulk/lib/winston-loggly'>; +} +declare module 'loggly-winston-bulk/test/winston-loggly-test.js' { + declare module.exports: $Exports<'loggly-winston-bulk/test/winston-loggly-test'>; +} diff --git a/services/webhook-handler/flow-typed/npm/newman_vx.x.x.js b/services/webhook-handler/flow-typed/npm/newman_vx.x.x.js new file mode 100644 index 000000000..6fed00153 --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/newman_vx.x.x.js @@ -0,0 +1,388 @@ +// flow-typed signature: 3140924328fd3377db618d12f139652e +// flow-typed version: <>/newman_v^3.3.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'newman' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'newman' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'newman/bin/newman' { + declare module.exports: any; +} + +declare module 'newman/examples/find-unique-urls-in-run' { + declare module.exports: any; +} + +declare module 'newman/examples/parallel-collection-runs' { + declare module.exports: any; +} + +declare module 'newman/examples/read-collection-from-file' { + declare module.exports: any; +} + +declare module 'newman/examples/run-collections-in-directory' { + declare module.exports: any; +} + +declare module 'newman/lib/cli/index' { + declare module.exports: any; +} + +declare module 'newman/lib/config/index' { + declare module.exports: any; +} + +declare module 'newman/lib/config/process-env' { + declare module.exports: any; +} + +declare module 'newman/lib/config/rc-file' { + declare module.exports: any; +} + +declare module 'newman/lib/index' { + declare module.exports: any; +} + +declare module 'newman/lib/node-version-check/index' { + declare module.exports: any; +} + +declare module 'newman/lib/print/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/cli-utils-symbols' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/cli-utils' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/emojitrain' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/html/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/json/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/junit/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/progress' { + declare module.exports: any; +} + +declare module 'newman/lib/run/export-file' { + declare module.exports: any; +} + +declare module 'newman/lib/run/index' { + declare module.exports: any; +} + +declare module 'newman/lib/run/options' { + declare module.exports: any; +} + +declare module 'newman/lib/run/summary' { + declare module.exports: any; +} + +declare module 'newman/lib/util' { + declare module.exports: any; +} + +declare module 'newman/lib/version' { + declare module.exports: any; +} + +declare module 'newman/npm/build-docs' { + declare module.exports: any; +} + +declare module 'newman/npm/build-wiki' { + declare module.exports: any; +} + +declare module 'newman/npm/publish-docs' { + declare module.exports: any; +} + +declare module 'newman/npm/publish-wiki' { + declare module.exports: any; +} + +declare module 'newman/npm/test-cli' { + declare module.exports: any; +} + +declare module 'newman/npm/test-integration' { + declare module.exports: any; +} + +declare module 'newman/npm/test-lint' { + declare module.exports: any; +} + +declare module 'newman/npm/test-system' { + declare module.exports: any; +} + +declare module 'newman/npm/test-unit' { + declare module.exports: any; +} + +declare module 'newman/npm/test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/export-environment.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/export-globals.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/iteration-count.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/ssl-client-cert.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/suppress-exit-code.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/appveyor-yml.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/editorconfig.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/jsdoc-config.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/nsp.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/repository.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/travis-yml.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/cli-reporter-symbols.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/cli.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/run-summary.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/run.test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'newman/bin/newman.js' { + declare module.exports: $Exports<'newman/bin/newman'>; +} +declare module 'newman/examples/find-unique-urls-in-run.js' { + declare module.exports: $Exports<'newman/examples/find-unique-urls-in-run'>; +} +declare module 'newman/examples/parallel-collection-runs.js' { + declare module.exports: $Exports<'newman/examples/parallel-collection-runs'>; +} +declare module 'newman/examples/read-collection-from-file.js' { + declare module.exports: $Exports<'newman/examples/read-collection-from-file'>; +} +declare module 'newman/examples/run-collections-in-directory.js' { + declare module.exports: $Exports<'newman/examples/run-collections-in-directory'>; +} +declare module 'newman/index' { + declare module.exports: $Exports<'newman'>; +} +declare module 'newman/index.js' { + declare module.exports: $Exports<'newman'>; +} +declare module 'newman/lib/cli/index.js' { + declare module.exports: $Exports<'newman/lib/cli/index'>; +} +declare module 'newman/lib/config/index.js' { + declare module.exports: $Exports<'newman/lib/config/index'>; +} +declare module 'newman/lib/config/process-env.js' { + declare module.exports: $Exports<'newman/lib/config/process-env'>; +} +declare module 'newman/lib/config/rc-file.js' { + declare module.exports: $Exports<'newman/lib/config/rc-file'>; +} +declare module 'newman/lib/index.js' { + declare module.exports: $Exports<'newman/lib/index'>; +} +declare module 'newman/lib/node-version-check/index.js' { + declare module.exports: $Exports<'newman/lib/node-version-check/index'>; +} +declare module 'newman/lib/print/index.js' { + declare module.exports: $Exports<'newman/lib/print/index'>; +} +declare module 'newman/lib/reporters/cli/cli-utils-symbols.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/cli-utils-symbols'>; +} +declare module 'newman/lib/reporters/cli/cli-utils.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/cli-utils'>; +} +declare module 'newman/lib/reporters/cli/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/index'>; +} +declare module 'newman/lib/reporters/emojitrain.js' { + declare module.exports: $Exports<'newman/lib/reporters/emojitrain'>; +} +declare module 'newman/lib/reporters/html/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/html/index'>; +} +declare module 'newman/lib/reporters/json/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/json/index'>; +} +declare module 'newman/lib/reporters/junit/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/junit/index'>; +} +declare module 'newman/lib/reporters/progress.js' { + declare module.exports: $Exports<'newman/lib/reporters/progress'>; +} +declare module 'newman/lib/run/export-file.js' { + declare module.exports: $Exports<'newman/lib/run/export-file'>; +} +declare module 'newman/lib/run/index.js' { + declare module.exports: $Exports<'newman/lib/run/index'>; +} +declare module 'newman/lib/run/options.js' { + declare module.exports: $Exports<'newman/lib/run/options'>; +} +declare module 'newman/lib/run/summary.js' { + declare module.exports: $Exports<'newman/lib/run/summary'>; +} +declare module 'newman/lib/util.js' { + declare module.exports: $Exports<'newman/lib/util'>; +} +declare module 'newman/lib/version.js' { + declare module.exports: $Exports<'newman/lib/version'>; +} +declare module 'newman/npm/build-docs.js' { + declare module.exports: $Exports<'newman/npm/build-docs'>; +} +declare module 'newman/npm/build-wiki.js' { + declare module.exports: $Exports<'newman/npm/build-wiki'>; +} +declare module 'newman/npm/publish-docs.js' { + declare module.exports: $Exports<'newman/npm/publish-docs'>; +} +declare module 'newman/npm/publish-wiki.js' { + declare module.exports: $Exports<'newman/npm/publish-wiki'>; +} +declare module 'newman/npm/test-cli.js' { + declare module.exports: $Exports<'newman/npm/test-cli'>; +} +declare module 'newman/npm/test-integration.js' { + declare module.exports: $Exports<'newman/npm/test-integration'>; +} +declare module 'newman/npm/test-lint.js' { + declare module.exports: $Exports<'newman/npm/test-lint'>; +} +declare module 'newman/npm/test-system.js' { + declare module.exports: $Exports<'newman/npm/test-system'>; +} +declare module 'newman/npm/test-unit.js' { + declare module.exports: $Exports<'newman/npm/test-unit'>; +} +declare module 'newman/npm/test.js' { + declare module.exports: $Exports<'newman/npm/test'>; +} +declare module 'newman/test/cli/export-environment.test.js' { + declare module.exports: $Exports<'newman/test/cli/export-environment.test'>; +} +declare module 'newman/test/cli/export-globals.test.js' { + declare module.exports: $Exports<'newman/test/cli/export-globals.test'>; +} +declare module 'newman/test/cli/iteration-count.test.js' { + declare module.exports: $Exports<'newman/test/cli/iteration-count.test'>; +} +declare module 'newman/test/cli/ssl-client-cert.test.js' { + declare module.exports: $Exports<'newman/test/cli/ssl-client-cert.test'>; +} +declare module 'newman/test/cli/suppress-exit-code.test.js' { + declare module.exports: $Exports<'newman/test/cli/suppress-exit-code.test'>; +} +declare module 'newman/test/system/appveyor-yml.test.js' { + declare module.exports: $Exports<'newman/test/system/appveyor-yml.test'>; +} +declare module 'newman/test/system/editorconfig.test.js' { + declare module.exports: $Exports<'newman/test/system/editorconfig.test'>; +} +declare module 'newman/test/system/jsdoc-config.test.js' { + declare module.exports: $Exports<'newman/test/system/jsdoc-config.test'>; +} +declare module 'newman/test/system/nsp.test.js' { + declare module.exports: $Exports<'newman/test/system/nsp.test'>; +} +declare module 'newman/test/system/repository.test.js' { + declare module.exports: $Exports<'newman/test/system/repository.test'>; +} +declare module 'newman/test/system/travis-yml.test.js' { + declare module.exports: $Exports<'newman/test/system/travis-yml.test'>; +} +declare module 'newman/test/unit/cli-reporter-symbols.test.js' { + declare module.exports: $Exports<'newman/test/unit/cli-reporter-symbols.test'>; +} +declare module 'newman/test/unit/cli.test.js' { + declare module.exports: $Exports<'newman/test/unit/cli.test'>; +} +declare module 'newman/test/unit/run-summary.test.js' { + declare module.exports: $Exports<'newman/test/unit/run-summary.test'>; +} +declare module 'newman/test/unit/run.test.js' { + declare module.exports: $Exports<'newman/test/unit/run.test'>; +} diff --git a/services/webhook-handler/flow-typed/npm/nodemon_vx.x.x.js b/services/webhook-handler/flow-typed/npm/nodemon_vx.x.x.js new file mode 100644 index 000000000..b0229d730 --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/nodemon_vx.x.x.js @@ -0,0 +1,214 @@ +// flow-typed signature: eab46bce88fff52d1a9d8bec9a241fc5 +// flow-typed version: <>/nodemon_v^1.11.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'nodemon' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'nodemon' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'nodemon/bin/nodemon' { + declare module.exports: any; +} + +declare module 'nodemon/lib/cli/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/cli/parse' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/command' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/defaults' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/exec' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/load' { + declare module.exports: any; +} + +declare module 'nodemon/lib/help/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/match' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/run' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/watch' { + declare module.exports: any; +} + +declare module 'nodemon/lib/nodemon' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/add' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/parse' { + declare module.exports: any; +} + +declare module 'nodemon/lib/spawn' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/bus' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/clone' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/colour' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/log' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/merge' { + declare module.exports: any; +} + +declare module 'nodemon/lib/version' { + declare module.exports: any; +} + +declare module 'nodemon/web/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'nodemon/bin/nodemon.js' { + declare module.exports: $Exports<'nodemon/bin/nodemon'>; +} +declare module 'nodemon/lib/cli/index.js' { + declare module.exports: $Exports<'nodemon/lib/cli/index'>; +} +declare module 'nodemon/lib/cli/parse.js' { + declare module.exports: $Exports<'nodemon/lib/cli/parse'>; +} +declare module 'nodemon/lib/config/command.js' { + declare module.exports: $Exports<'nodemon/lib/config/command'>; +} +declare module 'nodemon/lib/config/defaults.js' { + declare module.exports: $Exports<'nodemon/lib/config/defaults'>; +} +declare module 'nodemon/lib/config/exec.js' { + declare module.exports: $Exports<'nodemon/lib/config/exec'>; +} +declare module 'nodemon/lib/config/index.js' { + declare module.exports: $Exports<'nodemon/lib/config/index'>; +} +declare module 'nodemon/lib/config/load.js' { + declare module.exports: $Exports<'nodemon/lib/config/load'>; +} +declare module 'nodemon/lib/help/index.js' { + declare module.exports: $Exports<'nodemon/lib/help/index'>; +} +declare module 'nodemon/lib/index.js' { + declare module.exports: $Exports<'nodemon/lib/index'>; +} +declare module 'nodemon/lib/monitor/index.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/index'>; +} +declare module 'nodemon/lib/monitor/match.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/match'>; +} +declare module 'nodemon/lib/monitor/run.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/run'>; +} +declare module 'nodemon/lib/monitor/watch.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/watch'>; +} +declare module 'nodemon/lib/nodemon.js' { + declare module.exports: $Exports<'nodemon/lib/nodemon'>; +} +declare module 'nodemon/lib/rules/add.js' { + declare module.exports: $Exports<'nodemon/lib/rules/add'>; +} +declare module 'nodemon/lib/rules/index.js' { + declare module.exports: $Exports<'nodemon/lib/rules/index'>; +} +declare module 'nodemon/lib/rules/parse.js' { + declare module.exports: $Exports<'nodemon/lib/rules/parse'>; +} +declare module 'nodemon/lib/spawn.js' { + declare module.exports: $Exports<'nodemon/lib/spawn'>; +} +declare module 'nodemon/lib/utils/bus.js' { + declare module.exports: $Exports<'nodemon/lib/utils/bus'>; +} +declare module 'nodemon/lib/utils/clone.js' { + declare module.exports: $Exports<'nodemon/lib/utils/clone'>; +} +declare module 'nodemon/lib/utils/colour.js' { + declare module.exports: $Exports<'nodemon/lib/utils/colour'>; +} +declare module 'nodemon/lib/utils/index.js' { + declare module.exports: $Exports<'nodemon/lib/utils/index'>; +} +declare module 'nodemon/lib/utils/log.js' { + declare module.exports: $Exports<'nodemon/lib/utils/log'>; +} +declare module 'nodemon/lib/utils/merge.js' { + declare module.exports: $Exports<'nodemon/lib/utils/merge'>; +} +declare module 'nodemon/lib/version.js' { + declare module.exports: $Exports<'nodemon/lib/version'>; +} +declare module 'nodemon/web/index.js' { + declare module.exports: $Exports<'nodemon/web/index'>; +} diff --git a/services/webhook-handler/flow-typed/npm/winston_vx.x.x.js b/services/webhook-handler/flow-typed/npm/winston_vx.x.x.js new file mode 100644 index 000000000..eaebbf00e --- /dev/null +++ b/services/webhook-handler/flow-typed/npm/winston_vx.x.x.js @@ -0,0 +1,214 @@ +// flow-typed signature: 48dced19d396d69846f3d7727f01a59f +// flow-typed version: <>/winston_v^2.2.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'winston' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'winston' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'winston/lib/winston' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/common' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/cli-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/npm-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/syslog-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/container' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/exception' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/logger' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/console' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/file' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/http' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/memory' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/transport' { + declare module.exports: any; +} + +declare module 'winston/test/helpers' { + declare module.exports: any; +} + +declare module 'winston/test/transports/console-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-archive-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-maxfiles-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-maxsize-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-open-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-stress-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-tailrolling-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/http-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/memory-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/transport' { + declare module.exports: any; +} + +// Filename aliases +declare module 'winston/lib/winston.js' { + declare module.exports: $Exports<'winston/lib/winston'>; +} +declare module 'winston/lib/winston/common.js' { + declare module.exports: $Exports<'winston/lib/winston/common'>; +} +declare module 'winston/lib/winston/config.js' { + declare module.exports: $Exports<'winston/lib/winston/config'>; +} +declare module 'winston/lib/winston/config/cli-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/cli-config'>; +} +declare module 'winston/lib/winston/config/npm-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/npm-config'>; +} +declare module 'winston/lib/winston/config/syslog-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/syslog-config'>; +} +declare module 'winston/lib/winston/container.js' { + declare module.exports: $Exports<'winston/lib/winston/container'>; +} +declare module 'winston/lib/winston/exception.js' { + declare module.exports: $Exports<'winston/lib/winston/exception'>; +} +declare module 'winston/lib/winston/logger.js' { + declare module.exports: $Exports<'winston/lib/winston/logger'>; +} +declare module 'winston/lib/winston/transports.js' { + declare module.exports: $Exports<'winston/lib/winston/transports'>; +} +declare module 'winston/lib/winston/transports/console.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/console'>; +} +declare module 'winston/lib/winston/transports/file.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/file'>; +} +declare module 'winston/lib/winston/transports/http.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/http'>; +} +declare module 'winston/lib/winston/transports/memory.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/memory'>; +} +declare module 'winston/lib/winston/transports/transport.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/transport'>; +} +declare module 'winston/test/helpers.js' { + declare module.exports: $Exports<'winston/test/helpers'>; +} +declare module 'winston/test/transports/console-test.js' { + declare module.exports: $Exports<'winston/test/transports/console-test'>; +} +declare module 'winston/test/transports/file-archive-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-archive-test'>; +} +declare module 'winston/test/transports/file-maxfiles-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-maxfiles-test'>; +} +declare module 'winston/test/transports/file-maxsize-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-maxsize-test'>; +} +declare module 'winston/test/transports/file-open-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-open-test'>; +} +declare module 'winston/test/transports/file-stress-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-stress-test'>; +} +declare module 'winston/test/transports/file-tailrolling-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-tailrolling-test'>; +} +declare module 'winston/test/transports/file-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-test'>; +} +declare module 'winston/test/transports/http-test.js' { + declare module.exports: $Exports<'winston/test/transports/http-test'>; +} +declare module 'winston/test/transports/memory-test.js' { + declare module.exports: $Exports<'winston/test/transports/memory-test'>; +} +declare module 'winston/test/transports/transport.js' { + declare module.exports: $Exports<'winston/test/transports/transport'>; +} diff --git a/services/webhook-handler/newman/amazeeio-webhook-handler.postman_collection.json b/services/webhook-handler/newman/amazeeio-webhook-handler.postman_collection.json new file mode 100644 index 000000000..b01e55985 --- /dev/null +++ b/services/webhook-handler/newman/amazeeio-webhook-handler.postman_collection.json @@ -0,0 +1,346 @@ +{ + "variables": [], + "info": { + "name": "amazeeio-webhook-handler", + "_postman_id": "1b66ac5d-b61f-0b0b-a627-d4847e0a2cb8", + "description": "", + "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" + }, + "item": [ + { + "name": "github", + "description": "", + "item": [ + { + "name": "github branch push", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "tests[\"Status code is 200\"] = responseCode.code === 200;" + ] + } + } + ], + "request": { + "url": "{{hostname}}", + "method": "POST", + "header": [ + { + "key": "User-Agent", + "value": "GitHub-Hookshot/eb03e36", + "description": "" + }, + { + "key": "X-GitHub-Event", + "value": "push", + "description": "" + }, + { + "key": "X-GitHub-Delivery", + "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + "description": "" + }, + { + "key": "content-type", + "value": "application/json", + "description": "" + } + ], + "body": { + "mode": "raw", + "raw": "{\"ref\":\"refs/heads/pushedbranch\",\"before\":\"d8072aa41afa0e91b89cad0bf68963c56658a66f\",\"after\":\"05ba8a7269b626e4f121cc395733cd4498219193\",\"created\":false,\"deleted\":false,\"forced\":false,\"base_ref\":null,\"compare\":\"https://github.com/AmazeeLabs/amazee_io/compare/d8072aa41afa...05ba8a7269b6\",\"commits\":[{\"id\":\"05ba8a7269b626e4f121cc395733cd4498219193\",\"tree_id\":\"33e62fad073ea78bd2f2f516ae7634bd976587a7\",\"distinct\":true,\"message\":\"Revert \\\"hello worl:d\\\"\\n\\nThis reverts commit d8072aa41afa0e91b89cad0bf68963c56658a66f.\",\"timestamp\":\"2016-12-12T09:01:38-06:00\",\"url\":\"https://github.com/AmazeeLabs/amazee_io/commit/05ba8a7269b626e4f121cc395733cd4498219193\",\"author\":{\"name\":\"Michael Schmid\",\"email\":\"michael@amazeelabs.com\",\"username\":\"Schnitzel\"},\"committer\":{\"name\":\"Michael Schmid\",\"email\":\"michael@amazeelabs.com\",\"username\":\"Schnitzel\"},\"added\":[],\"removed\":[],\"modified\":[\"themes/beaker/templates/page.html.twig\"]}],\"head_commit\":{\"id\":\"05ba8a7269b626e4f121cc395733cd4498219193\",\"tree_id\":\"33e62fad073ea78bd2f2f516ae7634bd976587a7\",\"distinct\":true,\"message\":\"Revert \\\"hello worl:d\\\"\\n\\nThis reverts commit d8072aa41afa0e91b89cad0bf68963c56658a66f.\",\"timestamp\":\"2016-12-12T09:01:38-06:00\",\"url\":\"https://github.com/AmazeeLabs/amazee_io/commit/05ba8a7269b626e4f121cc395733cd4498219193\",\"author\":{\"name\":\"Michael Schmid\",\"email\":\"michael@amazeelabs.com\",\"username\":\"Schnitzel\"},\"committer\":{\"name\":\"Michael Schmid\",\"email\":\"michael@amazeelabs.com\",\"username\":\"Schnitzel\"},\"added\":[],\"removed\":[],\"modified\":[\"themes/beaker/templates/page.html.twig\"]},\"repository\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"name\":\"AmazeeLabs\",\"email\":\"\"},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://github.com/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":1461650975,\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":1481554905,\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107137,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\",\"stargazers\":0,\"master_branch\":\"prod\",\"organization\":\"AmazeeLabs\"},\"pusher\":{\"name\":\"Schnitzel\",\"email\":\"michael@amazeelabs.com\"},\"organization\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"url\":\"https://api.github.com/orgs/AmazeeLabs\",\"repos_url\":\"https://api.github.com/orgs/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/orgs/AmazeeLabs/events\",\"hooks_url\":\"https://api.github.com/orgs/AmazeeLabs/hooks\",\"issues_url\":\"https://api.github.com/orgs/AmazeeLabs/issues\",\"members_url\":\"https://api.github.com/orgs/AmazeeLabs/members{/member}\",\"public_members_url\":\"https://api.github.com/orgs/AmazeeLabs/public_members{/member}\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"description\":\"\"},\"sender\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false}}" + }, + "description": "github push POST" + }, + "response": [] + }, + { + "name": "github branch push with slash", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "tests[\"Status code is 200\"] = responseCode.code === 200;" + ] + } + } + ], + "request": { + "url": "{{hostname}}", + "method": "POST", + "header": [ + { + "key": "User-Agent", + "value": "GitHub-Hookshot/eb03e36", + "description": "" + }, + { + "key": "X-GitHub-Event", + "value": "push", + "description": "" + }, + { + "key": "X-GitHub-Delivery", + "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + "description": "" + }, + { + "key": "content-type", + "value": "application/json", + "description": "" + } + ], + "body": { + "mode": "raw", + "raw": "{\"ref\":\"refs/heads/feature/pushedbranch\",\"before\":\"d8072aa41afa0e91b89cad0bf68963c56658a66f\",\"after\":\"05ba8a7269b626e4f121cc395733cd4498219193\",\"created\":false,\"deleted\":false,\"forced\":false,\"base_ref\":null,\"compare\":\"https://github.com/AmazeeLabs/amazee_io/compare/d8072aa41afa...05ba8a7269b6\",\"commits\":[{\"id\":\"05ba8a7269b626e4f121cc395733cd4498219193\",\"tree_id\":\"33e62fad073ea78bd2f2f516ae7634bd976587a7\",\"distinct\":true,\"message\":\"Revert \\\"hello worl:d\\\"\\n\\nThis reverts commit d8072aa41afa0e91b89cad0bf68963c56658a66f.\",\"timestamp\":\"2016-12-12T09:01:38-06:00\",\"url\":\"https://github.com/AmazeeLabs/amazee_io/commit/05ba8a7269b626e4f121cc395733cd4498219193\",\"author\":{\"name\":\"Michael Schmid\",\"email\":\"michael@amazeelabs.com\",\"username\":\"Schnitzel\"},\"committer\":{\"name\":\"Michael Schmid\",\"email\":\"michael@amazeelabs.com\",\"username\":\"Schnitzel\"},\"added\":[],\"removed\":[],\"modified\":[\"themes/beaker/templates/page.html.twig\"]}],\"head_commit\":{\"id\":\"05ba8a7269b626e4f121cc395733cd4498219193\",\"tree_id\":\"33e62fad073ea78bd2f2f516ae7634bd976587a7\",\"distinct\":true,\"message\":\"Revert \\\"hello worl:d\\\"\\n\\nThis reverts commit d8072aa41afa0e91b89cad0bf68963c56658a66f.\",\"timestamp\":\"2016-12-12T09:01:38-06:00\",\"url\":\"https://github.com/AmazeeLabs/amazee_io/commit/05ba8a7269b626e4f121cc395733cd4498219193\",\"author\":{\"name\":\"Michael Schmid\",\"email\":\"michael@amazeelabs.com\",\"username\":\"Schnitzel\"},\"committer\":{\"name\":\"Michael Schmid\",\"email\":\"michael@amazeelabs.com\",\"username\":\"Schnitzel\"},\"added\":[],\"removed\":[],\"modified\":[\"themes/beaker/templates/page.html.twig\"]},\"repository\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"name\":\"AmazeeLabs\",\"email\":\"\"},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://github.com/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":1461650975,\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":1481554905,\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107137,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\",\"stargazers\":0,\"master_branch\":\"prod\",\"organization\":\"AmazeeLabs\"},\"pusher\":{\"name\":\"Schnitzel\",\"email\":\"michael@amazeelabs.com\"},\"organization\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"url\":\"https://api.github.com/orgs/AmazeeLabs\",\"repos_url\":\"https://api.github.com/orgs/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/orgs/AmazeeLabs/events\",\"hooks_url\":\"https://api.github.com/orgs/AmazeeLabs/hooks\",\"issues_url\":\"https://api.github.com/orgs/AmazeeLabs/issues\",\"members_url\":\"https://api.github.com/orgs/AmazeeLabs/members{/member}\",\"public_members_url\":\"https://api.github.com/orgs/AmazeeLabs/public_members{/member}\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"description\":\"\"},\"sender\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false}}" + }, + "description": "" + }, + "response": [] + }, + { + "name": "github branch delete", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "tests[\"Status code is 200\"] = responseCode.code === 200;" + ] + } + } + ], + "request": { + "url": "{{hostname}}", + "method": "POST", + "header": [ + { + "key": "User-Agent", + "value": "GitHub-Hookshot/eb03e36", + "description": "" + }, + { + "key": "X-GitHub-Event", + "value": "delete", + "description": "" + }, + { + "key": "X-GitHub-Delivery", + "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + "description": "" + }, + { + "key": "content-type", + "value": "application/json", + "description": "" + } + ], + "body": { + "mode": "raw", + "raw": "{\"ref\":\"deletedbranch\",\"ref_type\":\"branch\",\"pusher_type\":\"user\",\"repository\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:40:42Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\"},\"organization\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"url\":\"https://api.github.com/orgs/AmazeeLabs\",\"repos_url\":\"https://api.github.com/orgs/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/orgs/AmazeeLabs/events\",\"hooks_url\":\"https://api.github.com/orgs/AmazeeLabs/hooks\",\"issues_url\":\"https://api.github.com/orgs/AmazeeLabs/issues\",\"members_url\":\"https://api.github.com/orgs/AmazeeLabs/members{/member}\",\"public_members_url\":\"https://api.github.com/orgs/AmazeeLabs/public_members{/member}\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"description\":\"\"},\"sender\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false}}" + }, + "description": "" + }, + "response": [] + }, + { + "name": "github branch delete with slash", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "tests[\"Status code is 200\"] = responseCode.code === 200;" + ] + } + } + ], + "request": { + "url": "{{hostname}}", + "method": "POST", + "header": [ + { + "key": "User-Agent", + "value": "GitHub-Hookshot/eb03e36", + "description": "" + }, + { + "key": "X-GitHub-Event", + "value": "delete", + "description": "" + }, + { + "key": "X-GitHub-Delivery", + "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + "description": "" + }, + { + "key": "content-type", + "value": "application/json", + "description": "" + } + ], + "body": { + "mode": "raw", + "raw": "{\"ref\":\"feature/deletedbranch\",\"ref_type\":\"branch\",\"pusher_type\":\"user\",\"repository\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:40:42Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\"},\"organization\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"url\":\"https://api.github.com/orgs/AmazeeLabs\",\"repos_url\":\"https://api.github.com/orgs/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/orgs/AmazeeLabs/events\",\"hooks_url\":\"https://api.github.com/orgs/AmazeeLabs/hooks\",\"issues_url\":\"https://api.github.com/orgs/AmazeeLabs/issues\",\"members_url\":\"https://api.github.com/orgs/AmazeeLabs/members{/member}\",\"public_members_url\":\"https://api.github.com/orgs/AmazeeLabs/public_members{/member}\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"description\":\"\"},\"sender\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false}}" + }, + "description": "" + }, + "response": [] + }, + { + "name": "github pull request opened", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "tests[\"Status code is 200\"] = responseCode.code === 200;" + ] + } + } + ], + "request": { + "url": "{{hostname}}", + "method": "POST", + "header": [ + { + "key": "User-Agent", + "value": "GitHub-Hookshot/eb03e36", + "description": "" + }, + { + "key": "X-GitHub-Event", + "value": "pull_request", + "description": "" + }, + { + "key": "X-GitHub-Delivery", + "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + "description": "" + }, + { + "key": "content-type", + "value": "application/json", + "description": "" + } + ], + "body": { + "mode": "raw", + "raw": "{\"action\":\"opened\",\"number\":42,\"pull_request\":{\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42\",\"id\":97609773,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42\",\"diff_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42.diff\",\"patch_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42.patch\",\"issue_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42\",\"number\":42,\"state\":\"open\",\"locked\":false,\"title\":\"Release/lisa\",\"user\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false},\"body\":\"\",\"created_at\":\"2016-12-12T18:46:30Z\",\"updated_at\":\"2016-12-12T18:46:30Z\",\"closed_at\":null,\"merged_at\":null,\"merge_commit_sha\":\"00ff25673e5cba866871aa60f6f59b0ce985b401\",\"assignee\":null,\"assignees\":[],\"milestone\":null,\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/commits\",\"review_comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/comments\",\"review_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/comments{/number}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42/comments\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/0fc73f188aea939ada45acf65b75d49633483f40\",\"head\":{\"label\":\"AmazeeLabs:release/lisa\",\"ref\":\"release/lisa\",\"sha\":\"0fc73f188aea939ada45acf65b75d49633483f40\",\"user\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"repo\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\"}},\"base\":{\"label\":\"AmazeeLabs:prod\",\"ref\":\"prod\",\"sha\":\"c8d8b706ef87bc7bd022b11e3c24754cd56d0bc8\",\"user\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"repo\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\"}},\"_links\":{\"self\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42\"},\"html\":{\"href\":\"https://github.com/AmazeeLabs/amazee_io/pull/42\"},\"issue\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42\"},\"comments\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42/comments\"},\"review_comments\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/comments\"},\"review_comment\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/comments{/number}\"},\"commits\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/commits\"},\"statuses\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/0fc73f188aea939ada45acf65b75d49633483f40\"}},\"merged\":false,\"mergeable\":true,\"mergeable_state\":\"clean\",\"merged_by\":null,\"comments\":0,\"review_comments\":0,\"commits\":3,\"additions\":3,\"deletions\":5,\"changed_files\":2},\"repository\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\"},\"organization\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"url\":\"https://api.github.com/orgs/AmazeeLabs\",\"repos_url\":\"https://api.github.com/orgs/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/orgs/AmazeeLabs/events\",\"hooks_url\":\"https://api.github.com/orgs/AmazeeLabs/hooks\",\"issues_url\":\"https://api.github.com/orgs/AmazeeLabs/issues\",\"members_url\":\"https://api.github.com/orgs/AmazeeLabs/members{/member}\",\"public_members_url\":\"https://api.github.com/orgs/AmazeeLabs/public_members{/member}\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"description\":\"\"},\"sender\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false}}" + }, + "description": "" + }, + "response": [] + }, + { + "name": "github pull request closed", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "tests[\"Status code is 200\"] = responseCode.code === 200;" + ] + } + } + ], + "request": { + "url": "{{hostname}}", + "method": "POST", + "header": [ + { + "key": "User-Agent", + "value": "GitHub-Hookshot/eb03e36", + "description": "" + }, + { + "key": "X-GitHub-Event", + "value": "pull_request", + "description": "" + }, + { + "key": "X-GitHub-Delivery", + "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + "description": "" + }, + { + "key": "content-type", + "value": "application/json", + "description": "" + } + ], + "body": { + "mode": "raw", + "raw": "{\"action\":\"closed\",\"number\":42,\"pull_request\":{\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42\",\"id\":97609773,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42\",\"diff_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42.diff\",\"patch_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42.patch\",\"issue_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42\",\"number\":42,\"state\":\"closed\",\"locked\":false,\"title\":\"Release/lisa\",\"user\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false},\"body\":\"\",\"created_at\":\"2016-12-12T18:46:30Z\",\"updated_at\":\"2016-12-12T18:47:26Z\",\"closed_at\":\"2016-12-12T18:47:26Z\",\"merged_at\":null,\"merge_commit_sha\":\"00ff25673e5cba866871aa60f6f59b0ce985b401\",\"assignee\":null,\"assignees\":[],\"milestone\":null,\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/commits\",\"review_comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/comments\",\"review_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/comments{/number}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42/comments\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/0fc73f188aea939ada45acf65b75d49633483f40\",\"head\":{\"label\":\"AmazeeLabs:release/lisa\",\"ref\":\"release/lisa\",\"sha\":\"0fc73f188aea939ada45acf65b75d49633483f40\",\"user\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"repo\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":2,\"forks\":0,\"open_issues\":2,\"watchers\":0,\"default_branch\":\"prod\"}},\"base\":{\"label\":\"AmazeeLabs:prod\",\"ref\":\"prod\",\"sha\":\"c8d8b706ef87bc7bd022b11e3c24754cd56d0bc8\",\"user\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"repo\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":2,\"forks\":0,\"open_issues\":2,\"watchers\":0,\"default_branch\":\"prod\"}},\"_links\":{\"self\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42\"},\"html\":{\"href\":\"https://github.com/AmazeeLabs/amazee_io/pull/42\"},\"issue\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42\"},\"comments\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42/comments\"},\"review_comments\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/comments\"},\"review_comment\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/comments{/number}\"},\"commits\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/commits\"},\"statuses\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/0fc73f188aea939ada45acf65b75d49633483f40\"}},\"merged\":false,\"mergeable\":true,\"mergeable_state\":\"clean\",\"merged_by\":null,\"comments\":0,\"review_comments\":0,\"commits\":3,\"additions\":3,\"deletions\":5,\"changed_files\":2},\"repository\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":2,\"forks\":0,\"open_issues\":2,\"watchers\":0,\"default_branch\":\"prod\"},\"organization\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"url\":\"https://api.github.com/orgs/AmazeeLabs\",\"repos_url\":\"https://api.github.com/orgs/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/orgs/AmazeeLabs/events\",\"hooks_url\":\"https://api.github.com/orgs/AmazeeLabs/hooks\",\"issues_url\":\"https://api.github.com/orgs/AmazeeLabs/issues\",\"members_url\":\"https://api.github.com/orgs/AmazeeLabs/members{/member}\",\"public_members_url\":\"https://api.github.com/orgs/AmazeeLabs/public_members{/member}\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"description\":\"\"},\"sender\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false}}" + }, + "description": "" + }, + "response": [] + }, + { + "name": "github pull request reopened", + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "tests[\"Status code is 200\"] = responseCode.code === 200;" + ] + } + } + ], + "request": { + "url": "{{hostname}}", + "method": "POST", + "header": [ + { + "key": "User-Agent", + "value": "GitHub-Hookshot/eb03e36", + "description": "" + }, + { + "key": "X-GitHub-Event", + "value": "pull_request", + "description": "" + }, + { + "key": "X-GitHub-Delivery", + "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + "description": "" + }, + { + "key": "content-type", + "value": "application/json", + "description": "" + } + ], + "body": { + "mode": "raw", + "raw": "{\"action\":\"reopened\",\"number\":42,\"pull_request\":{\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42\",\"id\":97609773,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42\",\"diff_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42.diff\",\"patch_url\":\"https://github.com/AmazeeLabs/amazee_io/pull/42.patch\",\"issue_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42\",\"number\":42,\"state\":\"open\",\"locked\":false,\"title\":\"Release/lisa\",\"user\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false},\"body\":\"\",\"created_at\":\"2016-12-12T18:46:30Z\",\"updated_at\":\"2016-12-12T18:47:33Z\",\"closed_at\":null,\"merged_at\":null,\"merge_commit_sha\":\"00ff25673e5cba866871aa60f6f59b0ce985b401\",\"assignee\":null,\"assignees\":[],\"milestone\":null,\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/commits\",\"review_comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/comments\",\"review_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/comments{/number}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42/comments\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/0fc73f188aea939ada45acf65b75d49633483f40\",\"head\":{\"label\":\"AmazeeLabs:release/lisa\",\"ref\":\"release/lisa\",\"sha\":\"0fc73f188aea939ada45acf65b75d49633483f40\",\"user\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"repo\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\"}},\"base\":{\"label\":\"AmazeeLabs:prod\",\"ref\":\"prod\",\"sha\":\"c8d8b706ef87bc7bd022b11e3c24754cd56d0bc8\",\"user\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"repo\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\"}},\"_links\":{\"self\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42\"},\"html\":{\"href\":\"https://github.com/AmazeeLabs/amazee_io/pull/42\"},\"issue\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42\"},\"comments\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/42/comments\"},\"review_comments\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/comments\"},\"review_comment\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/comments{/number}\"},\"commits\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls/42/commits\"},\"statuses\":{\"href\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/0fc73f188aea939ada45acf65b75d49633483f40\"}},\"merged\":false,\"mergeable\":null,\"mergeable_state\":\"unknown\",\"merged_by\":null,\"comments\":0,\"review_comments\":0,\"commits\":3,\"additions\":3,\"deletions\":5,\"changed_files\":2},\"repository\":{\"id\":57102603,\"name\":\"amazee_io\",\"full_name\":\"AmazeeLabs/amazee_io\",\"owner\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/AmazeeLabs\",\"html_url\":\"https://github.com/AmazeeLabs\",\"followers_url\":\"https://api.github.com/users/AmazeeLabs/followers\",\"following_url\":\"https://api.github.com/users/AmazeeLabs/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/AmazeeLabs/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/AmazeeLabs/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/AmazeeLabs/subscriptions\",\"organizations_url\":\"https://api.github.com/users/AmazeeLabs/orgs\",\"repos_url\":\"https://api.github.com/users/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/users/AmazeeLabs/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/AmazeeLabs/received_events\",\"type\":\"Organization\",\"site_admin\":false},\"private\":true,\"html_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"description\":null,\"fork\":false,\"url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io\",\"forks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/forks\",\"keys_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}\",\"collaborators_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}\",\"teams_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/teams\",\"hooks_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks\",\"issue_events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}\",\"events_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/events\",\"assignees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}\",\"branches_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}\",\"tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/tags\",\"blobs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}\",\"git_tags_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}\",\"git_refs_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}\",\"trees_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}\",\"statuses_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}\",\"languages_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/languages\",\"stargazers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers\",\"contributors_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors\",\"subscribers_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers\",\"subscription_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription\",\"commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}\",\"git_commits_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}\",\"comments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}\",\"issue_comment_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}\",\"contents_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}\",\"compare_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}\",\"merges_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/merges\",\"archive_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}\",\"downloads_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads\",\"issues_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}\",\"pulls_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}\",\"milestones_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}\",\"notifications_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}\",\"labels_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}\",\"releases_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}\",\"deployments_url\":\"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments\",\"created_at\":\"2016-04-26T06:09:35Z\",\"updated_at\":\"2016-04-26T06:10:35Z\",\"pushed_at\":\"2016-12-12T18:46:31Z\",\"git_url\":\"git://github.com/AmazeeLabs/amazee_io.git\",\"ssh_url\":\"git@github.com:AmazeeLabs/amazee_io.git\",\"clone_url\":\"https://github.com/AmazeeLabs/amazee_io.git\",\"svn_url\":\"https://github.com/AmazeeLabs/amazee_io\",\"homepage\":null,\"size\":107136,\"stargazers_count\":0,\"watchers_count\":0,\"language\":\"PHP\",\"has_issues\":false,\"has_downloads\":false,\"has_wiki\":false,\"has_pages\":false,\"forks_count\":0,\"mirror_url\":null,\"open_issues_count\":3,\"forks\":0,\"open_issues\":3,\"watchers\":0,\"default_branch\":\"prod\"},\"organization\":{\"login\":\"AmazeeLabs\",\"id\":5390584,\"url\":\"https://api.github.com/orgs/AmazeeLabs\",\"repos_url\":\"https://api.github.com/orgs/AmazeeLabs/repos\",\"events_url\":\"https://api.github.com/orgs/AmazeeLabs/events\",\"hooks_url\":\"https://api.github.com/orgs/AmazeeLabs/hooks\",\"issues_url\":\"https://api.github.com/orgs/AmazeeLabs/issues\",\"members_url\":\"https://api.github.com/orgs/AmazeeLabs/members{/member}\",\"public_members_url\":\"https://api.github.com/orgs/AmazeeLabs/public_members{/member}\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5390584?v=3\",\"description\":\"\"},\"sender\":{\"login\":\"Schnitzel\",\"id\":750999,\"avatar_url\":\"https://avatars.githubusercontent.com/u/750999?v=3\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/Schnitzel\",\"html_url\":\"https://github.com/Schnitzel\",\"followers_url\":\"https://api.github.com/users/Schnitzel/followers\",\"following_url\":\"https://api.github.com/users/Schnitzel/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/Schnitzel/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/Schnitzel/subscriptions\",\"organizations_url\":\"https://api.github.com/users/Schnitzel/orgs\",\"repos_url\":\"https://api.github.com/users/Schnitzel/repos\",\"events_url\":\"https://api.github.com/users/Schnitzel/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/Schnitzel/received_events\",\"type\":\"User\",\"site_admin\":false}}" + }, + "description": "" + }, + "response": [] + } + ] + } + ] +} diff --git a/services/webhook-handler/newman/localhost.postman_environment.json b/services/webhook-handler/newman/localhost.postman_environment.json new file mode 100644 index 000000000..cb7b91d3a --- /dev/null +++ b/services/webhook-handler/newman/localhost.postman_environment.json @@ -0,0 +1,16 @@ +{ + "id": "8fddb776-3053-42d7-1872-5dacae876715", + "name": "Localhost", + "values": [ + { + "key": "hostname", + "value": "localhost:7777", + "type": "text", + "enabled": true, + "warning": "" + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2016-12-12T17:20:44.875Z", + "_postman_exported_using": "Postman/4.9.0" +} \ No newline at end of file diff --git a/services/webhook-handler/package.json b/services/webhook-handler/package.json new file mode 100644 index 000000000..41f7c3314 --- /dev/null +++ b/services/webhook-handler/package.json @@ -0,0 +1,52 @@ +{ + "name": "amazeeio-webhook-handler", + "version": "0.9.0", + "description": "amazeeio handler for webhooks", + "main": "index.js", + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "jest", + "test:watch": "jest --watch", + "start": "node build/index.js", + "build": "babel src -d build", + "dev": "nodemon src/index.js --exec babel-node", + "newman:all": "newman run ./newman/amazeeio-webhook-handler.postman_collection.json -e ./newman/localhost.postman_environment.json" + }, + "author": "Rod Vagg (http://r.va.gg)", + "repository": { + "type": "git", + "url": "https://github.com/rvagg/github-webhook-handler.git" + }, + "license": "MIT", + "dependencies": { + "@amazeeio/amazeeio-local-logging": "^0.1.3", + "@amazeeio/amazeeio-logs": "^0.1.11", + "amqp-connection-manager": "^1.3.5", + "amqplib": "^0.5.1", + "babel-cli": "^6.18.0", + "babel-core": "^6.21.0", + "babel-plugin-syntax-async-functions": "^6.13.0", + "babel-plugin-transform-flow-strip-types": "^6.21.0", + "babel-plugin-transform-object-rest-spread": "^6.20.2", + "babel-plugin-transform-regenerator": "^6.21.0", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.18.0", + "bl": "~1.1.2", + "body-parser": "^1.17.1", + "buffer-equal-constant-time": "~1.0.1", + "newman": "^3.3.0", + "nodemon": "^1.11.0", + "uuid4": "^1.0.0", + "winston": "^2.2.0" + }, + "devDependencies": { + "flow-bin": "^0.37.4", + "jest": "^18.1.0" + }, + "jest": { + "rootDir": "src", + "testEnvironment": "node" + } +} diff --git a/services/webhook-handler/src/__tests__/extractWebhookData-test.js b/services/webhook-handler/src/__tests__/extractWebhookData-test.js new file mode 100644 index 000000000..f02a70ad8 --- /dev/null +++ b/services/webhook-handler/src/__tests__/extractWebhookData-test.js @@ -0,0 +1,207 @@ +// @flow + +import extractWebhookData from '../extractWebhookData'; + +// prevent uuid side-effects +jest.mock('uuid4', () => { + return () => 'uuid'; +}); + +it('should return github related webhook data', () => { + const req = { + method: 'POST', + headers: { + 'x-github-event': 'gh', + 'x-github-delivery': '123', + }, + url: 'url', + }; + + const result = extractWebhookData(req, ''); + + expect(result).toEqual({ + webhooktype: 'github', + event: 'gh', + uuid: '123', + parameters: {}, + url: 'url', + body: {}, + }); +}); + +it('should return gitlab related webhook data', () => { + const req = { + method: 'POST', + headers: { + 'x-gitlab-event': 'gl', + 'x-gitlab-delivery': '123', + }, + url: 'url', + }; + + const result = extractWebhookData(req); + + expect(result).toEqual({ + webhooktype: 'gitlab', + event: 'gl', + parameters: {}, + url: 'url', + body: {}, + }); +}); + +it('should return bitbucket related webhook data', () => { + const req = { + method: 'POST', + headers: { + 'x-event-key': 'bb', + }, + url: 'url', + }; + + const result = extractWebhookData(req); + + expect(result).toEqual({ + webhooktype: 'bitbucket', + event: 'bb', + parameters: {}, + url: 'url', + body: {}, + }); +}); + +it('should throw an error on missing webhook header data', () => { + const req = { + method: 'POST', + headers: {}, + url: 'url' + }; + + expect(() => extractWebhookData(req)).toThrow('No supported event header found on POST request'); +}); + +it('should parse body on POST', () => { + const req = { + method: 'POST', + headers: { + 'x-github-event': 'gh', + 'x-github-delivery': '123', + }, + url: 'url', + }; + + const body = '{ "content": true }'; + + const result = extractWebhookData(req, body); + + expect(result).toEqual({ + webhooktype: 'github', + event: 'gh', + uuid: '123', + parameters: {}, + body: { content: true }, + url: 'url', + }); +}); + +it('should throw on invalid POST body', () => { + const req = { + method: 'POST', + headers: { + 'x-github-event': 'gh', + 'x-github-delivery': '123', + }, + url: 'url', + }; + + const body = 'non-json'; + expect(() => extractWebhookData(req, body)).toThrow('request body is not parsable as JSON'); +}); + +it('should return custom webhook data on GET (with x-sha)', () => { + const req = { + method: 'GET', + headers: {}, + url: 'url?url=utest&branch=btest&sha=stest', + }; + + const result = extractWebhookData(req); + + expect(result).toEqual({ + webhooktype: 'custom', + event: 'push', + uuid: 'uuid', + parameters: { + url: 'utest', + branch: 'btest', + sha: 'stest', + }, + url: 'url?url=utest&branch=btest&sha=stest', + }); +}); + +it('should return custom webhook data on GET (without x-sha)', () => { + const req = { + method: 'GET', + headers: {}, + url: 'url?url=utest&branch=btest', + }; + + const result = extractWebhookData(req); + + expect(result).toEqual({ + webhooktype: 'custom', + event: 'push', + uuid: 'uuid', + parameters: { + url: 'utest', + branch: 'btest', + sha: 'btest', + }, + url: 'url?url=utest&branch=btest', + }); +}); + +it('should throw on missing url / branch query param on GET', () => { + const req1 = { + method: 'GET', + headers: {}, + url: 'url?branch=btest', + }; + + const req2 = { + method: 'GET', + headers: {}, + url: 'url?url=utest', + }; + + expect(() => extractWebhookData(req1)).toThrowError('Query param \'url\' not found!'); + expect(() => extractWebhookData(req2)).toThrowError('Query param \'branch\' not found!'); +}); + +it('should throw on empty url / branch query parameter on GET', () => { + const req1 = { + method: 'GET', + headers: {}, + url: 'url?url=&branch=test', + }; + + const req2 = { + method: 'GET', + headers: {}, + url: 'url?url=test&branch=', + }; + + expect(() => extractWebhookData(req1)).toThrowError('Query param \'url\' is empty!'); + expect(() => extractWebhookData(req2)).toThrowError('Query param \'branch\' is empty!'); +}); + +it('should throw on unknown http method', async () => { + const req = { + method: 'PUT', + headers: {}, + url: 'url', + }; + + expect(() => extractWebhookData(req)).toThrow('Unsupported request method: PUT'); +}); diff --git a/services/webhook-handler/src/createReqHandler.js b/services/webhook-handler/src/createReqHandler.js new file mode 100644 index 000000000..0aa8921b6 --- /dev/null +++ b/services/webhook-handler/src/createReqHandler.js @@ -0,0 +1,99 @@ +// @flow + +import bl from 'bl'; +import bufferEq from 'buffer-equal-constant-time'; +import extractWebhookData from './extractWebhookData'; + +import sendToAmazeeioWebhooks from './sendToAmazeeioWebhooks'; +import { sendToAmazeeioLogs, initSendToAmazeeioLogs } from '@amazeeio/amazeeio-logs'; + +import type { Logger } from '@amazeeio/amazeeio-local-logging'; + +import type { ChannelWrapper } from './types'; + +initSendToAmazeeioLogs(); + +type Req = http$IncomingMessage; +type Res = http$ServerResponse; + +type Cb = () => void; + +type Options = { + path: string, + channelWrapper: ChannelWrapper, +}; + +type Handler = (req: Req, res: Res, logger: Logger, cb: Cb) => void; + +export default function createReqHandler(options: Options): Handler { + const { + path, + channelWrapper, + } = options; + + /** + * Parses given request for webhook related data and will forward + * it to given EventEmitter for further computation + */ + function handler (req, res, logger, cb) { + if (req.url.split('?').shift() !== path) { + return cb(); + } + + const endWithError = (msg) => { + res.writeHead(400, { 'content-type': 'application/json' }); + res.end(JSON.stringify({ error: msg })); + + logger.error('Error:', msg); + }; + + req.pipe(bl((err, data) => { + if (err) { + return endWithError(err.message); + } + + try { + const { method } = req; + + const webhookData = extractWebhookData(req, data.toString()); + + const { + webhooktype, + event, + giturl, + uuid, + body, + } = webhookData; + + const meta = { + webhooktype: webhooktype, + event: event, + giturl: giturl, + rawbody: data.toString(), + } + + logger.debug("RAW Request data", { + event: 'raw-request-data', + uuid, + data: data.toString(), + }); + + sendToAmazeeioLogs('info', "", uuid, "webhooks:receive", meta, + `Received new ${webhooktype} webhook, event: ${event}, giturl: ${giturl}` + ) + + sendToAmazeeioWebhooks(webhookData, channelWrapper); + + res.writeHead(200, { 'content-type': 'application/json' }); + + const responseData = JSON.stringify({ data: webhookData }, null, 2) + res.end(responseData); + } + catch(e) { + return endWithError(e.message); + } + })) + } + + return handler; +} diff --git a/services/webhook-handler/src/extractWebhookData.js b/services/webhook-handler/src/extractWebhookData.js new file mode 100644 index 000000000..a50dbbac6 --- /dev/null +++ b/services/webhook-handler/src/extractWebhookData.js @@ -0,0 +1,107 @@ +// @flow + +import uuid4 from 'uuid4'; +import url from 'url'; + +import type { WebhookRequestData } from './types'; + +type Req = { + method: string, + url: string, + headers: {[key: string]: string }, +}; + +/** + * This function will check request headers for + * service specific data like github / gitlab / etc. + * if the request method is POST. + * + * Will eventually generate 'custom' webhook data on + * GET requests. + * + * Will throw an error on malformed request headers, + * non-json body data or unsupported method. + */ +export default function extractWebhookData(req: Req, body?: string): WebhookRequestData { + const { + method, + headers, + } = req; + + const parameters = {}; + let webhooktype; + let event; + let uuid; + let bodyObj; + let giturl; + + if (method === 'POST') { + + try { + bodyObj = (body == null || body === '') ? {} : JSON.parse(body); + } catch(e) { + throw new Error(`request body is not parsable as JSON: ${e}`); + } + + if ('x-github-event' in req.headers) { + webhooktype = 'github' + event = req.headers['x-github-event'] + uuid = req.headers['x-github-delivery'] + giturl = bodyObj.repository.ssh_url + } else if ('x-gitlab-event' in req.headers) { + webhooktype = 'gitlab' + event = req.headers['x-gitlab-event'] + } else if ('x-event-key' in req.headers) { + webhooktype = 'bitbucket' + event = req.headers['x-event-key'] + } else { + throw new Error('No supported event header found on POST request') + } + + + } else if (method === 'GET') { + try { + webhooktype = 'custom'; + event = 'push'; + uuid = uuid4(); + + const parsedUrl = url.parse(req.url, true); // true to get query as object + const { query = {} } = parsedUrl; + + const getParam = (name: string): string => { + const value = query[name]; + if (value == null) { + throw new Error(`Query param '${name}' not found!`); + } + if (value === '') { + throw new Error(`Query param '${name}' is empty!`); + } + return value; + }; + + parameters.url = getParam('url'); + parameters.branch = getParam('branch'); + parameters.sha = getParam('sha') || ''; + bodyObj = parameters; + } catch (e) { + throw new Error(`Error in handling GET request: ${e.message}`); + } + } + else { + throw new Error(`Unsupported request method: ${method}`); + } + + const ret: WebhookRequestData = { + webhooktype: webhooktype, + event: event, + giturl: giturl, + body: bodyObj, + }; + + if (uuid != null) { + ret.uuid = uuid; + } + + + return ret; +} diff --git a/services/webhook-handler/src/index.js b/services/webhook-handler/src/index.js new file mode 100644 index 000000000..0acd997b1 --- /dev/null +++ b/services/webhook-handler/src/index.js @@ -0,0 +1,50 @@ +// @flow + +require("babel-polyfill"); + +import http from 'http'; +import events from 'events'; + +import amqp from 'amqp-connection-manager'; + +import { logger, initLogger } from '@amazeeio/amazeeio-local-logging'; +import createReqHandler from './createReqHandler'; + +import type { ChannelWrapper } from './types'; + +// Initialize the logging mechanism +initLogger(); + +const rabbitmqhost = process.env.RABBITMQ_HOST || "localhost" +const port = process.env.PORT || 3000 +const connection = amqp.connect([`amqp://${rabbitmqhost}`], { json: true }); + +connection.on('connect', ({ url }) => logger.verbose('Connected to %s', url, { action: 'connected', url })); +connection.on('disconnect', params => logger.error('Not connected, error: %s', params.err.code, { action: 'disconnected', reason: params })); + +// Cast any to ChannelWrapper to get type-safetiness through our own code +const channelWrapper: ChannelWrapper = connection.createChannel({ + setup: channel => { + return Promise.all([ + channel.assertQueue('amazeeio-webhooks', {durable: true}), + ]); + } +}); + +const handler = createReqHandler({ path: '/', channelWrapper }); + +http.createServer((req, res) => { + const { method, url, headers } = req; + + logger.verbose('New %s request to %s', method, url, { + action: 'new-request', + method, + url, + headers, + }); + + handler(req, res, logger, (err) => { + res.statusCode = 404 + res.end('no such location') + }); +}).listen(port); diff --git a/services/webhook-handler/src/sendToAmazeeioWebhooks.js b/services/webhook-handler/src/sendToAmazeeioWebhooks.js new file mode 100644 index 000000000..562ef3b9c --- /dev/null +++ b/services/webhook-handler/src/sendToAmazeeioWebhooks.js @@ -0,0 +1,38 @@ +// @flow + +import { logger } from '@amazeeio/amazeeio-local-logging'; + +import type { WebhookRequestData } from './types'; + +export type ChannelWrapper = { + sendToQueue: (evt: string, data: Buffer, opts: Object) => void, +} + +export default async function sendToAmazeeioWebhooks (args: WebhookRequestData, channelWrapper: ChannelWrapper): Promise { + const { + webhooktype, + event, + giturl, + uuid, + body, + } = args; + + try { + const buffer = new Buffer(JSON.stringify(args)); + await channelWrapper.sendToQueue(`amazeeio-webhooks`, buffer, { persistent: true }); + + logger.verbose(`Success send to amazeeio-webhooks ${webhooktype}:${event}`, { + webhooktype, + event, + uuid, + }); + } catch(error) { + logger.error(`Error queuing amazeeio-webhooks ${webhooktype}:${event}`, { + webhooktype, + event, + uuid, + body, + error, + }); + } +} diff --git a/services/webhook-handler/src/types.js b/services/webhook-handler/src/types.js new file mode 100644 index 000000000..306f542b7 --- /dev/null +++ b/services/webhook-handler/src/types.js @@ -0,0 +1,89 @@ +// @flow + +/** + * Webhook related types for incoming Events + */ + +export type WebhookRequestData = { + webhooktype: string, + event: string, + giturl: any, + uuid?: string, + body?: Object, +}; + +export type ChannelWrapper = { + sendToQueue: (evt: string, data: Buffer, opts: Object) => void, +} + +export type GithubPushEvent = { + event: 'push', + webhooktype: 'github', + uuid: string, + body: { + repository: { + ssh_url: string, + }, + ref: string, + after: string, + }, +}; + +export type GithubPullRequestEvent = { + event: 'pull_request', + webhooktype: 'github', + uuid: string, + body: { + action: string, + repository: { + ssh_url: string, + }, + number: number, + } +}; + +export type GithubDeleteEvent = { + event: 'delete', + webhooktype: 'github', + uuid: string, + body: { + ref_type: string, + repository: { + ssh_url: string, + ref_type: string, + } + } +}; + +export type CustomPushEvent = { + event: 'push', + webhooktype: 'custom', + uuid: string, + parameters: { + url: string, + branch: string, + sha: string, + }, +}; + +/** + * Payload related types for RabbitMQ + */ + +export type PayloadData = { + giturl: string, + branch?: string, + sha?: string, +}; + +// Plain event data, which will also be sent to RabbitMQ +export type RawData = + GithubPushEvent + | GithubPullRequestEvent + | GithubDeleteEvent + | CustomPushEvent; + +// A payload we want to send to RabbitMQ +export type Payload = PayloadData & { + raw: RawData, // the original input we received from the webhook +}; diff --git a/services/webhook-handler/yarn.lock b/services/webhook-handler/yarn.lock new file mode 100644 index 000000000..992de6152 --- /dev/null +++ b/services/webhook-handler/yarn.lock @@ -0,0 +1,3595 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@amazeeio/amazeeio-local-logging@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-local-logging/-/amazeeio-local-logging-0.1.3.tgz#a7b83f4c95e3723ff5baafa01a2c376b9054410c" + dependencies: + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +"@amazeeio/amazeeio-logs@^0.1.11": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-logs/-/amazeeio-logs-0.1.11.tgz#36ff8db6e9f1f83f65ad1906f338b4363d43d854" + dependencies: + amqp-connection-manager "^1.3.5" + amqplib "^0.5.1" + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn@^4.0.4: + version "4.0.11" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" + +ajv@^4.9.1: + version "4.11.7" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +amqp-connection-manager@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/amqp-connection-manager/-/amqp-connection-manager-1.3.5.tgz#4b4725fe96485ca0ad2aca8790e6d38800776449" + dependencies: + es6-promise "^3.0.2" + lodash "^4.15.0" + promise-breaker "^3.0.0" + when "^3.7.3" + +amqplib@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.1.tgz#7cccfebabe56c2e984ea7a2243f7cefe6fbfc6cf" + dependencies: + bitsyntax "~0.0.4" + bluebird "^3.4.6" + buffer-more-ints "0.0.2" + readable-stream "1.x >=1.1.9" + +ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@1.0.9, argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@2.1.5, async@^2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" + dependencies: + lodash "^4.14.0" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@1.6.0, aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-cli@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" + dependencies: + babel-core "^6.24.1" + babel-polyfill "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.0.0, babel-core@^6.21.0, babel-core@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.18.0, babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^3.0.0" + babel-preset-jest "^18.0.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz#11d5abde18425ec24b5d648c7e0b5d25cd354a22" + dependencies: + find-up "^1.1.2" + istanbul-lib-instrument "^1.4.2" + object-assign "^4.1.0" + test-exclude "^3.3.0" + +babel-plugin-jest-hoist@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" + +babel-plugin-syntax-async-functions@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-flow-strip-types@^6.21.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.20.2: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.21.0, babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.18.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" + dependencies: + babel-plugin-jest-hoist "^18.0.0" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0, babel-template@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.18.0, babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +bitsyntax@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82" + dependencies: + buffer-more-ints "0.0.2" + +bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + dependencies: + readable-stream "~2.0.5" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.4.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +body-parser@^1.17.1: + version "1.17.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c66993fa47" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.1" + depd "~1.1.0" + http-errors "~1.6.1" + iconv-lite "0.4.15" + on-finished "~2.3.0" + qs "6.4.0" + raw-body "~2.2.0" + type-is "~1.6.14" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +btoa@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.1.2.tgz#3e40b81663f81d2dd6596a4cb714a8dc16cfabe0" + +buffer-equal-constant-time@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + +buffer-more-ints@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +charset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/charset/-/charset-1.0.0.tgz#19327217c249c912e964efbd47f56cc254c348d9" + +chokidar@^1.4.3, chokidar@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +circular-json@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +cli-progress@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-1.3.0.tgz#3efacd6b99e2087400c9b0ac4048ce232b3dedb2" + +cli-table2@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" + dependencies: + lodash "^3.10.1" + string-width "^1.0.1" + optionalDependencies: + colors "^1.1.2" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" + dependencies: + marked "^0.3.6" + marked-terminal "^1.6.2" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@1.0.3, colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@1.1.2, colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-js@3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.6.tgz#6142651b232dbb8ebdfa9716a70a2888359da6c9" + +crypto-js@3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.8.tgz#715f070bf6014f2ae992a98b3929258b713f08d5" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +csv-parse@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-1.1.12.tgz#0d3965dd1e151bd0aa214bc6f0b4e04c506bbaf3" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +dbug@~0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/dbug/-/dbug-0.4.2.tgz#32b4b3105e8861043a6f9ac755d80e542d365b31" + +debug@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" + dependencies: + ms "0.7.2" + +debug@^2.1.1, debug@^2.2.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0" + dependencies: + ms "0.7.3" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + +domutils@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +escape-html@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +eventemitter3@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.2.tgz#20ce4891909ce9f35b088c94fab40e2c96f473ac" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^1.8.0, fb-watchman@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" + dependencies: + bser "1.0.2" + +file-type@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.1.0.tgz#690b70293715d7fd39697e38f7a108ebab2551b9" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +filesize@3.5.6: + version "3.5.6" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.6.tgz#5fd98f3eac94ec9516ef8ed5782fad84a01a0a1a" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-up@^1.0.0, find-up@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flow-bin@^0.37.4: + version "0.37.4" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.37.4.tgz#3d8da2ef746e80e730d166e09040f4198969b76b" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + +got@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" + dependencies: + duplexify "^3.2.0" + infinity-agent "^2.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + nested-error-stacks "^1.0.0" + object-assign "^3.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@4.0.6, handlebars@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +htmlparser2@^3.9.0: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-reasons@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/http-reasons/-/http-reasons-0.1.0.tgz#a953ca670078669dde142ce899401b9d6e85d3b4" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +infinity-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +intel@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/intel/-/intel-1.0.2.tgz#12318e1138939df6a99396338328395f8bf919cb" + dependencies: + chalk "~1.1.0" + dbug "~0.4.2" + stack-trace "~0.0.9" + strftime "~0.9.2" + symbol "~0.2.0" + utcstring "~0.1.0" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0, is-finite@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-stream@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.0-alpha.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.7.tgz#f6f37f09f8002b130f891c646b70ee4a8e7345ae" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.2" + istanbul-lib-hook "^1.0.5" + istanbul-lib-instrument "^1.7.0" + istanbul-lib-report "^1.0.0" + istanbul-lib-source-maps "^1.1.1" + istanbul-reports "^1.0.2" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1" + +istanbul-lib-hook@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.0.2" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c" + dependencies: + istanbul-lib-coverage "^1.0.2" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" + +jest-cli@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^17.0.2" + jest-config "^18.1.0" + jest-environment-jsdom "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-resolve-dependencies "^18.1.0" + jest-runtime "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + node-notifier "^4.6.1" + sane "~1.4.1" + strip-ansi "^3.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^18.1.0" + jest-environment-node "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" + +jest-environment-jsdom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + jsdom "^9.9.1" + +jest-environment-node@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-haste-map@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.4.1" + worker-farm "^1.3.1" + +jest-jasmine2@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^18.1.0" + jest-matchers "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" + dependencies: + chalk "^1.1.3" + pretty-format "^18.1.0" + +jest-matchers@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" + dependencies: + jest-diff "^18.1.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + pretty-format "^18.1.0" + +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" + +jest-resolve-dependencies@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" + dependencies: + jest-file-exists "^17.0.0" + jest-resolve "^18.1.0" + +jest-resolve@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" + dependencies: + browser-resolve "^1.11.2" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + resolve "^1.2.0" + +jest-runtime@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" + dependencies: + babel-core "^6.0.0" + babel-jest "^18.0.0" + babel-plugin-istanbul "^3.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + micromatch "^2.3.11" + yargs "^6.3.0" + +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" + dependencies: + jest-diff "^18.1.0" + jest-file-exists "^17.0.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + natural-compare "^1.4.0" + pretty-format "^18.1.0" + +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^18.0.0" + mkdirp "^0.5.1" + +jest@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" + dependencies: + jest-cli "^18.1.0" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@^3.7.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^9.9.1: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +latest-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" + dependencies: + package-json "^1.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +liquid-json@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/liquid-json/-/liquid-json-0.3.1.tgz#9155a18136d8a6b2615e5f16f9a2448ab6b50eea" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash3@3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash3/-/lodash3-3.10.1.tgz#74cd1aa585faf42bfea3008457d997685e74bd62" + +lodash@3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.0.tgz#93d51c672828a4416a12af57220ba8a8737e2fbb" + +lodash@4.17.2: + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" + +lodash@4.17.4, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.2.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" + dependencies: + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" + +marked@0.3.6, marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.26.0: + version "1.26.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-format@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mime-format/-/mime-format-2.0.0.tgz#e29f8891e284d78270246f0050d6834bdbbe1332" + dependencies: + charset "^1.0.0" + +mime-types@2.1.14: + version "2.1.14" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" + dependencies: + mime-db "~1.26.0" + +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" + +nan@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +nested-error-stacks@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +newman@^3.3.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/newman/-/newman-3.5.2.tgz#f198d13be0a49a47485a59014688db2aee8133c0" + dependencies: + argparse "1.0.9" + async "2.1.5" + cli-progress "1.3.0" + cli-table2 "0.2.0" + colors "1.1.2" + csv-parse "1.1.12" + eventemitter3 "2.0.2" + filesize "3.5.6" + handlebars "4.0.6" + lodash "4.17.2" + mkdirp "0.5.1" + parse-json "2.2.0" + postman-collection "1.0.1" + postman-collection-transformer "2.0.10" + postman-request "2.80.1-postman.1" + postman-runtime "5.0.0" + pretty-ms "2.1.0" + semver "5.3.0" + serialised-error "1.1.2" + shelljs "0.7.7" + word-wrap "1.1.0" + xmlbuilder "8.2.2" + +node-emoji@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" + dependencies: + string.prototype.codepointat "^0.2.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" + dependencies: + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" + +node-oauth1@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/node-oauth1/-/node-oauth1-1.2.1.tgz#4d5cb8439dec8f01af066448a92bf54129bf182a" + dependencies: + crypto-js "3.1.6" + +node-pre-gyp@^0.6.29: + version "0.6.34" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-uuid@^1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + +nodemon@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" + dependencies: + chokidar "^1.4.3" + debug "^2.2.0" + es6-promise "^3.0.2" + ignore-by-default "^1.0.0" + lodash.defaults "^3.1.2" + minimatch "^3.0.0" + ps-tree "^1.0.1" + touch "1.0.0" + undefsafe "0.0.3" + update-notifier "0.5.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npmlog@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-hash@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.1.8.tgz#28a659cf987d96a4dabe7860289f3b5326c4a03c" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + dependencies: + got "^3.2.0" + registry-url "^3.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@2.2.0, parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +plur@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" + +postman-collection-transformer@2.0.10: + version "2.0.10" + resolved "https://registry.yarnpkg.com/postman-collection-transformer/-/postman-collection-transformer-2.0.10.tgz#8c99fefff1370062a38f54aae4350a844eb49ee0" + dependencies: + commander "2.8.1" + intel "1.0.2" + lodash "3.10.0" + semver "5.1.0" + strip-json-comments "1.0.2" + +postman-collection@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postman-collection/-/postman-collection-1.0.1.tgz#6c0d36ca86bf7b2cc67d643d26e0a30677abc60f" + dependencies: + atob "2.0.3" + aws4 "1.6.0" + btoa "1.1.2" + crypto-js "3.1.8" + escape-html "1.0.3" + file-type "4.1.0" + hawk "3.1.3" + http-reasons "0.1.0" + iconv-lite "0.4.15" + liquid-json "0.3.1" + lodash "4.17.2" + marked "0.3.6" + mime-format "2.0.0" + mime-types "2.1.14" + node-oauth1 "1.2.1" + sanitize-html "1.14.1" + semver "5.3.0" + uuid "3.0.1" + +postman-request@2.80.1-postman.1: + version "2.80.1-postman.1" + resolved "https://registry.yarnpkg.com/postman-request/-/postman-request-2.80.1-postman.1.tgz#2979085985bf0e83a55bc71a6dba6352e388a7ec" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + postman-url-encoder "^1.0.0" + qs "~6.3.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +postman-runtime@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postman-runtime/-/postman-runtime-5.0.0.tgz#da94753cc798ec05f0da5d7448da89cf21e36e77" + dependencies: + async "2.1.5" + http-reasons "0.1.0" + lodash "4.17.4" + lodash3 "3.10.1" + postman-collection "1.0.1" + postman-request "2.80.1-postman.1" + postman-sandbox "1.0.2" + resolve-from "2.0.0" + serialised-error "1.1.2" + uuid "3.0.1" + +postman-sandbox@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/postman-sandbox/-/postman-sandbox-1.0.2.tgz#a7b799dd72bb03380ca06b1050ea8781d50ec0e3" + dependencies: + inherits "2.0.3" + lodash "4.17.2" + uuid "3.0.1" + uvm "1.4.0" + +postman-url-encoder@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postman-url-encoder/-/postman-url-encoder-1.0.1.tgz#a094a42e9415ff0bbfdce0eaa8e6011d449ee83c" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" + +pretty-ms@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" + dependencies: + is-finite "^1.0.1" + parse-ms "^1.0.0" + plur "^1.0.0" + +private@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +promise-breaker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-3.0.0.tgz#bed499d1a9c35944950462baf47246fc11f19d9f" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +ps-tree@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@6.4.0, qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1.x >=1.1.9": + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readable-stream@^2.0.2, readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexp-quote@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/regexp-quote/-/regexp-quote-0.0.0.tgz#1e0f4650c862dcbfed54fd42b148e9bb1721fcf2" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-url@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.79.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +resolve-from@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6, resolve@^1.2.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sanitize-html@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.14.1.tgz#730ffa2249bdf18333effe45b286173c9c5ad0b8" + dependencies: + htmlparser2 "^3.9.0" + regexp-quote "0.0.0" + xtend "^4.0.0" + +sax@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@5.3.0, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.0.tgz#85f2cf8550465c4df000cf7d86f6b054106ab9e5" + +serialised-error@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/serialised-error/-/serialised-error-1.1.2.tgz#b5c3822196f873feb0c76587e1d6dfa6790ade97" + dependencies: + node-uuid "^1.4.7" + object-hash "^1.1.2" + stack-trace "0.0.9" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +shelljs@0.7.7: + version "0.7.7" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.14" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" + dependencies: + source-map "^0.5.6" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.9, stack-trace@0.0.x, stack-trace@~0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + +"statuses@>= 1.3.1 < 2": + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +strftime@~0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/strftime/-/strftime-0.9.2.tgz#bcca2861f29456d372aaf6a17811c8bc6f39f583" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string.prototype.codepointat@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" + dependencies: + buffer-shims "~1.0.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-json-comments@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.2.tgz#5a48ab96023dbac1b7b8d0ffabf6f63f1677be9f" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +symbol@~0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/symbol/-/symbol-0.2.3.tgz#3b9873b8a901e47c6efe21526a3ac372ef28bbc7" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +throat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +touch@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.14: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +uglify-js@^2.6: + version "2.8.22" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +update-notifier@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" + dependencies: + chalk "^1.0.0" + configstore "^1.0.0" + is-npm "^1.0.0" + latest-version "^1.0.0" + repeating "^1.1.2" + semver-diff "^2.0.0" + string-length "^1.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +utcstring@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/utcstring/-/utcstring-0.1.0.tgz#430fd510ab7fc95b5d5910c902d79880c208436b" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid4@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/uuid4/-/uuid4-1.0.0.tgz#813aaeaf11ea2f68909c5ad57d894f83202d6720" + +uuid@3.0.1, uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uvm@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/uvm/-/uvm-1.4.0.tgz#2fa9ff0c841cf2279f96059e4b204195818b96de" + dependencies: + circular-json "0.3.1" + inherits "2.0.3" + lodash "4.17.2" + uuid "3.0.1" + +v8flags@^2.0.10: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-url@^4.3.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.0.tgz#202035ac1955b087cdd20fa8b58ded3ab1cd2af5" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +when@^3.7.3: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.0.5, which@^1.1.1: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +word-wrap@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.1.0.tgz#356153d61d10610d600785c5d701288e0ae764a6" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.3.tgz#831dd22d491bdc135180bb996a0eb3f8bf587791" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +xmlbuilder@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs@^6.3.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/services/webhooks2tasks/.amazeeio.app.yml b/services/webhooks2tasks/.amazeeio.app.yml new file mode 100644 index 000000000..50e273e8a --- /dev/null +++ b/services/webhooks2tasks/.amazeeio.app.yml @@ -0,0 +1,62 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: amazeeio-openshift-template +parameters: + - name: TAG + description: Which docker image tag should be deployed + required: true + - name: NAME + description: Name of the objects to create + required: true + - name: SHORT_NAME + description: Shorter name of the objects to create, can be max 24 chars + required: true + - name: SITEGROUP + description: Which sitegroup this belongs to + required: true + - name: ROUTER_URL + description: URL of the Router + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${NAME} + name: ${NAME} + spec: + replicas: 1 + selector: + app: ${NAME} + deploymentconfig: ${NAME} + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${NAME} + deploymentconfig: ${NAME} + spec: + containers: + - image: ' ' + name: node + resources: + requests: + cpu: 100m + memory: 100Mi + test: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - node + from: + kind: ImageStreamTag + name: ${SITEGROUP}:${TAG} + type: ImageChange + status: {} \ No newline at end of file diff --git a/services/webhooks2tasks/.babelrc b/services/webhooks2tasks/.babelrc new file mode 100644 index 000000000..bb092de4b --- /dev/null +++ b/services/webhooks2tasks/.babelrc @@ -0,0 +1,9 @@ +{ + "presets": ["es2015"], + "plugins": [ + "transform-flow-strip-types", + "transform-regenerator", + "syntax-async-functions", + "transform-object-rest-spread" + ] +} diff --git a/services/webhooks2tasks/.dockerignore b/services/webhooks2tasks/.dockerignore new file mode 100644 index 000000000..06ef0ae48 --- /dev/null +++ b/services/webhooks2tasks/.dockerignore @@ -0,0 +1,5 @@ +.openshift/* +.cache/* +node_modules/* +Jenkinsfile +.dockerignore \ No newline at end of file diff --git a/services/webhooks2tasks/.flowconfig b/services/webhooks2tasks/.flowconfig new file mode 100644 index 000000000..4a58bdcde --- /dev/null +++ b/services/webhooks2tasks/.flowconfig @@ -0,0 +1,7 @@ +[ignore] + +[include] + +[libs] + +[options] diff --git a/services/webhooks2tasks/.gitignore b/services/webhooks2tasks/.gitignore new file mode 100644 index 000000000..dd87e2d73 --- /dev/null +++ b/services/webhooks2tasks/.gitignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/webhooks2tasks/.openshift/.kubeconfig b/services/webhooks2tasks/.openshift/.kubeconfig new file mode 100644 index 000000000..a79c97f77 --- /dev/null +++ b/services/webhooks2tasks/.openshift/.kubeconfig @@ -0,0 +1,17 @@ +apiVersion: v1 +clusters: +- cluster: + server: https://console.appuio.ch:443 + name: appuio +contexts: +- context: + cluster: appuio + user: system:serviceaccount:amze-amazeeio:jenkins + name: appuio:amze-amazeeio:jenkins +current-context: appuio:amze-amazeeio:jenkins +kind: Config +preferences: {} +users: +- name: system:serviceaccount:amze-amazeeio:jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg diff --git a/services/webhooks2tasks/.openshift/README.md b/services/webhooks2tasks/.openshift/README.md new file mode 100644 index 000000000..6a67200e6 --- /dev/null +++ b/services/webhooks2tasks/.openshift/README.md @@ -0,0 +1,53 @@ +# OpenShift + +## Jenkins Access to Openshift + +In order for Jenkins to deploy to openshift we need to create an openshift serviceaccount that has access to our project (regular username/password logins expire after a couple of hours, not very good for a CI/CD system) + +1. Login as your user + + oc login + +2. Create new serviceaccount with the name jenkins + + oc create serviceaccount jenkins + +3. Give this serviceaccount edit access (see the name of the serviceaccount contains the project name!) + + oc policy add-role-to-user edit system:serviceaccount:appuio-demo2:jenkins2 + +4. Get access token from serviceaccount, with first getting the name of the token and then accessing the secret + + oc describe serviceaccount jenkins2 + + oc describe secret jenkins2-token-7tawv + +5. Add the token inside the .kubeconfig: + + + apiVersion: v1 + clusters: + - cluster: + server: https://console.appuio.ch:443 + name: appuio + contexts: + - context: + cluster: appuio + user: jenkins + name: appuio:jenkins + current-context: appuio:jenkins + kind: Config + preferences: {} + users: + - name: jenkins + user: + token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLXJhcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJqZW5raW5zLXRva2VuLTFocW42Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImplbmtpbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZmM4ZTIzMi05ZDBhLTExZTYtYTdlZi1mYTE2M2VkOTVkYWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YW16ZS1yYXM6amVua2lucyJ9.BAeU6zXl0uPCD2DRGJeV1oxRbk3sA3M5tn7K6xPh5iv-etS8Q2lsF-OFwO7HVycvEckXh31KNUmQTzvn3keSDT0a8BqViBhGPKCfAw-vf3ElUnGFDCWN9IpITKJBWIxVdGyd5sPltBWkAVxl9JOwnu1vrBvSioYqwjzYkjStbfp7pzLXhSld9G4AXA_zBntDW633mujllT0z_5IMSJX_gKSZcrTN78KLdCMmuvIT_m7xZMp_r52daEu67DjsjYtVqVx4BsDVPdUZRQ9eJtodbtZ-FJV9w0W4H9nX3iyqCk7OriD4Xt68Z5cUK0tR-4hyyh_hL31c6vzGb_VosmAWWg + + +6. Test the kubeconfig - should return `system:serviceaccount:appuio-demo2:jenkins2` + + KUBECONFIG=.openshift/.kubeconfig oc whoami + +7. Create a Docker authentication config.json so Jenkins can push into the Openshift docker Registry + + DOCKER_CONFIG=.openshift/ docker login -u jenkins2 -p $(KUBECONFIG=.openshift/.kubeconfig oc whoami -t) registry.appuio.ch \ No newline at end of file diff --git a/services/webhooks2tasks/.openshift/config.json b/services/webhooks2tasks/.openshift/config.json new file mode 100644 index 000000000..a526a5d46 --- /dev/null +++ b/services/webhooks2tasks/.openshift/config.json @@ -0,0 +1,7 @@ +{ + "auths": { + "registry.appuio.ch": { + "auth": "amVua2luczI6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUpoYlhwbExXRnRZWHBsWldsdklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkltcGxibXRwYm5NdGRHOXJaVzR0TjJGcU5tOGlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lhbVZ1YTJsdWN5SXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqRmlOelZoWXpkakxXTTJOV010TVRGbE5pMWlOelUxTFdaaE1UWXpaVE5sWXpjellTSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBoYlhwbExXRnRZWHBsWldsdk9tcGxibXRwYm5NaWZRLkRUSlpDd3BFWFlnenlaSmtDZHF6a0dHc0hWQWhNc0J0OGFtcmkydGZQYl9mOTZrZWxHOWFnVXBudzdZRmcweWkybEdGcjhTU1lMOEd2dXhuNHcwMXZXdHNMc2JhMjg5cFJNOUhiXzFJU2F0U1NWNTM5TXdQR2dpN2ZVN3F6Yk00ZzJpVmIxaW1sQkhJbW9tSkNXVzJDSW41aEF5VUR4Snd5OVh2Y0hyajZUYjE0X0c2YnVLT3JpR0JaejZ4Qmk5WWpOanh5eTlZem5WOVhkU1Z4THNXQjdFaG5yUnhveElFaWVPV0RaUHF1am9tSUFYczZ0TzdhcGFnNE1kZFl6LTVYdTg2Vm15SjZkS05KZUt2RUh0V1hUM081SUVqMEhmdlZGSnlKRTFKR3BfLVhnTzg4Ujh0WF9yOWYySU9PLXpyMU9OODVubUpjTDlGTGRLaFE4Z3dRZw==" + } + } +} \ No newline at end of file diff --git a/services/webhooks2tasks/.openshift/development.app.yml b/services/webhooks2tasks/.openshift/development.app.yml new file mode 100644 index 000000000..55d3a032a --- /dev/null +++ b/services/webhooks2tasks/.openshift/development.app.yml @@ -0,0 +1,73 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: ${AMAZEEIO_SERVICE}-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: RABBITMQ_HOST + description: Hostname of the RabbitMQ Server to connect to + required: true + - name: AMAZEEIO_API_HOST + description: Hostname of the API + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: AMAZEEIO_API_HOST + value: ${AMAZEEIO_API_HOST} + - name: NODE_ENV + value: production + resources: + limits: + cpu: 200m + memory: 200Mi + requests: + cpu: 200m + memory: 200Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} diff --git a/services/webhooks2tasks/.openshift/production.app.yml b/services/webhooks2tasks/.openshift/production.app.yml new file mode 100644 index 000000000..666139d3d --- /dev/null +++ b/services/webhooks2tasks/.openshift/production.app.yml @@ -0,0 +1,68 @@ +apiVersion: v1 +kind: Template +metadata: + creationTimestamp: null + name: ${AMAZEEIO_SERVICE}-template +parameters: + - name: BRANCH + description: Which branch (also docker image tag) should be deployed + required: true + - name: RABBITMQ_HOST + description: Hostname of the RabbitMQ Server to connect to + required: true + - name: AMAZEEIO_SERVICE + description: How is this service called + required: true + - name: OPENSHIFT_PROJECT + description: Name of the openshift project we are created in + required: true +objects: +- apiVersion: v1 + kind: DeploymentConfig + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + replicas: 1 + selector: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + revisionHistoryLimit: 2 + strategy: + resources: {} + template: + metadata: + creationTimestamp: null + labels: + app: ${AMAZEEIO_SERVICE}-${BRANCH} + deploymentconfig: ${AMAZEEIO_SERVICE}-${BRANCH} + spec: + containers: + - image: ${OPENSHIFT_PROJECT}/${AMAZEEIO_SERVICE}:${BRANCH} + name: ${AMAZEEIO_SERVICE}-${BRANCH} + env: + - name: RABBITMQ_HOST + value: ${RABBITMQ_HOST} + - name: NODE_ENV + value: production + resources: + limits: + cpu: 250m + memory: 250Mi + requests: + cpu: 250m + memory: 250Mi + test: false + triggers: + - type: ConfigChange + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - ${AMAZEEIO_SERVICE}-${BRANCH} + from: + kind: ImageStreamTag + name: ${AMAZEEIO_SERVICE}:${BRANCH} + status: {} \ No newline at end of file diff --git a/services/webhooks2tasks/.vscode/settings.json b/services/webhooks2tasks/.vscode/settings.json new file mode 100644 index 000000000..4f2bf5f8a --- /dev/null +++ b/services/webhooks2tasks/.vscode/settings.json @@ -0,0 +1,4 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "javascript.validate.enable": false +} \ No newline at end of file diff --git a/services/webhooks2tasks/Dockerfile b/services/webhooks2tasks/Dockerfile new file mode 100644 index 000000000..17a7903fa --- /dev/null +++ b/services/webhooks2tasks/Dockerfile @@ -0,0 +1,20 @@ +FROM amazeeio/centos7-node-builder:6 as builder +ENV NODE_ENV production +COPY package.json yarn.lock /app/ +RUN BUILD_ONLY=true yarn install --pure-lockfile && yarn cache clean + +FROM amazeeio/centos7-node:6 +ENV NODE_ENV production +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +ARG AMAZEEIO_GIT_BRANCH=undefined +ENV RABBITMQ_HOST "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@${AMAZEEIO_GIT_BRANCH}-rabbitmq" + +ENV AMAZEEIO_API_HOST "http://${AMAZEEIO_GIT_BRANCH}-api:8080" + +RUN yarn run build + +RUN fix-permissions /app/ + +CMD ["yarn", "start"] diff --git a/services/webhooks2tasks/Jenkinsfile b/services/webhooks2tasks/Jenkinsfile new file mode 100644 index 000000000..8e9233b4e --- /dev/null +++ b/services/webhooks2tasks/Jenkinsfile @@ -0,0 +1,152 @@ +node { + env.BRANCH = env.BRANCH_NAME.toLowerCase().replaceAll('%2f','-') // branch names are used for Docker images and could be uppercase or slashes, Docker doesn't like that, so we lower case them. + env.BUILD_TAG = env.BUILD_TAG.toLowerCase().replaceAll('%2f','-') + env.IMAGE = env.BUILD_TAG // Docker image that is built for testing + env.OPENSHIFT_APP_YAML = "development.app.yml" + env.AMAZEEIO_SERVICE = "webhooks2tasks" + env.OPENSHIFT_PROJECT = "amze-amazeeio-dev" + + env.JENKINS_BLUE_URL = "${env.JENKINS_URL}/blue/organizations/jenkins/amazee.io%2F${env.AMAZEEIO_SERVICE}/detail" + + + // on Pull Requests builds we want to test against the base branch rabbigtmq + // Jenkins fills the target into 'CHANGE_TARGET' env variable for pull request builds + // on regular branch builds this env variable is empty. + if (env.CHANGE_TARGET != null) { + env.TARGET_BRANCH = env.CHANGE_TARGET.toLowerCase().replaceAll('%2f','-') + } else { + env.TARGET_BRANCH = env.BRANCH + } + + env.RABBITMQ_HOST = "amazeeio:NYTVU4jdRMjRMmbRcC3JubDH8M34MrWeT3@rabbitmq-${env.TARGET_BRANCH}" + env.AMAZEEIO_API_HOST = "http://api-${env.TARGET_BRANCH}.appuio.amazeeio.review" + + if (env.BRANCH == 'master') { + env.OPENSHIFT_APP_YAML = "production.app.yml" + env.AMAZEEIO_API_HOST = "https://api.amazeeio.cloud" + env.OPENSHIFT_PROJECT = "amze-amazeeio-prod" + } + + stage ('Build Info') { + sh 'env | sort' + } + + stage ('Checkout') { + checkout scm + } + + stage ('build image') { + try { + sh "docker build --pull -t ${env.IMAGE} -f Dockerfile ." + } catch (e) { + error(e, 'build image') + } + } + + stage ('tests') { + // Running Tests in parallel, for faster completion + parallel ( + //test_unit: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-unit" + // } catch (e) { + // error(e, 'unit test') + // } + //}, + // test_http: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-http-ssr" + // } catch (e) { + // error(e, 'http test') + // } + // }, + //test_lint: { + // try { + // sh "IMAGE_NAME=${env.IMAGE} test/test-lint" + // } catch (e) { + // error(e, 'lint') + // } + //} + ) + } + + // Building and Testing is done now, informing Devs about that. + success('Deployment started...') + + // Updating the OpenShift Recources (they probably already exist, but in case we have some changes) + // Tagging the new image, which will cause OpenShift to trigger a new deployment + stage ('OpenShift: update Resources') { + try { + sh "docker run --rm -v $WORKSPACE/.openshift:/tmp -w /tmp/ -e KUBECONFIG=.kubeconfig michelesr/oc sh -c 'oc process -n ${env.OPENSHIFT_PROJECT} -f ${env.OPENSHIFT_APP_YAML} -v BRANCH=${env.BRANCH} -v RABBITMQ_HOST=${env.RABBITMQ_HOST} -v AMAZEEIO_API_HOST=${env.AMAZEEIO_API_HOST} -v AMAZEEIO_SERVICE=${env.AMAZEEIO_SERVICE} -v OPENSHIFT_PROJECT=${env.OPENSHIFT_PROJECT} | oc apply -n ${env.OPENSHIFT_PROJECT} -f -'" + } catch (e) { + error(e, 'OpenShift: update Resources') + } + } + + stage ('docker tag and push') { + // The Docker Registry cannot handle multiple pushes at the same time, so we make sure that multiple Jenkins Jobs are not pushing at the same time + lock("${env.AMAZEEIO_SERVICE}-registry") { + try { + sh "docker tag ${env.IMAGE} registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + sh "DOCKER_CONFIG=$WORKSPACE/.openshift docker push registry.appuio.ch/${env.OPENSHIFT_PROJECT}/${env.AMAZEEIO_SERVICE}:${env.BRANCH}" + } catch (e) { + error(e, 'docker tag and push') + } + } + } + + + + + + // Using openshiftVerifyDeployment which will monitor the current deployment and only continue when it is done. + stage ('OpenShift: deployment') { + try { + OPENSHIFT_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhbXplLWFtYXplZWlvIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImplbmtpbnMtdG9rZW4tN2FqNm8iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiamVua2lucyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFiNzVhYzdjLWM2NWMtMTFlNi1iNzU1LWZhMTYzZTNlYzczYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDphbXplLWFtYXplZWlvOmplbmtpbnMifQ.DTJZCwpEXYgzyZJkCdqzkGGsHVAhMsBt8amri2tfPb_f96kelG9agUpnw7YFg0yi2lGFr8SSYL8Gvuxn4w01vWtsLsba289pRM9Hb_1ISatSSV539MwPGgi7fU7qzbM4g2iVb1imlBHImomJCWW2CIn5hAyUDxJwy9XvcHrj6Tb14_G6buKOriGBZz6xBi9YjNjxyy9YznV9XdSVxLsWB7EhnrRxoxIEieOWDZPqujomIAXs6tO7apag4MddYz-5Xu86VmyJ6dKNJeKvEHtWXT3O5IEj0HfvVFJyJE1JGp_-XgO88R8tX_r9f2IOO-zr1ON85nmJcL9FLdKhQ8gwQg" + env.SKIP_TLS = true + openshiftVerifyDeployment apiURL: 'https://console.appuio.ch:443', authToken: OPENSHIFT_TOKEN, depCfg: "${env.AMAZEEIO_SERVICE}-${env.BRANCH}", namespace: "${env.OPENSHIFT_PROJECT}", replicaCount: '', verbose: 'false', verifyReplicaCount: 'false', waitTime: '15', waitUnit: 'min', SKIP_TLS: true + } catch (e) { + error(e, 'OpenShift: deployment') + } + } + + deployed() + + stage ('cleanup Docker Images') { + cleanupImage() + } + +} + +def error(e, step) { + currentBuild.result = "FAILED" + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":bangbang: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> failed* \nStep: ${step} " + sendslack('danger', message) + cleanupImage() + throw e +} + +def success(message) { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":white_check_mark: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> passed* \n${message} " + sendslack('good', message) +} + +def deployed() { + url = "${env.JENKINS_BLUE_URL}/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/pipeline" + message = ":new: *[${env.AMAZEEIO_SERVICE}/${env.BRANCH_NAME}] <${url}|Build #${env.BUILD_NUMBER}> deployed*" + sendslack('good', message) +} + +def sendslack(color, message) { + slackSend channel: 'amazeeio-testing', color: color, message: message, teamDomain: 'amazee', token: 'xFWAhjdCiXO26K7KXMsBwGT4' +} + +def cleanupImage() { + try { + sh "docker rmi -f ${env.IMAGE}" + } catch (e) { + echo "Removal of Docker image '${env.IMAGE}' failed, ignoring this." + } +} diff --git a/services/webhooks2tasks/LICENSE.md b/services/webhooks2tasks/LICENSE.md new file mode 100644 index 000000000..79b52093e --- /dev/null +++ b/services/webhooks2tasks/LICENSE.md @@ -0,0 +1,11 @@ +The MIT License (MIT) +===================== + +Copyright (c) 2014 Rod Vagg +--------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/services/webhooks2tasks/README.md b/services/webhooks2tasks/README.md new file mode 100644 index 000000000..688873e0a --- /dev/null +++ b/services/webhooks2tasks/README.md @@ -0,0 +1,29 @@ +# amazeeio-webhooks2tasks + +This service is called 'webhooks2tasks', is part of the amazee.io lagoon deployment system and is responsible for converting webhooks into actual tasks that should be executed. + +It does the following: +1. read message from a rabbitmq queue called `amazeeio-webhooks` +2. connect to the amazeeio api and load the SiteGroup information for the GitURL in the message (if sitegroup cannot be resolved, logs to amazeeio-logs) +3. analyzing the message and calls a specific handler for the webhooktype and the event name (like githubPullRequestClosed) +4. the handler will then create a task in the correct rabbitmq task queue. (In our example, closed pull requests need to remove openshift resources, so it creates a task in `amazeeio-tasks:remove-openshift-resources`) +5. If no handler is defined for the webhook type or the event, it will log that to `amazeeio-logs` + +It uses https://github.com/benbria/node-amqp-connection-manager for connecting to rabbitmq, so it can handle situations were rabbitmq is not reachable and still receive webhooks, process them and keep them in memory. As soon as rabbitmq is rechable again, it will send the messages there. + +## Hosting + +Fully developed in Docker and hosted on amazee.io Openshift, see the `.openshift` folder. Deployed via Jenkinsfile. + +Uses `amazeeio/centos7-node:node6` as base image. + +## Development + +Can be used with a local nodejs and connect to a rabbitmq of your choice. + + yarn install + RABBITMQ_HOST=guest:guest@rabbitmqhost yarn run start + +Or via the existing docker-compose.yml + + docker-compose up -d diff --git a/services/webhooks2tasks/docker-compose.yaml b/services/webhooks2tasks/docker-compose.yaml new file mode 100644 index 000000000..ca31cdcac --- /dev/null +++ b/services/webhooks2tasks/docker-compose.yaml @@ -0,0 +1,21 @@ +version: '2' +services: + rabbitmq: + image: rabbitmq + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + ports: + - "15672:15672" + - "5672:5672" + webhooks2tasks: + build: . + command: yarn run dev + user: "11111112" + links: + - rabbitmq:3-management + environment: + - RABBITMQ_HOST=rabbitmq + volumes: + - ./src:/app/src + - ./package.json:/app/package.json diff --git a/services/webhooks2tasks/flow-typed/npm/amqp-connection-manager_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/amqp-connection-manager_vx.x.x.js new file mode 100644 index 000000000..0157a3e0b --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/amqp-connection-manager_vx.x.x.js @@ -0,0 +1,53 @@ +// flow-typed signature: 3ddc7df9039bdc85876cd47fd95c3a7c +// flow-typed version: <>/amqp-connection-manager_v^1.3.5/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'amqp-connection-manager' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'amqp-connection-manager' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'amqp-connection-manager/lib/AmqpConnectionManager' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/ChannelWrapper' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/helpers' { + declare module.exports: any; +} + +declare module 'amqp-connection-manager/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'amqp-connection-manager/lib/AmqpConnectionManager.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/AmqpConnectionManager'>; +} +declare module 'amqp-connection-manager/lib/ChannelWrapper.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/ChannelWrapper'>; +} +declare module 'amqp-connection-manager/lib/helpers.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/helpers'>; +} +declare module 'amqp-connection-manager/lib/index.js' { + declare module.exports: $Exports<'amqp-connection-manager/lib/index'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/amqplib_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/amqplib_vx.x.x.js new file mode 100644 index 000000000..45cf39175 --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/amqplib_vx.x.x.js @@ -0,0 +1,410 @@ +// flow-typed signature: 22527bc8d3379eac0db4cfac36bdc337 +// flow-typed version: <>/amqplib_vhttps://registry.npmjs.org/amqplib/-/amqplib-0.4.2.tgz/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'amqplib' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'amqplib' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'amqplib/callback_api' { + declare module.exports: any; +} + +declare module 'amqplib/channel_api' { + declare module.exports: any; +} + +declare module 'amqplib/examples/headers' { + declare module.exports: any; +} + +declare module 'amqplib/examples/ssl' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/new_task' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/rpc_client' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/rpc_server' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/send' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/worker' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/new_task' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/rpc_client' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/rpc_server' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/send' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/worker' { + declare module.exports: any; +} + +declare module 'amqplib/examples/waitForConfirms' { + declare module.exports: any; +} + +declare module 'amqplib/lib/api_args' { + declare module.exports: any; +} + +declare module 'amqplib/lib/bitset' { + declare module.exports: any; +} + +declare module 'amqplib/lib/callback_model' { + declare module.exports: any; +} + +declare module 'amqplib/lib/channel_model' { + declare module.exports: any; +} + +declare module 'amqplib/lib/channel' { + declare module.exports: any; +} + +declare module 'amqplib/lib/codec' { + declare module.exports: any; +} + +declare module 'amqplib/lib/connect' { + declare module.exports: any; +} + +declare module 'amqplib/lib/connection' { + declare module.exports: any; +} + +declare module 'amqplib/lib/credentials' { + declare module.exports: any; +} + +declare module 'amqplib/lib/defs' { + declare module.exports: any; +} + +declare module 'amqplib/lib/error' { + declare module.exports: any; +} + +declare module 'amqplib/lib/format' { + declare module.exports: any; +} + +declare module 'amqplib/lib/frame' { + declare module.exports: any; +} + +declare module 'amqplib/lib/heartbeat' { + declare module.exports: any; +} + +declare module 'amqplib/lib/mux' { + declare module.exports: any; +} + +declare module 'amqplib/test/bitset' { + declare module.exports: any; +} + +declare module 'amqplib/test/callback_api' { + declare module.exports: any; +} + +declare module 'amqplib/test/channel_api' { + declare module.exports: any; +} + +declare module 'amqplib/test/channel' { + declare module.exports: any; +} + +declare module 'amqplib/test/codec' { + declare module.exports: any; +} + +declare module 'amqplib/test/connect' { + declare module.exports: any; +} + +declare module 'amqplib/test/connection' { + declare module.exports: any; +} + +declare module 'amqplib/test/data' { + declare module.exports: any; +} + +declare module 'amqplib/test/frame' { + declare module.exports: any; +} + +declare module 'amqplib/test/mux' { + declare module.exports: any; +} + +declare module 'amqplib/test/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'amqplib/callback_api.js' { + declare module.exports: $Exports<'amqplib/callback_api'>; +} +declare module 'amqplib/channel_api.js' { + declare module.exports: $Exports<'amqplib/channel_api'>; +} +declare module 'amqplib/examples/headers.js' { + declare module.exports: $Exports<'amqplib/examples/headers'>; +} +declare module 'amqplib/examples/ssl.js' { + declare module.exports: $Exports<'amqplib/examples/ssl'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log_direct'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log_topic'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log'>; +} +declare module 'amqplib/examples/tutorials/callback_api/new_task.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/new_task'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs_direct'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs_topic'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive'>; +} +declare module 'amqplib/examples/tutorials/callback_api/rpc_client.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/rpc_client'>; +} +declare module 'amqplib/examples/tutorials/callback_api/rpc_server.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/rpc_server'>; +} +declare module 'amqplib/examples/tutorials/callback_api/send.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/send'>; +} +declare module 'amqplib/examples/tutorials/callback_api/worker.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/worker'>; +} +declare module 'amqplib/examples/tutorials/emit_log_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log_direct'>; +} +declare module 'amqplib/examples/tutorials/emit_log_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log_topic'>; +} +declare module 'amqplib/examples/tutorials/emit_log.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log'>; +} +declare module 'amqplib/examples/tutorials/new_task.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/new_task'>; +} +declare module 'amqplib/examples/tutorials/receive_logs_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs_direct'>; +} +declare module 'amqplib/examples/tutorials/receive_logs_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs_topic'>; +} +declare module 'amqplib/examples/tutorials/receive_logs.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs'>; +} +declare module 'amqplib/examples/tutorials/receive.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive'>; +} +declare module 'amqplib/examples/tutorials/rpc_client.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/rpc_client'>; +} +declare module 'amqplib/examples/tutorials/rpc_server.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/rpc_server'>; +} +declare module 'amqplib/examples/tutorials/send.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/send'>; +} +declare module 'amqplib/examples/tutorials/worker.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/worker'>; +} +declare module 'amqplib/examples/waitForConfirms.js' { + declare module.exports: $Exports<'amqplib/examples/waitForConfirms'>; +} +declare module 'amqplib/lib/api_args.js' { + declare module.exports: $Exports<'amqplib/lib/api_args'>; +} +declare module 'amqplib/lib/bitset.js' { + declare module.exports: $Exports<'amqplib/lib/bitset'>; +} +declare module 'amqplib/lib/callback_model.js' { + declare module.exports: $Exports<'amqplib/lib/callback_model'>; +} +declare module 'amqplib/lib/channel_model.js' { + declare module.exports: $Exports<'amqplib/lib/channel_model'>; +} +declare module 'amqplib/lib/channel.js' { + declare module.exports: $Exports<'amqplib/lib/channel'>; +} +declare module 'amqplib/lib/codec.js' { + declare module.exports: $Exports<'amqplib/lib/codec'>; +} +declare module 'amqplib/lib/connect.js' { + declare module.exports: $Exports<'amqplib/lib/connect'>; +} +declare module 'amqplib/lib/connection.js' { + declare module.exports: $Exports<'amqplib/lib/connection'>; +} +declare module 'amqplib/lib/credentials.js' { + declare module.exports: $Exports<'amqplib/lib/credentials'>; +} +declare module 'amqplib/lib/defs.js' { + declare module.exports: $Exports<'amqplib/lib/defs'>; +} +declare module 'amqplib/lib/error.js' { + declare module.exports: $Exports<'amqplib/lib/error'>; +} +declare module 'amqplib/lib/format.js' { + declare module.exports: $Exports<'amqplib/lib/format'>; +} +declare module 'amqplib/lib/frame.js' { + declare module.exports: $Exports<'amqplib/lib/frame'>; +} +declare module 'amqplib/lib/heartbeat.js' { + declare module.exports: $Exports<'amqplib/lib/heartbeat'>; +} +declare module 'amqplib/lib/mux.js' { + declare module.exports: $Exports<'amqplib/lib/mux'>; +} +declare module 'amqplib/test/bitset.js' { + declare module.exports: $Exports<'amqplib/test/bitset'>; +} +declare module 'amqplib/test/callback_api.js' { + declare module.exports: $Exports<'amqplib/test/callback_api'>; +} +declare module 'amqplib/test/channel_api.js' { + declare module.exports: $Exports<'amqplib/test/channel_api'>; +} +declare module 'amqplib/test/channel.js' { + declare module.exports: $Exports<'amqplib/test/channel'>; +} +declare module 'amqplib/test/codec.js' { + declare module.exports: $Exports<'amqplib/test/codec'>; +} +declare module 'amqplib/test/connect.js' { + declare module.exports: $Exports<'amqplib/test/connect'>; +} +declare module 'amqplib/test/connection.js' { + declare module.exports: $Exports<'amqplib/test/connection'>; +} +declare module 'amqplib/test/data.js' { + declare module.exports: $Exports<'amqplib/test/data'>; +} +declare module 'amqplib/test/frame.js' { + declare module.exports: $Exports<'amqplib/test/frame'>; +} +declare module 'amqplib/test/mux.js' { + declare module.exports: $Exports<'amqplib/test/mux'>; +} +declare module 'amqplib/test/util.js' { + declare module.exports: $Exports<'amqplib/test/util'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/babel-cli_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/babel-cli_vx.x.x.js new file mode 100644 index 000000000..90936acc2 --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/babel-cli_vx.x.x.js @@ -0,0 +1,108 @@ +// flow-typed signature: beb19de904b0159b454a839011b2f0f3 +// flow-typed version: <>/babel-cli_v^6.18.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-cli' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-cli' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-cli/bin/babel-doctor' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/_babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/dir' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/file' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/index' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-cli/bin/babel-doctor.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-doctor'>; +} +declare module 'babel-cli/bin/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-external-helpers'>; +} +declare module 'babel-cli/bin/babel-node.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-node'>; +} +declare module 'babel-cli/bin/babel.js' { + declare module.exports: $Exports<'babel-cli/bin/babel'>; +} +declare module 'babel-cli/index' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/index.js' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/lib/_babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/_babel-node'>; +} +declare module 'babel-cli/lib/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-external-helpers'>; +} +declare module 'babel-cli/lib/babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-node'>; +} +declare module 'babel-cli/lib/babel/dir.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/dir'>; +} +declare module 'babel-cli/lib/babel/file.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/file'>; +} +declare module 'babel-cli/lib/babel/index.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/index'>; +} +declare module 'babel-cli/lib/babel/util.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/util'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/babel-core_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/babel-core_vx.x.x.js new file mode 100644 index 000000000..fa0a81eac --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/babel-core_vx.x.x.js @@ -0,0 +1,192 @@ +// flow-typed signature: ac28d744323eadd55d2ad2588d34e2df +// flow-typed version: <>/babel-core_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-core' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-core' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-core/lib/api/browser' { + declare module.exports: any; +} + +declare module 'babel-core/lib/api/node' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/merge' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/normalize-ast' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/resolve' { + declare module.exports: any; +} + +declare module 'babel-core/lib/store' { + declare module.exports: any; +} + +declare module 'babel-core/lib/tools/build-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/index' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/logger' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/metadata' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/build-config-chain' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/config' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/index' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/option-manager' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/parsers' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/removed' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/internal-plugins/block-hoist' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/pipeline' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/plugin-pass' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/plugin' { + declare module.exports: any; +} + +declare module 'babel-core/lib/util' { + declare module.exports: any; +} + +declare module 'babel-core/register' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-core/index' { + declare module.exports: $Exports<'babel-core'>; +} +declare module 'babel-core/index.js' { + declare module.exports: $Exports<'babel-core'>; +} +declare module 'babel-core/lib/api/browser.js' { + declare module.exports: $Exports<'babel-core/lib/api/browser'>; +} +declare module 'babel-core/lib/api/node.js' { + declare module.exports: $Exports<'babel-core/lib/api/node'>; +} +declare module 'babel-core/lib/helpers/merge.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/merge'>; +} +declare module 'babel-core/lib/helpers/normalize-ast.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/normalize-ast'>; +} +declare module 'babel-core/lib/helpers/resolve.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/resolve'>; +} +declare module 'babel-core/lib/store.js' { + declare module.exports: $Exports<'babel-core/lib/store'>; +} +declare module 'babel-core/lib/tools/build-external-helpers.js' { + declare module.exports: $Exports<'babel-core/lib/tools/build-external-helpers'>; +} +declare module 'babel-core/lib/transformation/file/index.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/index'>; +} +declare module 'babel-core/lib/transformation/file/logger.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/logger'>; +} +declare module 'babel-core/lib/transformation/file/metadata.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/metadata'>; +} +declare module 'babel-core/lib/transformation/file/options/build-config-chain.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/build-config-chain'>; +} +declare module 'babel-core/lib/transformation/file/options/config.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/config'>; +} +declare module 'babel-core/lib/transformation/file/options/index.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/index'>; +} +declare module 'babel-core/lib/transformation/file/options/option-manager.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/option-manager'>; +} +declare module 'babel-core/lib/transformation/file/options/parsers.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/parsers'>; +} +declare module 'babel-core/lib/transformation/file/options/removed.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/removed'>; +} +declare module 'babel-core/lib/transformation/internal-plugins/block-hoist.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/block-hoist'>; +} +declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/shadow-functions'>; +} +declare module 'babel-core/lib/transformation/pipeline.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/pipeline'>; +} +declare module 'babel-core/lib/transformation/plugin-pass.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/plugin-pass'>; +} +declare module 'babel-core/lib/transformation/plugin.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/plugin'>; +} +declare module 'babel-core/lib/util.js' { + declare module.exports: $Exports<'babel-core/lib/util'>; +} +declare module 'babel-core/register.js' { + declare module.exports: $Exports<'babel-core/register'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js new file mode 100644 index 000000000..45456f9af --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/babel-plugin-syntax-async-functions_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 5a103fdda313008fdca7bebe21e57625 +// flow-typed version: <>/babel-plugin-syntax-async-functions_v^6.13.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-syntax-async-functions' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-syntax-async-functions' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-syntax-async-functions/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-syntax-async-functions/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-syntax-async-functions/lib/index'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js new file mode 100644 index 000000000..5b2ee307e --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 2338f781b6ad44daa64ebdfeb6dfa8a2 +// flow-typed version: <>/babel-plugin-transform-flow-strip-types_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-flow-strip-types' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-flow-strip-types' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-flow-strip-types/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-flow-strip-types/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-flow-strip-types/lib/index'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js new file mode 100644 index 000000000..2ae1ecfe5 --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/babel-plugin-transform-regenerator_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 8858d79f83612f0bb3a574ae5ae9234d +// flow-typed version: <>/babel-plugin-transform-regenerator_v^6.21.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-regenerator' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-regenerator' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-regenerator/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-regenerator/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-regenerator/lib/index'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/babel-preset-es2015_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/babel-preset-es2015_vx.x.x.js new file mode 100644 index 000000000..91438db13 --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/babel-preset-es2015_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 26c4ebbcdba0a8e2ddf27f0591f5b220 +// flow-typed version: <>/babel-preset-es2015_v^6.18.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-es2015' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-es2015' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-es2015/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-es2015/lib/index.js' { + declare module.exports: $Exports<'babel-preset-es2015/lib/index'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/bl_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/bl_vx.x.x.js new file mode 100644 index 000000000..53fab3cbb --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/bl_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 2fa1bf3f484943a1d0f8c19ab090255b +// flow-typed version: <>/bl_v~1.1.2/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'bl' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'bl' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'bl/bl' { + declare module.exports: any; +} + +declare module 'bl/test/test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'bl/bl.js' { + declare module.exports: $Exports<'bl/bl'>; +} +declare module 'bl/test/test.js' { + declare module.exports: $Exports<'bl/test/test'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js new file mode 100644 index 000000000..fd33d73eb --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/buffer-equal-constant-time_vx.x.x.js @@ -0,0 +1,38 @@ +// flow-typed signature: bf317b1ec6a1c6f983be1f89706e1779 +// flow-typed version: <>/buffer-equal-constant-time_v~1.0.1/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'buffer-equal-constant-time' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'buffer-equal-constant-time' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'buffer-equal-constant-time/test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'buffer-equal-constant-time/index' { + declare module.exports: $Exports<'buffer-equal-constant-time'>; +} +declare module 'buffer-equal-constant-time/index.js' { + declare module.exports: $Exports<'buffer-equal-constant-time'>; +} +declare module 'buffer-equal-constant-time/test.js' { + declare module.exports: $Exports<'buffer-equal-constant-time/test'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/flow-bin_v0.x.x.js b/services/webhooks2tasks/flow-typed/npm/flow-bin_v0.x.x.js new file mode 100644 index 000000000..c538e2086 --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/flow-bin_v0.x.x.js @@ -0,0 +1,6 @@ +// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 +// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x + +declare module "flow-bin" { + declare module.exports: string; +} diff --git a/services/webhooks2tasks/flow-typed/npm/jest_v18.x.x.js b/services/webhooks2tasks/flow-typed/npm/jest_v18.x.x.js new file mode 100644 index 000000000..f4202e82a --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/jest_v18.x.x.js @@ -0,0 +1,439 @@ +// flow-typed signature: f9adc1fe5500052e55205636d0f376a7 +// flow-typed version: c17c09b83f/jest_v18.x.x/flow_>=v0.33.x + +type JestMockFn = { + (...args: Array): any, + /** + * An object for introspecting mock calls + */ + mock: { + /** + * An array that represents all calls that have been made into this mock + * function. Each call is represented by an array of arguments that were + * passed during the call. + */ + calls: Array>, + /** + * An array that contains all the object instances that have been + * instantiated from this mock function. + */ + instances: mixed, + }, + /** + * Resets all information stored in the mockFn.mock.calls and + * mockFn.mock.instances arrays. Often this is useful when you want to clean + * up a mock's usage data between two assertions. + */ + mockClear(): Function, + /** + * Resets all information stored in the mock. This is useful when you want to + * completely restore a mock back to its initial state. + */ + mockReset(): Function, + /** + * Accepts a function that should be used as the implementation of the mock. + * The mock itself will still record all calls that go into and instances + * that come from itself -- the only difference is that the implementation + * will also be executed when the mock is called. + */ + mockImplementation(fn: Function): JestMockFn, + /** + * Accepts a function that will be used as an implementation of the mock for + * one call to the mocked function. Can be chained so that multiple function + * calls produce different results. + */ + mockImplementationOnce(fn: Function): JestMockFn, + /** + * Just a simple sugar function for returning `this` + */ + mockReturnThis(): void, + /** + * Deprecated: use jest.fn(() => value) instead + */ + mockReturnValue(value: any): JestMockFn, + /** + * Sugar for only returning a value once inside your mock + */ + mockReturnValueOnce(value: any): JestMockFn, +} + +type JestAsymmetricEqualityType = { + /** + * A custom Jasmine equality tester + */ + asymmetricMatch(value: mixed): boolean, +} + +type JestCallsType = { + allArgs(): mixed, + all(): mixed, + any(): boolean, + count(): number, + first(): mixed, + mostRecent(): mixed, + reset(): void, +} + +type JestClockType = { + install(): void, + mockDate(date: Date): void, + tick(): void, + uninstall(): void, +} + +type JestMatcherResult = { + message?: string | ()=>string, + pass: boolean, +} + +type JestMatcher = (actual: any, expected: any) => JestMatcherResult; + +type JestExpectType = { + not: JestExpectType, + /** + * If you have a mock function, you can use .lastCalledWith to test what + * arguments it was last called with. + */ + lastCalledWith(...args: Array): void, + /** + * toBe just checks that a value is what you expect. It uses === to check + * strict equality. + */ + toBe(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toBeCalled(): void, + /** + * Use .toBeCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toBeCalledWith(...args: Array): void, + /** + * Using exact equality with floating point numbers is a bad idea. Rounding + * means that intuitive things fail. + */ + toBeCloseTo(num: number, delta: any): void, + /** + * Use .toBeDefined to check that a variable is not undefined. + */ + toBeDefined(): void, + /** + * Use .toBeFalsy when you don't care what a value is, you just want to + * ensure a value is false in a boolean context. + */ + toBeFalsy(): void, + /** + * To compare floating point numbers, you can use toBeGreaterThan. + */ + toBeGreaterThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeGreaterThanOrEqual. + */ + toBeGreaterThanOrEqual(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThan. + */ + toBeLessThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThanOrEqual. + */ + toBeLessThanOrEqual(number: number): void, + /** + * Use .toBeInstanceOf(Class) to check that an object is an instance of a + * class. + */ + toBeInstanceOf(cls: Class<*>): void, + /** + * .toBeNull() is the same as .toBe(null) but the error messages are a bit + * nicer. + */ + toBeNull(): void, + /** + * Use .toBeTruthy when you don't care what a value is, you just want to + * ensure a value is true in a boolean context. + */ + toBeTruthy(): void, + /** + * Use .toBeUndefined to check that a variable is undefined. + */ + toBeUndefined(): void, + /** + * Use .toContain when you want to check that an item is in a list. For + * testing the items in the list, this uses ===, a strict equality check. + */ + toContain(item: any): void, + /** + * Use .toContainEqual when you want to check that an item is in a list. For + * testing the items in the list, this matcher recursively checks the + * equality of all fields, rather than checking for object identity. + */ + toContainEqual(item: any): void, + /** + * Use .toEqual when you want to check that two objects have the same value. + * This matcher recursively checks the equality of all fields, rather than + * checking for object identity. + */ + toEqual(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toHaveBeenCalled(): void, + /** + * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact + * number of times. + */ + toHaveBeenCalledTimes(number: number): void, + /** + * Use .toHaveBeenCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toHaveBeenCalledWith(...args: Array): void, + /** + * Check that an object has a .length property and it is set to a certain + * numeric value. + */ + toHaveLength(number: number): void, + /** + * + */ + toHaveProperty(propPath: string, value?: any): void, + /** + * Use .toMatch to check that a string matches a regular expression. + */ + toMatch(regexp: RegExp): void, + /** + * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. + */ + toMatchObject(object: Object): void, + /** + * This ensures that a React component matches the most recent snapshot. + */ + toMatchSnapshot(name?: string): void, + /** + * Use .toThrow to test that a function throws when it is called. + */ + toThrow(message?: string | Error): void, + /** + * Use .toThrowError to test that a function throws a specific error when it + * is called. The argument can be a string for the error message, a class for + * the error, or a regex that should match the error. + */ + toThrowError(message?: string | Error | RegExp): void, + /** + * Use .toThrowErrorMatchingSnapshot to test that a function throws a error + * matching the most recent snapshot when it is called. + */ + toThrowErrorMatchingSnapshot(): void, +} + +type JestObjectType = { + /** + * Disables automatic mocking in the module loader. + * + * After this method is called, all `require()`s will return the real + * versions of each module (rather than a mocked version). + */ + disableAutomock(): JestObjectType, + /** + * An un-hoisted version of disableAutomock + */ + autoMockOff(): JestObjectType, + /** + * Enables automatic mocking in the module loader. + */ + enableAutomock(): JestObjectType, + /** + * An un-hoisted version of enableAutomock + */ + autoMockOn(): JestObjectType, + /** + * Resets the state of all mocks. Equivalent to calling .mockReset() on every + * mocked function. + */ + resetAllMocks(): JestObjectType, + /** + * Removes any pending timers from the timer system. + */ + clearAllTimers(): void, + /** + * The same as `mock` but not moved to the top of the expectation by + * babel-jest. + */ + doMock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * The same as `unmock` but not moved to the top of the expectation by + * babel-jest. + */ + dontMock(moduleName: string): JestObjectType, + /** + * Returns a new, unused mock function. Optionally takes a mock + * implementation. + */ + fn(implementation?: Function): JestMockFn, + /** + * Determines if the given function is a mocked function. + */ + isMockFunction(fn: Function): boolean, + /** + * Given the name of a module, use the automatic mocking system to generate a + * mocked version of the module for you. + */ + genMockFromModule(moduleName: string): any, + /** + * Mocks a module with an auto-mocked version when it is being required. + * + * The second argument can be used to specify an explicit module factory that + * is being run instead of using Jest's automocking feature. + * + * The third argument can be used to create virtual mocks -- mocks of modules + * that don't exist anywhere in the system. + */ + mock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * Resets the module registry - the cache of all required modules. This is + * useful to isolate modules where local state might conflict between tests. + */ + resetModules(): JestObjectType, + /** + * Exhausts the micro-task queue (usually interfaced in node via + * process.nextTick). + */ + runAllTicks(): void, + /** + * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), + * setInterval(), and setImmediate()). + */ + runAllTimers(): void, + /** + * Exhausts all tasks queued by setImmediate(). + */ + runAllImmediates(): void, + /** + * Executes only the macro task queue (i.e. all tasks queued by setTimeout() + * or setInterval() and setImmediate()). + */ + runTimersToTime(msToRun: number): void, + /** + * Executes only the macro-tasks that are currently pending (i.e., only the + * tasks that have been queued by setTimeout() or setInterval() up to this + * point) + */ + runOnlyPendingTimers(): void, + /** + * Explicitly supplies the mock object that the module system should return + * for the specified module. Note: It is recommended to use jest.mock() + * instead. + */ + setMock(moduleName: string, moduleExports: any): JestObjectType, + /** + * Indicates that the module system should never return a mocked version of + * the specified module from require() (e.g. that it should always return the + * real module). + */ + unmock(moduleName: string): JestObjectType, + /** + * Instructs Jest to use fake versions of the standard timer functions + * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, + * setImmediate and clearImmediate). + */ + useFakeTimers(): JestObjectType, + /** + * Instructs Jest to use the real versions of the standard timer functions. + */ + useRealTimers(): JestObjectType, +} + +type JestSpyType = { + calls: JestCallsType, +} + +/** Runs this function after every test inside this context */ +declare function afterEach(fn: Function): void; +/** Runs this function before every test inside this context */ +declare function beforeEach(fn: Function): void; +/** Runs this function after all tests have finished inside this context */ +declare function afterAll(fn: Function): void; +/** Runs this function before any tests have started inside this context */ +declare function beforeAll(fn: Function): void; +/** A context for grouping tests together */ +declare function describe(name: string, fn: Function): void; + +/** An individual test unit */ +declare var it: { + /** + * An individual test unit + * + * @param {string} Name of Test + * @param {Function} Test + */ + (name: string, fn?: Function): ?Promise, + /** + * Only run this test + * + * @param {string} Name of Test + * @param {Function} Test + */ + only(name: string, fn?: Function): ?Promise, + /** + * Skip running this test + * + * @param {string} Name of Test + * @param {Function} Test + */ + skip(name: string, fn?: Function): ?Promise, + /** + * Run the test concurrently + * + * @param {string} Name of Test + * @param {Function} Test + */ + concurrent(name: string, fn?: Function): ?Promise, +}; +declare function fit(name: string, fn: Function): ?Promise; +/** An individual test unit */ +declare var test: typeof it; +/** A disabled group of tests */ +declare var xdescribe: typeof describe; +/** A focused group of tests */ +declare var fdescribe: typeof describe; +/** A disabled individual test */ +declare var xit: typeof it; +/** A disabled individual test */ +declare var xtest: typeof it; + +/** The expect function is used every time you want to test a value */ +declare var expect: { + /** The object that you want to make assertions against */ + (value: any): JestExpectType, + /** Add additional Jasmine matchers to Jest's roster */ + extend(matchers: {[name:string]: JestMatcher}): void, + assertions(expectedAssertions: number): void, + any(value: mixed): JestAsymmetricEqualityType, + anything(): void, + arrayContaining(value: Array): void, + objectContaining(value: Object): void, + stringMatching(value: string): void, +}; + +// TODO handle return type +// http://jasmine.github.io/2.4/introduction.html#section-Spies +declare function spyOn(value: mixed, method: string): Object; + +/** Holds all functions related to manipulating test runner */ +declare var jest: JestObjectType + +/** + * The global Jamine object, this is generally not exposed as the public API, + * using features inside here could break in later versions of Jest. + */ +declare var jasmine: { + DEFAULT_TIMEOUT_INTERVAL: number, + any(value: mixed): JestAsymmetricEqualityType, + anything(): void, + arrayContaining(value: Array): void, + clock(): JestClockType, + createSpy(name: string): JestSpyType, + objectContaining(value: Object): void, + stringMatching(value: string): void, +} diff --git a/services/webhooks2tasks/flow-typed/npm/loggly-winston-bulk_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/loggly-winston-bulk_vx.x.x.js new file mode 100644 index 000000000..b8f6002aa --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/loggly-winston-bulk_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: b34e50fae7ffa8ef3a3235ddcc2881ea +// flow-typed version: <>/loggly-winston-bulk_v^1.0.1/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'loggly-winston-bulk' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'loggly-winston-bulk' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'loggly-winston-bulk/lib/winston-loggly' { + declare module.exports: any; +} + +declare module 'loggly-winston-bulk/test/winston-loggly-test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'loggly-winston-bulk/lib/winston-loggly.js' { + declare module.exports: $Exports<'loggly-winston-bulk/lib/winston-loggly'>; +} +declare module 'loggly-winston-bulk/test/winston-loggly-test.js' { + declare module.exports: $Exports<'loggly-winston-bulk/test/winston-loggly-test'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/newman_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/newman_vx.x.x.js new file mode 100644 index 000000000..6fed00153 --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/newman_vx.x.x.js @@ -0,0 +1,388 @@ +// flow-typed signature: 3140924328fd3377db618d12f139652e +// flow-typed version: <>/newman_v^3.3.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'newman' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'newman' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'newman/bin/newman' { + declare module.exports: any; +} + +declare module 'newman/examples/find-unique-urls-in-run' { + declare module.exports: any; +} + +declare module 'newman/examples/parallel-collection-runs' { + declare module.exports: any; +} + +declare module 'newman/examples/read-collection-from-file' { + declare module.exports: any; +} + +declare module 'newman/examples/run-collections-in-directory' { + declare module.exports: any; +} + +declare module 'newman/lib/cli/index' { + declare module.exports: any; +} + +declare module 'newman/lib/config/index' { + declare module.exports: any; +} + +declare module 'newman/lib/config/process-env' { + declare module.exports: any; +} + +declare module 'newman/lib/config/rc-file' { + declare module.exports: any; +} + +declare module 'newman/lib/index' { + declare module.exports: any; +} + +declare module 'newman/lib/node-version-check/index' { + declare module.exports: any; +} + +declare module 'newman/lib/print/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/cli-utils-symbols' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/cli-utils' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/cli/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/emojitrain' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/html/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/json/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/junit/index' { + declare module.exports: any; +} + +declare module 'newman/lib/reporters/progress' { + declare module.exports: any; +} + +declare module 'newman/lib/run/export-file' { + declare module.exports: any; +} + +declare module 'newman/lib/run/index' { + declare module.exports: any; +} + +declare module 'newman/lib/run/options' { + declare module.exports: any; +} + +declare module 'newman/lib/run/summary' { + declare module.exports: any; +} + +declare module 'newman/lib/util' { + declare module.exports: any; +} + +declare module 'newman/lib/version' { + declare module.exports: any; +} + +declare module 'newman/npm/build-docs' { + declare module.exports: any; +} + +declare module 'newman/npm/build-wiki' { + declare module.exports: any; +} + +declare module 'newman/npm/publish-docs' { + declare module.exports: any; +} + +declare module 'newman/npm/publish-wiki' { + declare module.exports: any; +} + +declare module 'newman/npm/test-cli' { + declare module.exports: any; +} + +declare module 'newman/npm/test-integration' { + declare module.exports: any; +} + +declare module 'newman/npm/test-lint' { + declare module.exports: any; +} + +declare module 'newman/npm/test-system' { + declare module.exports: any; +} + +declare module 'newman/npm/test-unit' { + declare module.exports: any; +} + +declare module 'newman/npm/test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/export-environment.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/export-globals.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/iteration-count.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/ssl-client-cert.test' { + declare module.exports: any; +} + +declare module 'newman/test/cli/suppress-exit-code.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/appveyor-yml.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/editorconfig.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/jsdoc-config.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/nsp.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/repository.test' { + declare module.exports: any; +} + +declare module 'newman/test/system/travis-yml.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/cli-reporter-symbols.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/cli.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/run-summary.test' { + declare module.exports: any; +} + +declare module 'newman/test/unit/run.test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'newman/bin/newman.js' { + declare module.exports: $Exports<'newman/bin/newman'>; +} +declare module 'newman/examples/find-unique-urls-in-run.js' { + declare module.exports: $Exports<'newman/examples/find-unique-urls-in-run'>; +} +declare module 'newman/examples/parallel-collection-runs.js' { + declare module.exports: $Exports<'newman/examples/parallel-collection-runs'>; +} +declare module 'newman/examples/read-collection-from-file.js' { + declare module.exports: $Exports<'newman/examples/read-collection-from-file'>; +} +declare module 'newman/examples/run-collections-in-directory.js' { + declare module.exports: $Exports<'newman/examples/run-collections-in-directory'>; +} +declare module 'newman/index' { + declare module.exports: $Exports<'newman'>; +} +declare module 'newman/index.js' { + declare module.exports: $Exports<'newman'>; +} +declare module 'newman/lib/cli/index.js' { + declare module.exports: $Exports<'newman/lib/cli/index'>; +} +declare module 'newman/lib/config/index.js' { + declare module.exports: $Exports<'newman/lib/config/index'>; +} +declare module 'newman/lib/config/process-env.js' { + declare module.exports: $Exports<'newman/lib/config/process-env'>; +} +declare module 'newman/lib/config/rc-file.js' { + declare module.exports: $Exports<'newman/lib/config/rc-file'>; +} +declare module 'newman/lib/index.js' { + declare module.exports: $Exports<'newman/lib/index'>; +} +declare module 'newman/lib/node-version-check/index.js' { + declare module.exports: $Exports<'newman/lib/node-version-check/index'>; +} +declare module 'newman/lib/print/index.js' { + declare module.exports: $Exports<'newman/lib/print/index'>; +} +declare module 'newman/lib/reporters/cli/cli-utils-symbols.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/cli-utils-symbols'>; +} +declare module 'newman/lib/reporters/cli/cli-utils.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/cli-utils'>; +} +declare module 'newman/lib/reporters/cli/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/cli/index'>; +} +declare module 'newman/lib/reporters/emojitrain.js' { + declare module.exports: $Exports<'newman/lib/reporters/emojitrain'>; +} +declare module 'newman/lib/reporters/html/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/html/index'>; +} +declare module 'newman/lib/reporters/json/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/json/index'>; +} +declare module 'newman/lib/reporters/junit/index.js' { + declare module.exports: $Exports<'newman/lib/reporters/junit/index'>; +} +declare module 'newman/lib/reporters/progress.js' { + declare module.exports: $Exports<'newman/lib/reporters/progress'>; +} +declare module 'newman/lib/run/export-file.js' { + declare module.exports: $Exports<'newman/lib/run/export-file'>; +} +declare module 'newman/lib/run/index.js' { + declare module.exports: $Exports<'newman/lib/run/index'>; +} +declare module 'newman/lib/run/options.js' { + declare module.exports: $Exports<'newman/lib/run/options'>; +} +declare module 'newman/lib/run/summary.js' { + declare module.exports: $Exports<'newman/lib/run/summary'>; +} +declare module 'newman/lib/util.js' { + declare module.exports: $Exports<'newman/lib/util'>; +} +declare module 'newman/lib/version.js' { + declare module.exports: $Exports<'newman/lib/version'>; +} +declare module 'newman/npm/build-docs.js' { + declare module.exports: $Exports<'newman/npm/build-docs'>; +} +declare module 'newman/npm/build-wiki.js' { + declare module.exports: $Exports<'newman/npm/build-wiki'>; +} +declare module 'newman/npm/publish-docs.js' { + declare module.exports: $Exports<'newman/npm/publish-docs'>; +} +declare module 'newman/npm/publish-wiki.js' { + declare module.exports: $Exports<'newman/npm/publish-wiki'>; +} +declare module 'newman/npm/test-cli.js' { + declare module.exports: $Exports<'newman/npm/test-cli'>; +} +declare module 'newman/npm/test-integration.js' { + declare module.exports: $Exports<'newman/npm/test-integration'>; +} +declare module 'newman/npm/test-lint.js' { + declare module.exports: $Exports<'newman/npm/test-lint'>; +} +declare module 'newman/npm/test-system.js' { + declare module.exports: $Exports<'newman/npm/test-system'>; +} +declare module 'newman/npm/test-unit.js' { + declare module.exports: $Exports<'newman/npm/test-unit'>; +} +declare module 'newman/npm/test.js' { + declare module.exports: $Exports<'newman/npm/test'>; +} +declare module 'newman/test/cli/export-environment.test.js' { + declare module.exports: $Exports<'newman/test/cli/export-environment.test'>; +} +declare module 'newman/test/cli/export-globals.test.js' { + declare module.exports: $Exports<'newman/test/cli/export-globals.test'>; +} +declare module 'newman/test/cli/iteration-count.test.js' { + declare module.exports: $Exports<'newman/test/cli/iteration-count.test'>; +} +declare module 'newman/test/cli/ssl-client-cert.test.js' { + declare module.exports: $Exports<'newman/test/cli/ssl-client-cert.test'>; +} +declare module 'newman/test/cli/suppress-exit-code.test.js' { + declare module.exports: $Exports<'newman/test/cli/suppress-exit-code.test'>; +} +declare module 'newman/test/system/appveyor-yml.test.js' { + declare module.exports: $Exports<'newman/test/system/appveyor-yml.test'>; +} +declare module 'newman/test/system/editorconfig.test.js' { + declare module.exports: $Exports<'newman/test/system/editorconfig.test'>; +} +declare module 'newman/test/system/jsdoc-config.test.js' { + declare module.exports: $Exports<'newman/test/system/jsdoc-config.test'>; +} +declare module 'newman/test/system/nsp.test.js' { + declare module.exports: $Exports<'newman/test/system/nsp.test'>; +} +declare module 'newman/test/system/repository.test.js' { + declare module.exports: $Exports<'newman/test/system/repository.test'>; +} +declare module 'newman/test/system/travis-yml.test.js' { + declare module.exports: $Exports<'newman/test/system/travis-yml.test'>; +} +declare module 'newman/test/unit/cli-reporter-symbols.test.js' { + declare module.exports: $Exports<'newman/test/unit/cli-reporter-symbols.test'>; +} +declare module 'newman/test/unit/cli.test.js' { + declare module.exports: $Exports<'newman/test/unit/cli.test'>; +} +declare module 'newman/test/unit/run-summary.test.js' { + declare module.exports: $Exports<'newman/test/unit/run-summary.test'>; +} +declare module 'newman/test/unit/run.test.js' { + declare module.exports: $Exports<'newman/test/unit/run.test'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/nodemon_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/nodemon_vx.x.x.js new file mode 100644 index 000000000..b0229d730 --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/nodemon_vx.x.x.js @@ -0,0 +1,214 @@ +// flow-typed signature: eab46bce88fff52d1a9d8bec9a241fc5 +// flow-typed version: <>/nodemon_v^1.11.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'nodemon' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'nodemon' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'nodemon/bin/nodemon' { + declare module.exports: any; +} + +declare module 'nodemon/lib/cli/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/cli/parse' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/command' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/defaults' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/exec' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/config/load' { + declare module.exports: any; +} + +declare module 'nodemon/lib/help/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/match' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/run' { + declare module.exports: any; +} + +declare module 'nodemon/lib/monitor/watch' { + declare module.exports: any; +} + +declare module 'nodemon/lib/nodemon' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/add' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/rules/parse' { + declare module.exports: any; +} + +declare module 'nodemon/lib/spawn' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/bus' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/clone' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/colour' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/index' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/log' { + declare module.exports: any; +} + +declare module 'nodemon/lib/utils/merge' { + declare module.exports: any; +} + +declare module 'nodemon/lib/version' { + declare module.exports: any; +} + +declare module 'nodemon/web/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'nodemon/bin/nodemon.js' { + declare module.exports: $Exports<'nodemon/bin/nodemon'>; +} +declare module 'nodemon/lib/cli/index.js' { + declare module.exports: $Exports<'nodemon/lib/cli/index'>; +} +declare module 'nodemon/lib/cli/parse.js' { + declare module.exports: $Exports<'nodemon/lib/cli/parse'>; +} +declare module 'nodemon/lib/config/command.js' { + declare module.exports: $Exports<'nodemon/lib/config/command'>; +} +declare module 'nodemon/lib/config/defaults.js' { + declare module.exports: $Exports<'nodemon/lib/config/defaults'>; +} +declare module 'nodemon/lib/config/exec.js' { + declare module.exports: $Exports<'nodemon/lib/config/exec'>; +} +declare module 'nodemon/lib/config/index.js' { + declare module.exports: $Exports<'nodemon/lib/config/index'>; +} +declare module 'nodemon/lib/config/load.js' { + declare module.exports: $Exports<'nodemon/lib/config/load'>; +} +declare module 'nodemon/lib/help/index.js' { + declare module.exports: $Exports<'nodemon/lib/help/index'>; +} +declare module 'nodemon/lib/index.js' { + declare module.exports: $Exports<'nodemon/lib/index'>; +} +declare module 'nodemon/lib/monitor/index.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/index'>; +} +declare module 'nodemon/lib/monitor/match.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/match'>; +} +declare module 'nodemon/lib/monitor/run.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/run'>; +} +declare module 'nodemon/lib/monitor/watch.js' { + declare module.exports: $Exports<'nodemon/lib/monitor/watch'>; +} +declare module 'nodemon/lib/nodemon.js' { + declare module.exports: $Exports<'nodemon/lib/nodemon'>; +} +declare module 'nodemon/lib/rules/add.js' { + declare module.exports: $Exports<'nodemon/lib/rules/add'>; +} +declare module 'nodemon/lib/rules/index.js' { + declare module.exports: $Exports<'nodemon/lib/rules/index'>; +} +declare module 'nodemon/lib/rules/parse.js' { + declare module.exports: $Exports<'nodemon/lib/rules/parse'>; +} +declare module 'nodemon/lib/spawn.js' { + declare module.exports: $Exports<'nodemon/lib/spawn'>; +} +declare module 'nodemon/lib/utils/bus.js' { + declare module.exports: $Exports<'nodemon/lib/utils/bus'>; +} +declare module 'nodemon/lib/utils/clone.js' { + declare module.exports: $Exports<'nodemon/lib/utils/clone'>; +} +declare module 'nodemon/lib/utils/colour.js' { + declare module.exports: $Exports<'nodemon/lib/utils/colour'>; +} +declare module 'nodemon/lib/utils/index.js' { + declare module.exports: $Exports<'nodemon/lib/utils/index'>; +} +declare module 'nodemon/lib/utils/log.js' { + declare module.exports: $Exports<'nodemon/lib/utils/log'>; +} +declare module 'nodemon/lib/utils/merge.js' { + declare module.exports: $Exports<'nodemon/lib/utils/merge'>; +} +declare module 'nodemon/lib/version.js' { + declare module.exports: $Exports<'nodemon/lib/version'>; +} +declare module 'nodemon/web/index.js' { + declare module.exports: $Exports<'nodemon/web/index'>; +} diff --git a/services/webhooks2tasks/flow-typed/npm/winston_vx.x.x.js b/services/webhooks2tasks/flow-typed/npm/winston_vx.x.x.js new file mode 100644 index 000000000..eaebbf00e --- /dev/null +++ b/services/webhooks2tasks/flow-typed/npm/winston_vx.x.x.js @@ -0,0 +1,214 @@ +// flow-typed signature: 48dced19d396d69846f3d7727f01a59f +// flow-typed version: <>/winston_v^2.2.0/flow_v0.37.4 + +/** + * This is an autogenerated libdef stub for: + * + * 'winston' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'winston' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'winston/lib/winston' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/common' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/cli-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/npm-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/config/syslog-config' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/container' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/exception' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/logger' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/console' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/file' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/http' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/memory' { + declare module.exports: any; +} + +declare module 'winston/lib/winston/transports/transport' { + declare module.exports: any; +} + +declare module 'winston/test/helpers' { + declare module.exports: any; +} + +declare module 'winston/test/transports/console-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-archive-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-maxfiles-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-maxsize-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-open-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-stress-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-tailrolling-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/file-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/http-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/memory-test' { + declare module.exports: any; +} + +declare module 'winston/test/transports/transport' { + declare module.exports: any; +} + +// Filename aliases +declare module 'winston/lib/winston.js' { + declare module.exports: $Exports<'winston/lib/winston'>; +} +declare module 'winston/lib/winston/common.js' { + declare module.exports: $Exports<'winston/lib/winston/common'>; +} +declare module 'winston/lib/winston/config.js' { + declare module.exports: $Exports<'winston/lib/winston/config'>; +} +declare module 'winston/lib/winston/config/cli-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/cli-config'>; +} +declare module 'winston/lib/winston/config/npm-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/npm-config'>; +} +declare module 'winston/lib/winston/config/syslog-config.js' { + declare module.exports: $Exports<'winston/lib/winston/config/syslog-config'>; +} +declare module 'winston/lib/winston/container.js' { + declare module.exports: $Exports<'winston/lib/winston/container'>; +} +declare module 'winston/lib/winston/exception.js' { + declare module.exports: $Exports<'winston/lib/winston/exception'>; +} +declare module 'winston/lib/winston/logger.js' { + declare module.exports: $Exports<'winston/lib/winston/logger'>; +} +declare module 'winston/lib/winston/transports.js' { + declare module.exports: $Exports<'winston/lib/winston/transports'>; +} +declare module 'winston/lib/winston/transports/console.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/console'>; +} +declare module 'winston/lib/winston/transports/file.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/file'>; +} +declare module 'winston/lib/winston/transports/http.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/http'>; +} +declare module 'winston/lib/winston/transports/memory.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/memory'>; +} +declare module 'winston/lib/winston/transports/transport.js' { + declare module.exports: $Exports<'winston/lib/winston/transports/transport'>; +} +declare module 'winston/test/helpers.js' { + declare module.exports: $Exports<'winston/test/helpers'>; +} +declare module 'winston/test/transports/console-test.js' { + declare module.exports: $Exports<'winston/test/transports/console-test'>; +} +declare module 'winston/test/transports/file-archive-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-archive-test'>; +} +declare module 'winston/test/transports/file-maxfiles-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-maxfiles-test'>; +} +declare module 'winston/test/transports/file-maxsize-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-maxsize-test'>; +} +declare module 'winston/test/transports/file-open-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-open-test'>; +} +declare module 'winston/test/transports/file-stress-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-stress-test'>; +} +declare module 'winston/test/transports/file-tailrolling-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-tailrolling-test'>; +} +declare module 'winston/test/transports/file-test.js' { + declare module.exports: $Exports<'winston/test/transports/file-test'>; +} +declare module 'winston/test/transports/http-test.js' { + declare module.exports: $Exports<'winston/test/transports/http-test'>; +} +declare module 'winston/test/transports/memory-test.js' { + declare module.exports: $Exports<'winston/test/transports/memory-test'>; +} +declare module 'winston/test/transports/transport.js' { + declare module.exports: $Exports<'winston/test/transports/transport'>; +} diff --git a/services/webhooks2tasks/package.json b/services/webhooks2tasks/package.json new file mode 100644 index 000000000..913218c1f --- /dev/null +++ b/services/webhooks2tasks/package.json @@ -0,0 +1,53 @@ +{ + "name": "amazeeio-webhook-handler", + "version": "0.9.0", + "description": "amazeeio handler for webhooks", + "main": "index.js", + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "jest", + "test:watch": "jest --watch", + "start": "node build/index.js", + "build": "babel src -d build", + "dev": "nodemon src/index.js --exec babel-node" + }, + "author": "Rod Vagg (http://r.va.gg)", + "repository": { + "type": "git", + "url": "https://github.com/rvagg/github-webhook-handler.git" + }, + "license": "MIT", + "dependencies": { + "@amazeeio/amazeeio-api": "^0.1.7", + "@amazeeio/amazeeio-local-logging": "^0.1.3", + "@amazeeio/amazeeio-logs": "^0.1.11", + "@amazeeio/amazeeio-tasks": "^1.0.1", + "amqp-connection-manager": "^1.3.5", + "amqp-winston": "^1.0.7", + "amqplib": "^0.5.1", + "babel-cli": "^6.18.0", + "babel-core": "^6.21.0", + "babel-plugin-syntax-async-functions": "^6.13.0", + "babel-plugin-transform-flow-strip-types": "^6.21.0", + "babel-plugin-transform-object-rest-spread": "^6.20.2", + "babel-plugin-transform-regenerator": "^6.21.0", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.18.0", + "bluebird": "^3.5.0", + "lokka": "^1.7.0", + "lokka-transport-http": "^1.6.1", + "nodemon": "^1.11.0", + "uuid4": "^1.0.0", + "winston": "^2.2.0" + }, + "devDependencies": { + "flow-bin": "^0.37.4", + "jest": "^18.1.0" + }, + "jest": { + "rootDir": "src", + "testEnvironment": "node" + } +} diff --git a/services/webhooks2tasks/src/handlers/githubBranchDeleted.js b/services/webhooks2tasks/src/handlers/githubBranchDeleted.js new file mode 100644 index 000000000..5c0d9b1ff --- /dev/null +++ b/services/webhooks2tasks/src/handlers/githubBranchDeleted.js @@ -0,0 +1,59 @@ +// @flow + +import { logger } from '@amazeeio/amazeeio-local-logging'; + +import { sendToAmazeeioLogs } from '@amazeeio/amazeeio-logs'; + +import { createRemoveTask } from '@amazeeio/amazeeio-tasks'; + +import type { WebhookRequestData, removeOpenshiftResourcesData, ChannelWrapper, SiteGroup } from '../types'; + +export default async function githubBranchDeleted(webhook: WebhookRequestData, siteGroup: SiteGroup, channelWrapper: ChannelWrapper) { + + const { + webhooktype, + event, + giturl, + uuid, + body, + } = webhook; + + const saveBranchname = body.ref.toLowerCase().replace('refs/heads/','').replace('/','-') + + const openshiftNamingPullRequests = (typeof siteGroup.openshift.naming !== 'undefined') ? siteGroup.openshift.naming.branch : "${sitegroup}-${branch}" + const openshiftRessourceAppName = openshiftNamingPullRequests.replace('${branch}', saveBranchname).replace('${sitegroup}', siteGroup.siteGroupName).replace('_','-') + + const meta = { + branch: saveBranchname, + origBranch: body.ref.replace('refs/heads/','') + } + + const data: removeOpenshiftResourcesData = { + siteGroupName: siteGroup.siteGroupName, + openshiftRessourceAppName: openshiftRessourceAppName, + } + + sendToAmazeeioLogs('info', siteGroup.siteGroupName, uuid, `${webhooktype}:${event}:receive`, meta, + `Branch \`${meta.origBranch}\` deleted in <${body.repository.html_url}|${body.repository.full_name}>` + ) + + try { + const taskResult = await createRemoveTask(data); + logger.verbose(taskResult) + return; + } catch (error) { + switch (error.name) { + case "SiteGroupNotFound": + case "NoActiveSystemsDefined": + case "UnknownActiveSystem": + // These are not real errors and also they will happen many times. We just log them locally but will ack the message + logger.verbose(error) + return; + + default: + // Other messages are real errors and should reschedule the message in RabbitMQ in order to try again + throw error + } + } + +} \ No newline at end of file diff --git a/services/webhooks2tasks/src/handlers/githubPullRequestClosed.js b/services/webhooks2tasks/src/handlers/githubPullRequestClosed.js new file mode 100644 index 000000000..2e4144f35 --- /dev/null +++ b/services/webhooks2tasks/src/handlers/githubPullRequestClosed.js @@ -0,0 +1,55 @@ +// @flow + +import { logger } from '@amazeeio/amazeeio-local-logging'; + +import { sendToAmazeeioLogs } from '@amazeeio/amazeeio-logs'; + +import { createRemoveTask } from '@amazeeio/amazeeio-tasks'; + +import type { WebhookRequestData, removeOpenshiftResourcesData, ChannelWrapper, SiteGroup } from '../types'; + +export default async function githubPullRequestClosed(webhook: WebhookRequestData, siteGroup: SiteGroup, channelWrapper: ChannelWrapper) { + + const { + webhooktype, + event, + giturl, + uuid, + body, + } = webhook; + + const openshiftNamingPullRequests = (typeof siteGroup.openshift.naming !== 'undefined') ? siteGroup.openshift.naming.pullrequest : "${sitegroup}-pr-${number}" + const openshiftRessourceAppName = openshiftNamingPullRequests.replace('${number}', body.number).replace('${sitegroup}', siteGroup.siteGroupName) + + const meta = { + prNumber: body.number + } + + const data: removeOpenshiftResourcesData = { + siteGroupName: siteGroup.siteGroupName, + openshiftRessourceAppName: openshiftRessourceAppName + } + + sendToAmazeeioLogs('info', siteGroup.siteGroupName, uuid, `${webhooktype}:${event}:closed:receive`, meta, + `PR <${body.pull_request.html_url}|#${body.number} (${body.pull_request.title})> closed in <${body.repository.html_url}|${body.repository.full_name}>` + ) + + try { + const taskResult = await createRemoveTask(data); + logger.verbose(taskResult) + return; + } catch (error) { + switch (error.name) { + case "SiteGroupNotFound": + case "NoActiveSystemsDefined": + case "UnknownActiveSystem": + // These are not real errors and also they will happen many times. We just log them locally but will ack the message + logger.verbose(error) + return; + + default: + // Other messages are real errors and should reschedule the message in RabbitMQ in order to try again + throw error + } + } +} \ No newline at end of file diff --git a/services/webhooks2tasks/src/handlers/githubPush.js b/services/webhooks2tasks/src/handlers/githubPush.js new file mode 100644 index 000000000..90528ba72 --- /dev/null +++ b/services/webhooks2tasks/src/handlers/githubPush.js @@ -0,0 +1,60 @@ +// @flow + +import { logger } from '@amazeeio/amazeeio-local-logging'; + +import { sendToAmazeeioLogs } from '@amazeeio/amazeeio-logs'; + +import { createDeployTask } from '@amazeeio/amazeeio-tasks'; + +import { getEnabledSystemsForSiteGroup } from '@amazeeio/amazeeio-api'; + +import type { WebhookRequestData, deployData, ChannelWrapper, SiteGroup } from '../types'; + +export default async function githubPush(webhook: WebhookRequestData, siteGroup: SiteGroup, channelWrapper: ChannelWrapper) { + + const { + webhooktype, + event, + giturl, + uuid, + body, + } = webhook; + + const branchName = body.ref.toLowerCase().replace('refs/heads/','') + const sha = body.after + + const meta = { + branch: branchName, + sha: sha + } + + const data: deployData = { + siteGroupName: siteGroup.siteGroupName, + branchName: branchName, + sha: sha + } + + sendToAmazeeioLogs('info', siteGroup.siteGroupName, uuid, `${webhooktype}:${event}:receive`, meta, + `Branch \`${meta.branch}\` pushed in <${body.repository.html_url}|${body.repository.full_name}>` + ) + + try { + const taskResult = await createDeployTask(data); + logger.verbose(taskResult) + return; + } catch (error) { + switch (error.name) { + case "SiteGroupNotFound": + case "NoActiveSystemsDefined": + case "UnknownActiveSystem": + // These are not real errors and also they will happen many times. We just log them locally but will ack the message + logger.verbose(error) + return; + + default: + // Other messages are real errors and should reschedule the message in RabbitMQ in order to try again + throw error + } + } + +} \ No newline at end of file diff --git a/services/webhooks2tasks/src/index.js b/services/webhooks2tasks/src/index.js new file mode 100644 index 000000000..bc332f3d0 --- /dev/null +++ b/services/webhooks2tasks/src/index.js @@ -0,0 +1,35 @@ +// @flow + +require("babel-polyfill"); + +import amqp from 'amqp-connection-manager'; + +import { logger, initLogger } from '@amazeeio/amazeeio-local-logging'; +import { sendToAmazeeioLogs, initSendToAmazeeioLogs } from '@amazeeio/amazeeio-logs'; +import { sendToAmazeeioTasks, initSendToAmazeeioTasks } from '@amazeeio/amazeeio-tasks'; + +import processWebhook from './processWebhook'; + +import type { ChannelWrapper } from './types'; + +// Initialize the logging mechanism +initLogger(); +initSendToAmazeeioLogs(); +initSendToAmazeeioTasks(); + +const rabbitmqhost = process.env.RABBITMQ_HOST || "localhost" +const connection = amqp.connect([`amqp://${rabbitmqhost}`], { json: true }); + +connection.on('connect', ({ url }) => logger.verbose('Connected to %s', url, { action: 'connected', url })); +connection.on('disconnect', params => logger.error('Not connected, error: %s', params.err.code, { action: 'disconnected', reason: params })); + +// Cast any to ChannelWrapper to get type-safetiness through our own code +const channelWrapper: ChannelWrapper = connection.createChannel({ + setup: channel => { + return Promise.all([ + channel.assertQueue('amazeeio-webhooks', {durable: true}), + channel.prefetch(1), + channel.consume('amazeeio-webhooks', msg => processWebhook(msg, channelWrapper), {noAck: false}), + ]); + } +}); diff --git a/services/webhooks2tasks/src/processWebhook.js b/services/webhooks2tasks/src/processWebhook.js new file mode 100644 index 000000000..7ae3740a4 --- /dev/null +++ b/services/webhooks2tasks/src/processWebhook.js @@ -0,0 +1,140 @@ +// @flow + +import { logger } from '@amazeeio/amazeeio-local-logging'; + +import { getSiteGroupsByGitUrl } from '@amazeeio/amazeeio-api'; +import { SiteGroupNotFound } from '@amazeeio/amazeeio-logs'; +import { sendToAmazeeioLogs } from '@amazeeio/amazeeio-logs'; +import githubPullRequestClosed from './handlers/githubPullRequestClosed'; +import githubBranchDeleted from './handlers/githubBranchDeleted'; +import githubPush from './handlers/githubPush'; + +import type { WebhookRequestData, ChannelWrapper, RabbitMQMsg, SiteGroup } from './types'; + + +export default async function processWebhook (rabbitMsg: RabbitMQMsg, channelWrapper: ChannelWrapper): Promise { + const { + content, + fields, + properties, + } = rabbitMsg; + + const webhook: WebhookRequestData = JSON.parse(content.toString()) + + let siteGroups: SiteGroup[] + + const { + webhooktype, + event, + giturl, + uuid, + body, + } = webhook; + + try { + siteGroups = await getSiteGroupsByGitUrl(giturl) + } + catch (error) { + if (error.name == 'SiteGroupNotFound') { + logger.warn(`Could not resolve sitegroup for ${giturl} while handling webook ${webhooktype}:${event} ${JSON.stringify(webhook)}`) + const meta = { + event: `${webhooktype}:${event}` + } + sendToAmazeeioLogs('info', 'unresolved', uuid, `unresolvedSitegroup:webhooks2tasks`, meta, + `Unresolved sitegroup \`${giturl}\` while handling ${webhooktype}:${event}` + ) + channelWrapper.ack(rabbitMsg) + } else { + logger.error(error) + channelWrapper.ack(rabbitMsg) + } + return + } + + siteGroups.forEach((siteGroup) => { + + switch (`${webhooktype}:${event}`) { + case "github:pull_request": + + switch (body.action) { + case 'closed': + handle(githubPullRequestClosed, webhook, siteGroup, channelWrapper, rabbitMsg, `${webhooktype}:${event}:${body.action}`) + break; + + default: + unhandled(webhook, siteGroup, channelWrapper, rabbitMsg, `${webhooktype}:${event}:${body.action}`) + break; + } + break; + + case "github:delete": + switch (body.ref_type) { + case "branch": + // We do not handle branch deletes via github delete push event, as github also sends a regular push event with 'deleted=true'. It's handled there (see below inside "github:push") + unhandled(webhook, siteGroup, channelWrapper, rabbitMsg, `${webhooktype}:${event}:${body.ref_type}`) + break; + + default: + unhandled(webhook, siteGroup, channelWrapper, rabbitMsg, `${webhooktype}:${event}:${body.ref_type}`) + break; + } + break; + + case "github:push": + if (body.deleted === true) { + handle(githubBranchDeleted, webhook, siteGroup, channelWrapper, rabbitMsg, `${webhooktype}:${event}`) + } else { + handle(githubPush, webhook, siteGroup, channelWrapper, rabbitMsg, `${webhooktype}:${event}`) + } + + break; + + default: + unhandled(webhook, siteGroup, channelWrapper, rabbitMsg, `${webhooktype}:${event}`) + break; + } + + }); +} + +async function handle(handler, webhook: WebhookRequestData, siteGroup: SiteGroup, channelWrapper: ChannelWrapper, rabbitMsg: RabbitMQMsg, fullEvent: string){ + const { + webhooktype, + event, + giturl, + uuid, + body, + } = webhook; + + logger.info(`Handling ${fullEvent} for sitegroup ${siteGroup.siteGroupName} `, { uuid, giturl }); + + try { + await handler(webhook, siteGroup, channelWrapper) + channelWrapper.ack(rabbitMsg) + } catch(error) { + logger.error(`Error handling ${fullEvent} for sitegroup ${siteGroup.siteGroupName} ${error}`, { webhooktype, event, giturl}); + channelWrapper.ack(rabbitMsg) + } +} + + +async function unhandled(webhook: WebhookRequestData, siteGroup: SiteGroup, channelWrapper: ChannelWrapper, rabbitMsg: RabbitMQMsg, fullEvent: string) { + const { + webhooktype, + event, + giturl, + uuid, + body, + } = webhook; + + logger.warn(`unhandled webhook ${fullEvent} for sitegroup ${siteGroup.siteGroupName} ${JSON.stringify(webhook)}`) + const meta = { + fullEvent: fullEvent + } + sendToAmazeeioLogs('info', siteGroup.siteGroupName, uuid, `unhandledWebhook`, meta, + `Unhandled Webhook \`${fullEvent}\` for \`${siteGroup.siteGroupName}\`` + ) + + channelWrapper.ack(rabbitMsg) + return +} diff --git a/services/webhooks2tasks/src/types.js b/services/webhooks2tasks/src/types.js new file mode 100644 index 000000000..4222a0931 --- /dev/null +++ b/services/webhooks2tasks/src/types.js @@ -0,0 +1,43 @@ +// @flow + +/** + * Webhook related types for incoming Events + */ + +export type ChannelWrapper = { + sendToQueue: (queue: string, content: Buffer, options: Object) => void, + publish: (exchange: string, routingKey: string, content: Buffer, options: Object) => void, + ack: (msg: Object) => void, +} + +export type removeOpenshiftResourcesData = { + siteGroupName: string, + openshiftRessourceAppName: string +} + +export type deployData = { + siteGroupName: string, + branchName: string, + sha: string +} + + +export type WebhookRequestData = { + webhooktype: string, + event: string, + giturl: string, + uuid?: string, + body?: Object, +}; + +export type SiteGroup = { + slack: Object, + siteGroupName: string, + openshift: Object, +}; + +export type RabbitMQMsg = { + content: Buffer, + fields: Object, + properties: Object, +}; diff --git a/services/webhooks2tasks/yarn.lock b/services/webhooks2tasks/yarn.lock new file mode 100644 index 000000000..ba104bd72 --- /dev/null +++ b/services/webhooks2tasks/yarn.lock @@ -0,0 +1,3227 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@amazeeio/amazeeio-api@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-api/-/amazeeio-api-0.1.7.tgz#188ad5034c4b4c5c61a9c63d39910903e4fba4ea" + dependencies: + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + lokka "^1.7.0" + lokka-transport-http "^1.6.1" + winston "^2.2.0" + +"@amazeeio/amazeeio-api@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-api/-/amazeeio-api-1.0.0.tgz#131ea0fe005457495c2b744a10d493e4b0a66843" + dependencies: + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + lokka "^1.7.0" + lokka-transport-http "^1.6.1" + winston "^2.2.0" + +"@amazeeio/amazeeio-local-logging@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-local-logging/-/amazeeio-local-logging-0.1.3.tgz#a7b83f4c95e3723ff5baafa01a2c376b9054410c" + dependencies: + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +"@amazeeio/amazeeio-logs@^0.1.11": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-logs/-/amazeeio-logs-0.1.11.tgz#36ff8db6e9f1f83f65ad1906f338b4363d43d854" + dependencies: + amqp-connection-manager "^1.3.5" + amqplib "^0.5.1" + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + winston "^2.2.0" + +"@amazeeio/amazeeio-tasks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@amazeeio/amazeeio-tasks/-/amazeeio-tasks-1.0.1.tgz#38939c9ee38483c181d150af617032615a2f43bd" + dependencies: + "@amazeeio/amazeeio-api" "^1.0.0" + "@amazeeio/amazeeio-local-logging" "^0.1.3" + amqp-connection-manager "^1.3.5" + amqplib "^0.5.1" + babel-cli "^6.18.0" + babel-core "^6.21.0" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-flow-strip-types "^6.21.0" + babel-plugin-transform-object-rest-spread "^6.20.2" + babel-plugin-transform-regenerator "^6.21.0" + babel-polyfill "^6.23.0" + babel-preset-es2015 "^6.18.0" + +abab@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +acorn-globals@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + dependencies: + acorn "^2.1.0" + +acorn@^2.1.0, acorn@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +amqp-connection-manager@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/amqp-connection-manager/-/amqp-connection-manager-1.3.5.tgz#4b4725fe96485ca0ad2aca8790e6d38800776449" + dependencies: + es6-promise "^3.0.2" + lodash "^4.15.0" + promise-breaker "^3.0.0" + when "^3.7.3" + +amqp-winston@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/amqp-winston/-/amqp-winston-1.0.7.tgz#017e267e54a1f26719f2401c4b9bb4585f3c0e27" + dependencies: + amqp "^0.2.0" + winston "^0.8.3" + +amqp@^0.2.0: + version "0.2.6" + resolved "https://registry.yarnpkg.com/amqp/-/amqp-0.2.6.tgz#d97fee5143026fa0b4fd6a5d56485f0448eb37ca" + dependencies: + lodash "^4.0.0" + +amqplib@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.1.tgz#7cccfebabe56c2e984ea7a2243f7cefe6fbfc6cf" + dependencies: + bitsyntax "~0.0.4" + bluebird "^3.4.6" + buffer-more-ints "0.0.2" + readable-stream "1.x >=1.1.9" + +ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +append-transform@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.3.0.tgz#d6933ce4a85f09445d9ccc4cc119051b7381a813" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@0.2.x, async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@^1.4.0, async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" + dependencies: + lodash "^4.14.0" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-cli, babel-cli@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.18.0.tgz#92117f341add9dead90f6fa7d0a97c0cc08ec186" + dependencies: + babel-core "^6.18.0" + babel-polyfill "^6.16.0" + babel-register "^6.18.0" + babel-runtime "^6.9.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^5.0.5" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.0.0" + +babel-code-frame@^6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^2.0.0" + +babel-core, babel-core@^6.0.0, babel-core@^6.18.0, babel-core@^6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.21.0.tgz#75525480c21c803f826ef3867d22c19f080a3724" + dependencies: + babel-code-frame "^6.20.0" + babel-generator "^6.21.0" + babel-helpers "^6.16.0" + babel-messages "^6.8.0" + babel-register "^6.18.0" + babel-runtime "^6.20.0" + babel-template "^6.16.0" + babel-traverse "^6.21.0" + babel-types "^6.21.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.18.0, babel-generator@^6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.21.0.tgz#605f1269c489a1c75deeca7ea16d43d4656c8494" + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.20.0" + babel-types "^6.21.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-helper-call-delegate@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" + dependencies: + babel-helper-hoist-variables "^6.18.0" + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" + dependencies: + babel-helper-function-name "^6.18.0" + babel-runtime "^6.9.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" + dependencies: + babel-helper-get-function-arity "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-get-function-arity@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-hoist-variables@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-optimise-call-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-regex@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" + dependencies: + babel-helper-optimise-call-expression "^6.18.0" + babel-messages "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helpers@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" + dependencies: + babel-runtime "^6.0.0" + babel-template "^6.16.0" + +babel-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^3.0.0" + babel-preset-jest "^18.0.0" + +babel-messages@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-check-es2015-constants@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-istanbul@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.0.0.tgz#da7324520ae0b8a44b6a078e72e883374a9fab76" + dependencies: + find-up "^1.1.2" + istanbul-lib-instrument "^1.1.4" + object-assign "^4.1.0" + test-exclude "^3.2.2" + +babel-plugin-jest-hoist@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" + +babel-plugin-syntax-async-functions, babel-plugin-syntax-async-functions@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-transform-es2015-arrow-functions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoping@^6.18.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.21.0.tgz#e840687f922e70fb2c42bb13501838c174a115ed" + dependencies: + babel-runtime "^6.20.0" + babel-template "^6.15.0" + babel-traverse "^6.21.0" + babel-types "^6.21.0" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" + dependencies: + babel-helper-define-map "^6.18.0" + babel-helper-function-name "^6.18.0" + babel-helper-optimise-call-expression "^6.18.0" + babel-helper-replace-supers "^6.18.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-template "^6.14.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-computed-properties@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" + dependencies: + babel-helper-define-map "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-destructuring@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" + dependencies: + babel-runtime "^6.9.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-for-of@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-function-name@^6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" + dependencies: + babel-helper-function-name "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.9.0" + +babel-plugin-transform-es2015-literals@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-modules-amd@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" + dependencies: + babel-plugin-transform-strict-mode "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" + dependencies: + babel-helper-hoist-variables "^6.18.0" + babel-runtime "^6.11.6" + babel-template "^6.14.0" + +babel-plugin-transform-es2015-modules-umd@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-object-super@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" + dependencies: + babel-helper-replace-supers "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-parameters@^6.18.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.21.0.tgz#46a655e6864ef984091448cdf024d87b60b2a7d8" + dependencies: + babel-helper-call-delegate "^6.18.0" + babel-helper-get-function-arity "^6.18.0" + babel-runtime "^6.9.0" + babel-template "^6.16.0" + babel-traverse "^6.21.0" + babel-types "^6.21.0" + +babel-plugin-transform-es2015-shorthand-properties@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-spread@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-sticky-regex@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-template-literals@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-unicode-regex@^6.3.13: + version "6.11.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-flow-strip-types, babel-plugin-transform-flow-strip-types@^6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.21.0.tgz#2eea3f8b5bb234339b47283feac155cfb237b948" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-object-rest-spread, babel-plugin-transform-object-rest-spread@^6.20.2: + version "6.20.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.20.2.tgz#e816c55bba77b14c16365d87e2ae48c8fd18fc2e" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.20.0" + +babel-plugin-transform-regenerator, babel-plugin-transform-regenerator@^6.16.0, babel-plugin-transform-regenerator@^6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.21.0.tgz#75d0c7e7f84f379358f508451c68a2c5fa5a9703" + dependencies: + regenerator-transform "0.9.8" + +babel-plugin-transform-strict-mode@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-polyfill@^6.16.0, babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015, babel-preset-es2015@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" + dependencies: + babel-plugin-check-es2015-constants "^6.3.13" + babel-plugin-transform-es2015-arrow-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoping "^6.18.0" + babel-plugin-transform-es2015-classes "^6.18.0" + babel-plugin-transform-es2015-computed-properties "^6.3.13" + babel-plugin-transform-es2015-destructuring "^6.18.0" + babel-plugin-transform-es2015-duplicate-keys "^6.6.0" + babel-plugin-transform-es2015-for-of "^6.18.0" + babel-plugin-transform-es2015-function-name "^6.9.0" + babel-plugin-transform-es2015-literals "^6.3.13" + babel-plugin-transform-es2015-modules-amd "^6.18.0" + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-plugin-transform-es2015-modules-systemjs "^6.18.0" + babel-plugin-transform-es2015-modules-umd "^6.18.0" + babel-plugin-transform-es2015-object-super "^6.3.13" + babel-plugin-transform-es2015-parameters "^6.18.0" + babel-plugin-transform-es2015-shorthand-properties "^6.18.0" + babel-plugin-transform-es2015-spread "^6.3.13" + babel-plugin-transform-es2015-sticky-regex "^6.3.13" + babel-plugin-transform-es2015-template-literals "^6.6.0" + babel-plugin-transform-es2015-typeof-symbol "^6.18.0" + babel-plugin-transform-es2015-unicode-regex "^6.3.13" + babel-plugin-transform-regenerator "^6.16.0" + +babel-preset-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" + dependencies: + babel-plugin-jest-hoist "^18.0.0" + +babel-register@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" + dependencies: + babel-core "^6.18.0" + babel-runtime "^6.11.6" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-runtime@^6.0.0, babel-runtime@^6.20.0, babel-runtime@^6.9.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" + dependencies: + babel-runtime "^6.9.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.21.0.tgz#69c6365804f1a4f69eb1213f85b00a818b8c21ad" + dependencies: + babel-code-frame "^6.20.0" + babel-messages "^6.8.0" + babel-runtime "^6.20.0" + babel-types "^6.21.0" + babylon "^6.11.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.21.0.tgz#314b92168891ef6d3806b7f7a917fdf87c11a4b2" + dependencies: + babel-runtime "^6.20.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0: + version "6.14.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +bitsyntax@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82" + dependencies: + buffer-more-ints "0.0.2" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.4.6, bluebird@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +buffer-more-ints@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.0.0, chokidar@^1.4.3: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" + dependencies: + marked "^0.3.6" + marked-terminal "^1.6.2" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@0.6.x: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + +colors@1.0.3, colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.8.1, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +convert-source-map@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.1.tgz#c9e37ef2490e64f6d1baa10fda852257082c25d3" + +"cssstyle@>= 0.2.36 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.1.1, debug@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" + dependencies: + is-arrayish "^0.2.1" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@^2.6.0, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^1.8.0, fb-watchman@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" + dependencies: + bser "^1.0.2" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-up@^1.0.0, find-up@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flow-bin: + version "0.37.4" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.37.4.tgz#3d8da2ef746e80e730d166e09040f4198969b76b" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +from@~0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.15" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + supports-color "^0.2.0" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^5.0.5: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" + +got@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" + dependencies: + duplexify "^3.2.0" + infinity-agent "^2.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + nested-error-stacks "^1.0.0" + object-assign "^3.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.3: + version "4.0.5" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.5.tgz#92c6ed6bb164110c50d4d8d0fbddc70806c6f8e7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@^0.4.13, iconv-lite@~0.4.13: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +infinity-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-stream@^1.0.0, is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.0-alpha.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.0.tgz#fb3f62edd5bfc6ae09da09453ded6e10ae7e483b" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-hook "^1.0.0-alpha.4" + istanbul-lib-instrument "^1.3.0" + istanbul-lib-report "^1.0.0-alpha.3" + istanbul-lib-source-maps "^1.1.0" + istanbul-reports "^1.0.0" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0.tgz#c3f9b6d226da12424064cce87fce0fb57fdfa7a2" + +istanbul-lib-hook@^1.0.0-alpha.4: + version "1.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz#8c5bb9f6fbd8526e0ae6cf639af28266906b938f" + dependencies: + append-transform "^0.3.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.1.4, istanbul-lib-instrument@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.3.1.tgz#112c25a4f2f9bc361d13d14bbff992331b974e52" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.0.0" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0-alpha.3: + version "1.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" + dependencies: + async "^1.4.2" + istanbul-lib-coverage "^1.0.0-alpha" + mkdirp "^0.5.1" + path-parse "^1.0.5" + rimraf "^2.4.3" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f" + dependencies: + istanbul-lib-coverage "^1.0.0-alpha.0" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.0.tgz#24b4eb2b1d29d50f103b369bd422f6e640aa0777" + dependencies: + handlebars "^4.0.3" + +jest: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" + dependencies: + jest-cli "^18.1.0" + +jest-changed-files@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" + +jest-cli@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^17.0.2" + jest-config "^18.1.0" + jest-environment-jsdom "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-resolve-dependencies "^18.1.0" + jest-runtime "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + node-notifier "^4.6.1" + sane "~1.4.1" + strip-ansi "^3.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^18.1.0" + jest-environment-node "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" + +jest-environment-jsdom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + jsdom "^9.9.1" + +jest-environment-node@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" + dependencies: + jest-mock "^18.0.0" + jest-util "^18.1.0" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-haste-map@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.4.1" + worker-farm "^1.3.1" + +jest-jasmine2@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^18.1.0" + jest-matchers "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" + dependencies: + chalk "^1.1.3" + pretty-format "^18.1.0" + +jest-matchers@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" + dependencies: + jest-diff "^18.1.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + pretty-format "^18.1.0" + +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" + +jest-resolve-dependencies@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" + dependencies: + jest-file-exists "^17.0.0" + jest-resolve "^18.1.0" + +jest-resolve@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" + dependencies: + browser-resolve "^1.11.2" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + resolve "^1.2.0" + +jest-runtime@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" + dependencies: + babel-core "^6.0.0" + babel-jest "^18.0.0" + babel-plugin-istanbul "^3.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^18.1.0" + jest-file-exists "^17.0.0" + jest-haste-map "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" + json-stable-stringify "^1.0.0" + micromatch "^2.3.11" + yargs "^6.3.0" + +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" + dependencies: + jest-diff "^18.1.0" + jest-file-exists "^17.0.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + natural-compare "^1.4.0" + pretty-format "^18.1.0" + +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^18.0.0" + mkdirp "^0.5.1" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" + +js-yaml@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsdom@^9.9.1: + version "9.9.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.9.1.tgz#84f3972ad394ab963233af8725211bce4d01bfd5" + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.36 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + iconv-lite "^0.4.13" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.3.1" + webidl-conversions "^3.0.1" + whatwg-encoding "^1.0.1" + whatwg-url "^4.1.0" + xml-name-validator ">= 2.0.1 < 3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +latest-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" + dependencies: + package-json "^1.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.2.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" + +lokka-transport-http@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/lokka-transport-http/-/lokka-transport-http-1.6.1.tgz#0dfbc2dc9e825f6e5821830f3f3f7f3f83a4ad65" + dependencies: + babel-runtime "6.x.x" + node-fetch "^1.5.2" + whatwg-fetch "^1.0.0" + +lokka@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/lokka/-/lokka-1.7.0.tgz#ab2e8334612d2afd359aa89047547bd7de21046c" + dependencies: + babel-runtime "6.x.x" + uuid "2.x.x" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" + dependencies: + js-tokens "^2.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" + dependencies: + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" + +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.12" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" + dependencies: + mime-db "~1.24.0" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +nan@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +nested-error-stacks@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +node-emoji@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.4.3.tgz#5272f70b823c4df6d7c39f84fd8203f35b3e5d36" + dependencies: + string.prototype.codepointat "^0.2.0" + +node-fetch@^1.5.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" + dependencies: + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" + +node-pre-gyp@^0.6.29: + version "0.6.32" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" + dependencies: + mkdirp "~0.5.1" + nopt "~3.0.6" + npmlog "^4.0.1" + rc "~1.1.6" + request "^2.79.0" + rimraf "~2.5.4" + semver "~5.3.0" + tar "~2.2.1" + tar-pack "~3.3.0" + +nodemon: + version "1.11.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" + dependencies: + chokidar "^1.4.3" + debug "^2.2.0" + es6-promise "^3.0.2" + ignore-by-default "^1.0.0" + lodash.defaults "^3.1.2" + minimatch "^3.0.0" + ps-tree "^1.0.1" + touch "1.0.0" + undefsafe "0.0.3" + update-notifier "0.5.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.3.5" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0, once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + dependencies: + got "^3.2.0" + registry-url "^3.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" + +private@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +promise-breaker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-3.0.0.tgz#bed499d1a9c35944950462baf47246fc11f19d9f" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +ps-tree@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +rc@^1.0.1, rc@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1.x >=1.1.9": + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@^2.0.2: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" + +regenerator-transform@0.9.8: + version "0.9.8" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-url@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.55.0, request@^2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.8" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.8.tgz#4871918d8a3af07289182e974e32844327b2e98b" + dependencies: + source-map "^0.5.3" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string.prototype.codepointat@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +"symbol-tree@>= 3.1.0 < 4.0.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.1.tgz#8549dd1d01fa9f893c18cc9ab0b106b4d9b168cb" + +tar-pack@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +throat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +touch@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.1, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.4" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.4.tgz#8c9dbfb52795686f166cd2023794bcf103d13c2b" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +uglify-js@^2.6: + version "2.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + +update-notifier@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" + dependencies: + chalk "^1.0.0" + configstore "^1.0.0" + is-npm "^1.0.0" + latest-version "^1.0.0" + repeating "^1.1.2" + semver-diff "^2.0.0" + string-length "^1.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid4@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/uuid4/-/uuid4-1.0.0.tgz#813aaeaf11ea2f68909c5ad57d894f83202d6720" + +uuid@2.x.x, uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.10: + version "2.0.11" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0, webidl-conversions@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-fetch@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319" + +whatwg-url@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.1.1.tgz#567074923352de781e3500d64a86aa92a971b4a4" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +when@^3.7.3: + version "3.7.7" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.7.tgz#aba03fc3bb736d6c88b091d013d8a8e590d84718" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.0.5, which@^1.1.1: + version "1.2.12" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" + dependencies: + isexe "^1.1.1" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +winston@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.0.tgz#207faaab6fccf3fe493743dd2b03dbafc7ceb78c" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +"xml-name-validator@>= 2.0.1 < 3.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.0.tgz#6ced869cd05a3dca6a1eaee38b68aeed4b0b4101" + dependencies: + camelcase "^3.0.0" + +yargs@^6.3.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/startOpenShift.sh b/startOpenShift.sh new file mode 100755 index 000000000..1a4b5e9bf --- /dev/null +++ b/startOpenShift.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +mkdir -p minishift + +MINISHIFT_RELEASE=1.1.0 + +if [ $(uname) == "Darwin" ]; then + curl -L https://github.com/minishift/minishift/releases/download/v$MINISHIFT_RELEASE/minishift-$MINISHIFT_RELEASE-darwin-amd64.tgz | tar xz -C minishift +else + curl -L https://github.com/minishift/minishift/releases/download/v$MINISHIFT_RELEASE/minishift-$MINISHIFT_RELEASE-linux-amd64.tgz | tar xz -C minishift +fi + + +# delete a maybe existing instance of minishift +./minishift/minishift delete + +mkdir -p minishift/registry-route +curl -L https://raw.githubusercontent.com/minishift/minishift/master/addons/registry-route/registry-route.addon -o minishift/registry-route/registry-route.addon +./minishift/minishift addons install minishift/registry-route --force +./minishift/minishift addons enable registry-route + +./minishift/minishift start --vm-driver virtualbox --host-only-cidr "192.168.77.1/24" --routing-suffix 192.168.77.100.nip.io \ No newline at end of file diff --git a/tests/Dockerfile b/tests/Dockerfile new file mode 100644 index 000000000..8d9db90d5 --- /dev/null +++ b/tests/Dockerfile @@ -0,0 +1,16 @@ +FROM williamyeh/ansible:centos7 + +RUN yum -y install git && yum clean all + +RUN git config --global user.email "deploytest@amazee.io" && git config --global user.name deploytest + +WORKDIR /ansible +COPY . /ansible + +COPY hosts /etc/ansible/hosts + +ENV ANSIBLE_FORCE_COLOR=true + +COPY entrypoint.sh / +ENTRYPOINT ["/entrypoint.sh"] +CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait" \ No newline at end of file diff --git a/tests/ansible.cfg b/tests/ansible.cfg new file mode 100644 index 000000000..7cfd3a148 --- /dev/null +++ b/tests/ansible.cfg @@ -0,0 +1,5 @@ +[defaults] +retry_files_enabled = False # Do not create them +gathering = explicit +host_key_checking = False +deprecation_warnings = False diff --git a/tests/docker-compose.yaml b/tests/docker-compose.yaml new file mode 100644 index 000000000..4753babbd --- /dev/null +++ b/tests/docker-compose.yaml @@ -0,0 +1,31 @@ +version: '2' +services: + tests-develop: + build: . + volumes: + - .:/ansible + environment: + - WEBHOOK_HOST=webhook-handler-develop.appuio.amazeeio.review + - WEBHOOK_PORT=80 + - WEBHOOK_PROTOCOL=http + - OPENSHIFT_ROUTE_SUFFIX=appuio.amazee.io + - REST2TASKS_HOST=rest2tasks-develop.appuio.amazeeio.review + - REST2TASKS_PORT=80 + - REST2TASKS_PROTOCOL=http + - GIT_REPO_PREFIX=git@github.com:amazeeio-ci-testing/ + - SSH_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\nMIIJKQIBAAKCAgEAuW/QMG+osFkc9c/kA8C5Ur7acYP+6Ue0X/pCU95IUBoi7l+E\nJNmgwq7dXyp3Y8lLo+eaHEXPDpRMawPBT32W6Z32jV31YfU5cm4YyFlB7S23PYIg\nqA7oldkxG+mVv3rCpVbVqJs32P548DwLlxFNot4+WMVULmdMvgDeMnGuFdcu8tgZ\nVDr6eakr8//D3ASXoGqHrEkrhaUFgke/PP4tLFESYmhuvrWTfmxlUpyYLW10Cb3N\nK+OWrtzy+Y8jHAKWxzgg0FCIlsguoqVthCGE1AVTvNEFRI8ppgWaWREJf9A0DxMw\nXagouF+MJsIaGp+4UCUO3TXapkS/luC++cjzcp4DYCVTU5SFzh13r6TbJB//x1Jc\nBKeFjx7k++gWU93KtUQmrZ+ojLBYsKREpPccg2xFT38SgK++3EaRSB7iXe2pg405\nO/yj9D05YjtlYgsow7nYmo8DYe15mNGamK4RyNenm00hEg7JYdGtCZWb1pWGuMQw\nSrSsHyDUa3K2JrmFM0he8J+xdaOOXB2dpLn7YqDkISzYMdC6s7UTJ90QaHht0B28\nZr/Vnzv9IR2uBXZECxKxHcxDPSUeFnsEZ4dOHXI3o19XWlim6Nl/J3WgnNAb3TQy\n/x6UoKnwpydjZauKTOj6JpL3aecE1qWcAow5dPFILbQBa0MI2KAcvVKVJg0CAwEA\nAQKCAgEAnoFv8GcRRyP0+DyqR3buMkeHCy7rrtWm3b9aALxpDWc54o3ss17+5kp4\nWQdApCAFMuYeOfqF4Y1rwLGmBF9ypuBqRi5BOGlXoHNxZZe+HZFNJxta9KxBrQzI\nyHYilVjGlnOiEAwVcbsa/yYkNg4JUaUsn86UhVGxLFwrkezQBEU6EUQcan47adDs\nDBXcge2++dT1gZPNyt/i1JilY+pUDKSD1XA08XjdyVu4RCQsg/AiFs2RWemg/HlK\ni30JYsDnxwQ4MDgWeORF0Ksc8KuCEYU4LZZxLUg+LnZtl6JTf1gll5ksZ3H81JR/\nhQW3MHjEIGV8ziNhcWwkZEBZncNiK2tNYuY6LiLJuGWLNZm+iySW6FnO8UE1wOg4\nt9n+D37A7dAbm39c92oej2uOWilbXjhuHJUFUPtgMDZJAvLxMtPliF9dFG5l8Kly\nuvYaTg1L5DuekOP8HjNuWwV3Wb21jeW0A/RUf7h/VKq/q/F3BbQE6wyxDUVofsMF\n9fwYqrrOMKIXPsnhk46i43TW2r3ygaYv2q56B2uM0mhfeHbrHjqnUwUS/l9cp8YC\ncsOsTn8AYCHe5fo1zv7Xto/C83wV6qQLwqOpWVkvaVYoGwhBFeTYHpV1/ata4UKA\nOtO6cAC/M9DrnWHKjhdmEshqni/G2niab8OkZkMZvRuBtD5r9bUCggEBAN5QRWnk\nBG8SRcPq87eul1pTSwoIDj1ya3CPxdI7YFCiwblYbg7dfsuEK+iSVRQCl4vGs1gR\nVLwyVNBYvl9AInKvH1zeBVXLKOwafz/ddPElbMkhjsKIc7ipvQ5HIY4rPaJCklol\nuhDD0315rmd62fh3B1fSZaJ8ARwRraavmpaMsZvaDLIeA7iiG7mm+YYsjI6G2HW3\nHR7V7sTBq/yIY5YJUtBjZRxi5E0hkRmX3xmy/rEaBsyFhTBBqrHzlfun1dr1nJbh\naTocMdvPb1uByy+PQ/u6V1k3asEAUDEBSDAQWGylivINObXJ7SRQD9UibsqA6J9j\nwrXLkkTINSP6JJsCggEBANWJD4T60kGZC8A5Fhz7wgBh/NNKxIY4eYkQCWSud0iW\ncZ7TChIcBj5V/WQiVt8IGc4c7cPkvhHu66ZPBChUNj0BG5xNzBkpILi3zn3x5qRB\ntiISFI6DOoHNfma05Ok9KJI2v4vS6e1BLIF34Npi0KoxOfycJVb3N4jQLBc5eZSr\nbvyD74/3BByWFNvr4sE1PpTo6Hs5WOzTXzi0qinhOPDc4TwCbr4ggiKzsQAzqU4z\nEXY37pUeH7CTHSBidCaW47m428T5VJSL3TFKwYcuE7ZkprjQT0FiLgea4/+KQ0US\nMFUM6OO/4qtKcuocDGe+Mrut3T0kCmnSosIxx3g/hncCggEAYB/TM6r8483Bzqmb\ngdOC6/JR4t+C0LzVidEQlwtHZPZKz0pWJCVPes4GckQ7dzB7uFtNFoo/2jPlCkUk\n42iGvJHN/MifA+6ZHiWC2el2dAJbnEffQ2vepXz3GuJUtvUpbCxevY3Mew1BN+LS\nLzomX1GQIj/95Bi8Hhfivsz1CZ2B+kJ49NcXgtDNLiPthj9i8wmJNLTdaYTU/cxE\nAigy7x/O5/3iLTjxQAyAgdFyDNmhWJBJWkttQGVUWidZtXtnc4p5j5+dcRvZzxJN\nMwLXCRRoL8Ltm8zjYtow0k+cl/OpWCjoACsJxfmuiOH5Ro3h27uLWce33AVOlGEA\n4TJ6ewKCAQAScrryhDDyFeTcAJKWgnGqUszi/EyqQ+rMGqSVHDWWAdljHVx7YAxy\nCj/QDN9weWSxV/J6wCJjrj6RqbX0PgJJlvTpthbx/YmkK80dOG7ytfKkUuePwGqn\nmDdZbDtyoyQELdKyo9At/Tl5HgBBHdRlP8eAuYTIVKdpnIKSpxaH75+xFTz3NSIX\nzieTMHfwtUbo2o5rRvMV0tUhMwqYf6rJtGuJIbSrnGdh1CBwogX4iZTyn7ZvD6Ex\nQiR8DcV3KAYYn43tIJVcGBFOFuVNZn+xfFSjFuwh+/d6FLmp9CoHp6ChWHIuav+M\nSOxQqYew1s/PQyAgDiMQLXB+UoqnKuXVAoIBAQCBRcSjXWseY+/Uvqj+41kKcEFL\nT7AuJcrb9fpN0EYbrTlaU1yVDfYxnRn4Pw2de1XE/S2dngvriraFHrY/fnyRqM5C\ns/1QnzAjb+y/Vvvt/RaDYXwpm8KpSrd3vqwj7TsoYgWiSvmbjYOg6Gt8QJZNmfhS\nYexGNfR/Zr8jdK9ZC6Tqwt2yUuBtVS3wWmX7Dqz3/kAfJ+tNp7CQNGw7TOMXH071\nfU/ZNna8w+9G3mxSRWM+wxIg7pPZ4floXVJGTcYl6+pG8a1saUNRwx72+pt3XUMD\nXYS+IJhFCIXCuehmfDIp7Fe8Ed2s1QDbF/vdc+icTah12SF/XhZ+6clY8j2Y\n-----END RSA PRIVATE KEY----- + tests-master: + build: . + volumes: + - .:/ansible + environment: + - WEBHOOK_HOST=hooks.amazee.io + - WEBHOOK_PORT=443 + - WEBHOOK_PROTOCOL=https + - REST2TASKS_HOST=rest2tasks.amazeeio.cloud + - REST2TASKS_PORT=443 + - REST2TASKS_PROTOCOL=https + - OPENSHIFT_ROUTE_SUFFIX=appuio.amazee.io + - GIT_REPO_PREFIX=git@github.com:amazeeio-ci-testing/ + - SSH_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\nMIIJKQIBAAKCAgEAuW/QMG+osFkc9c/kA8C5Ur7acYP+6Ue0X/pCU95IUBoi7l+E\nJNmgwq7dXyp3Y8lLo+eaHEXPDpRMawPBT32W6Z32jV31YfU5cm4YyFlB7S23PYIg\nqA7oldkxG+mVv3rCpVbVqJs32P548DwLlxFNot4+WMVULmdMvgDeMnGuFdcu8tgZ\nVDr6eakr8//D3ASXoGqHrEkrhaUFgke/PP4tLFESYmhuvrWTfmxlUpyYLW10Cb3N\nK+OWrtzy+Y8jHAKWxzgg0FCIlsguoqVthCGE1AVTvNEFRI8ppgWaWREJf9A0DxMw\nXagouF+MJsIaGp+4UCUO3TXapkS/luC++cjzcp4DYCVTU5SFzh13r6TbJB//x1Jc\nBKeFjx7k++gWU93KtUQmrZ+ojLBYsKREpPccg2xFT38SgK++3EaRSB7iXe2pg405\nO/yj9D05YjtlYgsow7nYmo8DYe15mNGamK4RyNenm00hEg7JYdGtCZWb1pWGuMQw\nSrSsHyDUa3K2JrmFM0he8J+xdaOOXB2dpLn7YqDkISzYMdC6s7UTJ90QaHht0B28\nZr/Vnzv9IR2uBXZECxKxHcxDPSUeFnsEZ4dOHXI3o19XWlim6Nl/J3WgnNAb3TQy\n/x6UoKnwpydjZauKTOj6JpL3aecE1qWcAow5dPFILbQBa0MI2KAcvVKVJg0CAwEA\nAQKCAgEAnoFv8GcRRyP0+DyqR3buMkeHCy7rrtWm3b9aALxpDWc54o3ss17+5kp4\nWQdApCAFMuYeOfqF4Y1rwLGmBF9ypuBqRi5BOGlXoHNxZZe+HZFNJxta9KxBrQzI\nyHYilVjGlnOiEAwVcbsa/yYkNg4JUaUsn86UhVGxLFwrkezQBEU6EUQcan47adDs\nDBXcge2++dT1gZPNyt/i1JilY+pUDKSD1XA08XjdyVu4RCQsg/AiFs2RWemg/HlK\ni30JYsDnxwQ4MDgWeORF0Ksc8KuCEYU4LZZxLUg+LnZtl6JTf1gll5ksZ3H81JR/\nhQW3MHjEIGV8ziNhcWwkZEBZncNiK2tNYuY6LiLJuGWLNZm+iySW6FnO8UE1wOg4\nt9n+D37A7dAbm39c92oej2uOWilbXjhuHJUFUPtgMDZJAvLxMtPliF9dFG5l8Kly\nuvYaTg1L5DuekOP8HjNuWwV3Wb21jeW0A/RUf7h/VKq/q/F3BbQE6wyxDUVofsMF\n9fwYqrrOMKIXPsnhk46i43TW2r3ygaYv2q56B2uM0mhfeHbrHjqnUwUS/l9cp8YC\ncsOsTn8AYCHe5fo1zv7Xto/C83wV6qQLwqOpWVkvaVYoGwhBFeTYHpV1/ata4UKA\nOtO6cAC/M9DrnWHKjhdmEshqni/G2niab8OkZkMZvRuBtD5r9bUCggEBAN5QRWnk\nBG8SRcPq87eul1pTSwoIDj1ya3CPxdI7YFCiwblYbg7dfsuEK+iSVRQCl4vGs1gR\nVLwyVNBYvl9AInKvH1zeBVXLKOwafz/ddPElbMkhjsKIc7ipvQ5HIY4rPaJCklol\nuhDD0315rmd62fh3B1fSZaJ8ARwRraavmpaMsZvaDLIeA7iiG7mm+YYsjI6G2HW3\nHR7V7sTBq/yIY5YJUtBjZRxi5E0hkRmX3xmy/rEaBsyFhTBBqrHzlfun1dr1nJbh\naTocMdvPb1uByy+PQ/u6V1k3asEAUDEBSDAQWGylivINObXJ7SRQD9UibsqA6J9j\nwrXLkkTINSP6JJsCggEBANWJD4T60kGZC8A5Fhz7wgBh/NNKxIY4eYkQCWSud0iW\ncZ7TChIcBj5V/WQiVt8IGc4c7cPkvhHu66ZPBChUNj0BG5xNzBkpILi3zn3x5qRB\ntiISFI6DOoHNfma05Ok9KJI2v4vS6e1BLIF34Npi0KoxOfycJVb3N4jQLBc5eZSr\nbvyD74/3BByWFNvr4sE1PpTo6Hs5WOzTXzi0qinhOPDc4TwCbr4ggiKzsQAzqU4z\nEXY37pUeH7CTHSBidCaW47m428T5VJSL3TFKwYcuE7ZkprjQT0FiLgea4/+KQ0US\nMFUM6OO/4qtKcuocDGe+Mrut3T0kCmnSosIxx3g/hncCggEAYB/TM6r8483Bzqmb\ngdOC6/JR4t+C0LzVidEQlwtHZPZKz0pWJCVPes4GckQ7dzB7uFtNFoo/2jPlCkUk\n42iGvJHN/MifA+6ZHiWC2el2dAJbnEffQ2vepXz3GuJUtvUpbCxevY3Mew1BN+LS\nLzomX1GQIj/95Bi8Hhfivsz1CZ2B+kJ49NcXgtDNLiPthj9i8wmJNLTdaYTU/cxE\nAigy7x/O5/3iLTjxQAyAgdFyDNmhWJBJWkttQGVUWidZtXtnc4p5j5+dcRvZzxJN\nMwLXCRRoL8Ltm8zjYtow0k+cl/OpWCjoACsJxfmuiOH5Ro3h27uLWce33AVOlGEA\n4TJ6ewKCAQAScrryhDDyFeTcAJKWgnGqUszi/EyqQ+rMGqSVHDWWAdljHVx7YAxy\nCj/QDN9weWSxV/J6wCJjrj6RqbX0PgJJlvTpthbx/YmkK80dOG7ytfKkUuePwGqn\nmDdZbDtyoyQELdKyo9At/Tl5HgBBHdRlP8eAuYTIVKdpnIKSpxaH75+xFTz3NSIX\nzieTMHfwtUbo2o5rRvMV0tUhMwqYf6rJtGuJIbSrnGdh1CBwogX4iZTyn7ZvD6Ex\nQiR8DcV3KAYYn43tIJVcGBFOFuVNZn+xfFSjFuwh+/d6FLmp9CoHp6ChWHIuav+M\nSOxQqYew1s/PQyAgDiMQLXB+UoqnKuXVAoIBAQCBRcSjXWseY+/Uvqj+41kKcEFL\nT7AuJcrb9fpN0EYbrTlaU1yVDfYxnRn4Pw2de1XE/S2dngvriraFHrY/fnyRqM5C\ns/1QnzAjb+y/Vvvt/RaDYXwpm8KpSrd3vqwj7TsoYgWiSvmbjYOg6Gt8QJZNmfhS\nYexGNfR/Zr8jdK9ZC6Tqwt2yUuBtVS3wWmX7Dqz3/kAfJ+tNp7CQNGw7TOMXH071\nfU/ZNna8w+9G3mxSRWM+wxIg7pPZ4floXVJGTcYl6+pG8a1saUNRwx72+pt3XUMD\nXYS+IJhFCIXCuehmfDIp7Fe8Ed2s1QDbF/vdc+icTah12SF/XhZ+6clY8j2Y\n-----END RSA PRIVATE KEY----- + diff --git a/tests/entrypoint.sh b/tests/entrypoint.sh new file mode 100755 index 000000000..bd013e2e5 --- /dev/null +++ b/tests/entrypoint.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -e + +if [ ! -z "$SSH_PRIVATE_KEY" ]; then + mkdir -p ~/.ssh + echo -e "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa + chmod 400 ~/.ssh/id_rsa + + eval $(ssh-agent) + ssh-add ~/.ssh/id_rsa +fi + +echo -e "Host * \n StrictHostKeyChecking no" > ~/.ssh/config + +exec "$@" \ No newline at end of file diff --git a/tests/files/node6/.amazeeio.Dockerfile b/tests/files/node6/.amazeeio.Dockerfile new file mode 100644 index 000000000..a01863927 --- /dev/null +++ b/tests/files/node6/.amazeeio.Dockerfile @@ -0,0 +1,17 @@ +FROM amazeeio/centos7-node-builder:6 as builder +COPY package.json yarn.lock /app/ +RUN yarn install + +FROM amazeeio/centos7-node:6 +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +ARG AMAZEEIO_GIT_SHA=0000000000000000000000000000000000000000 +ENV AMAZEEIO_GIT_SHA ${AMAZEEIO_GIT_SHA} + +ARG AMAZEEIO_GIT_BRANCH=undefined +ENV AMAZEEIO_GIT_BRANCH ${AMAZEEIO_GIT_BRANCH} + +EXPOSE 3000 + +CMD yarn start diff --git a/tests/files/node6/.dockerignore b/tests/files/node6/.dockerignore new file mode 100644 index 000000000..b512c09d4 --- /dev/null +++ b/tests/files/node6/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/tests/files/node6/index.js b/tests/files/node6/index.js new file mode 100644 index 000000000..901db7610 --- /dev/null +++ b/tests/files/node6/index.js @@ -0,0 +1,10 @@ +const express = require('express') +const app = express() + +app.get('/', function (req, res) { + res.send(`AMAZEEIO_GIT_SHA: ${process.env.AMAZEEIO_GIT_SHA}
AMAZEEIO_GIT_BRANCH: ${process.env.AMAZEEIO_GIT_BRANCH}`) +}) + +app.listen(3000, function () { + console.log('Example app listening on port 3000!') +}) diff --git a/tests/files/node6/package.json b/tests/files/node6/package.json new file mode 100644 index 000000000..b577e5e02 --- /dev/null +++ b/tests/files/node6/package.json @@ -0,0 +1,12 @@ +{ + "name": "node", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "express": "^4.15.3" + }, + "scripts": { + "start": "node index.js" + } +} diff --git a/tests/files/node6/yarn.lock b/tests/files/node6/yarn.lock new file mode 100644 index 000000000..d9c4cd462 --- /dev/null +++ b/tests/files/node6/yarn.lock @@ -0,0 +1,247 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +express@^4.15.3: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.7" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.4" + qs "6.4.0" + range-parser "~1.2.0" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +finalhandler@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ipaddr.js@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@~2.1.11, mime-types@~2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +proxy-addr@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.3.0" + +qs@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.3" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +vary@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" diff --git a/tests/files/node6_subfolder/subfolder/.amazeeio.Dockerfile b/tests/files/node6_subfolder/subfolder/.amazeeio.Dockerfile new file mode 100644 index 000000000..a01863927 --- /dev/null +++ b/tests/files/node6_subfolder/subfolder/.amazeeio.Dockerfile @@ -0,0 +1,17 @@ +FROM amazeeio/centos7-node-builder:6 as builder +COPY package.json yarn.lock /app/ +RUN yarn install + +FROM amazeeio/centos7-node:6 +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +ARG AMAZEEIO_GIT_SHA=0000000000000000000000000000000000000000 +ENV AMAZEEIO_GIT_SHA ${AMAZEEIO_GIT_SHA} + +ARG AMAZEEIO_GIT_BRANCH=undefined +ENV AMAZEEIO_GIT_BRANCH ${AMAZEEIO_GIT_BRANCH} + +EXPOSE 3000 + +CMD yarn start diff --git a/tests/files/node6_subfolder/subfolder/.dockerignore b/tests/files/node6_subfolder/subfolder/.dockerignore new file mode 100644 index 000000000..b512c09d4 --- /dev/null +++ b/tests/files/node6_subfolder/subfolder/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/tests/files/node6_subfolder/subfolder/index.js b/tests/files/node6_subfolder/subfolder/index.js new file mode 100644 index 000000000..901db7610 --- /dev/null +++ b/tests/files/node6_subfolder/subfolder/index.js @@ -0,0 +1,10 @@ +const express = require('express') +const app = express() + +app.get('/', function (req, res) { + res.send(`AMAZEEIO_GIT_SHA: ${process.env.AMAZEEIO_GIT_SHA}
AMAZEEIO_GIT_BRANCH: ${process.env.AMAZEEIO_GIT_BRANCH}`) +}) + +app.listen(3000, function () { + console.log('Example app listening on port 3000!') +}) diff --git a/tests/files/node6_subfolder/subfolder/package.json b/tests/files/node6_subfolder/subfolder/package.json new file mode 100644 index 000000000..b577e5e02 --- /dev/null +++ b/tests/files/node6_subfolder/subfolder/package.json @@ -0,0 +1,12 @@ +{ + "name": "node", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "express": "^4.15.3" + }, + "scripts": { + "start": "node index.js" + } +} diff --git a/tests/files/node6_subfolder/subfolder/yarn.lock b/tests/files/node6_subfolder/subfolder/yarn.lock new file mode 100644 index 000000000..d9c4cd462 --- /dev/null +++ b/tests/files/node6_subfolder/subfolder/yarn.lock @@ -0,0 +1,247 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +express@^4.15.3: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.7" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.4" + qs "6.4.0" + range-parser "~1.2.0" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +finalhandler@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ipaddr.js@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@~2.1.11, mime-types@~2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +proxy-addr@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.3.0" + +qs@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.3" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +vary@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" diff --git a/tests/files/node8/.amazeeio.Dockerfile b/tests/files/node8/.amazeeio.Dockerfile new file mode 100644 index 000000000..4f2dfbc64 --- /dev/null +++ b/tests/files/node8/.amazeeio.Dockerfile @@ -0,0 +1,17 @@ +FROM amazeeio/centos7-node-builder:8 as builder +COPY package.json yarn.lock /app/ +RUN yarn install + +FROM amazeeio/centos7-node:8 +COPY --from=builder /app/node_modules /app/node_modules +COPY . /app/ + +ARG AMAZEEIO_GIT_SHA=0000000000000000000000000000000000000000 +ENV AMAZEEIO_GIT_SHA ${AMAZEEIO_GIT_SHA} + +ARG AMAZEEIO_GIT_BRANCH=undefined +ENV AMAZEEIO_GIT_BRANCH ${AMAZEEIO_GIT_BRANCH} + +EXPOSE 3000 + +CMD yarn start diff --git a/tests/files/node8/.dockerignore b/tests/files/node8/.dockerignore new file mode 100644 index 000000000..b512c09d4 --- /dev/null +++ b/tests/files/node8/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/tests/files/node8/index.js b/tests/files/node8/index.js new file mode 100644 index 000000000..901db7610 --- /dev/null +++ b/tests/files/node8/index.js @@ -0,0 +1,10 @@ +const express = require('express') +const app = express() + +app.get('/', function (req, res) { + res.send(`AMAZEEIO_GIT_SHA: ${process.env.AMAZEEIO_GIT_SHA}
AMAZEEIO_GIT_BRANCH: ${process.env.AMAZEEIO_GIT_BRANCH}`) +}) + +app.listen(3000, function () { + console.log('Example app listening on port 3000!') +}) diff --git a/tests/files/node8/package.json b/tests/files/node8/package.json new file mode 100644 index 000000000..b577e5e02 --- /dev/null +++ b/tests/files/node8/package.json @@ -0,0 +1,12 @@ +{ + "name": "node", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "express": "^4.15.3" + }, + "scripts": { + "start": "node index.js" + } +} diff --git a/tests/files/node8/yarn.lock b/tests/files/node8/yarn.lock new file mode 100644 index 000000000..d9c4cd462 --- /dev/null +++ b/tests/files/node8/yarn.lock @@ -0,0 +1,247 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +express@^4.15.3: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.7" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.4" + qs "6.4.0" + range-parser "~1.2.0" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +finalhandler@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ipaddr.js@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@~2.1.11, mime-types@~2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +proxy-addr@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.3.0" + +qs@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.3" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +vary@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" diff --git a/tests/hosts b/tests/hosts new file mode 100644 index 000000000..05614f63f --- /dev/null +++ b/tests/hosts @@ -0,0 +1 @@ +localhost ansible_connection=local \ No newline at end of file diff --git a/tests/playbooks/helpers/just-push.yaml b/tests/playbooks/helpers/just-push.yaml new file mode 100644 index 000000000..5170c865e --- /dev/null +++ b/tests/playbooks/helpers/just-push.yaml @@ -0,0 +1,21 @@ +- name: just push + hosts: localhost + serial: 1 + tasks: + - name: getting HEAD hash + command: git rev-parse HEAD + args: + chdir: /{{git_repo_name}} + register: result + + - set_fact: + current_head: "{{ result.stdout }}" + +- name: push + hosts: localhost + serial: 1 + vars: + git_hash_push: "{{ current_head }}" + git_repo_ssh_url: "{{ lookup('env','GIT_REPO_PREFIX') }}{{ git_repo_name }}" + tasks: + - include: ../../tasks/webhook-github/push.yaml \ No newline at end of file diff --git a/tests/playbooks/helpers/testing.yaml b/tests/playbooks/helpers/testing.yaml new file mode 100644 index 000000000..c64f72bce --- /dev/null +++ b/tests/playbooks/helpers/testing.yaml @@ -0,0 +1,5 @@ +- name: webhook push delete + hosts: localhost + serial: 1 + tasks: + - include: ../../tests/test-url-returncode.yaml \ No newline at end of file diff --git a/tests/playbooks/helpers/webhook-push-delete.yaml b/tests/playbooks/helpers/webhook-push-delete.yaml new file mode 100644 index 000000000..da1e79273 --- /dev/null +++ b/tests/playbooks/helpers/webhook-push-delete.yaml @@ -0,0 +1,7 @@ +- name: webhook push delete + hosts: localhost + serial: 1 + vars: + git_repo_ssh_url: "{{ lookup('env','GIT_REPO_PREFIX') }}{{ git_repo_name }}" + tasks: + - include: ../../tasks/github/push-delete.yaml \ No newline at end of file diff --git a/tests/playbooks/node.yaml b/tests/playbooks/node.yaml new file mode 100644 index 000000000..3e55a494f --- /dev/null +++ b/tests/playbooks/node.yaml @@ -0,0 +1,72 @@ +--- +- include: node/rest.yaml + vars: + testname: "REST - node 8 with slash branch" + node_version: 8 + git_repo_name: node.git + sitegroup1: ci-node1 + sitegroup2: ci-node2 + branch: slash/branch1 + +- include: node/rest.yaml + vars: + testname: "REST - node 8 regular branch" + node_version: 8 + git_repo_name: node.git + sitegroup1: ci-node1 + sitegroup2: ci-node2 + branch: branch1 + +- include: node/rest.yaml + vars: + testname: "REST - node 6 inside subfolder" + node_version: 6_subfolder + git_repo_name: node_subfolder.git + sitegroup1: ci-node_subfolder1 + sitegroup2: ci-node_subfolder2 + branch: branch1 + +- include: node/rest.yaml + vars: + testname: "REST - node 6 regular branch" + node_version: 6 + git_repo_name: node.git + sitegroup1: ci-node1 + sitegroup2: ci-node2 + branch: branch1 + +- include: node/github.yaml + vars: + testname: "GITHUB - node 8 with slash branch" + node_version: 8 + git_repo_name: node.git + sitegroup1: ci-node1 + sitegroup2: ci-node2 + branch: slash/branch1 + +- include: node/github.yaml + vars: + testname: "GITHUB - node 8 regular branch" + node_version: 8 + git_repo_name: node.git + sitegroup1: ci-node1 + sitegroup2: ci-node2 + branch: branch1 + +- include: node/github.yaml + vars: + testname: "GITHUB - node 6 inside subfolder" + node_version: 6_subfolder + git_repo_name: node_subfolder.git + sitegroup1: ci-node_subfolder1 + sitegroup2: ci-node_subfolder2 + branch: branch1 + +- include: node/github.yaml + vars: + testname: "GITHUB - node 6 regular branch" + node_version: 6 + git_repo_name: node.git + sitegroup1: ci-node1 + sitegroup2: ci-node2 + branch: branch1 \ No newline at end of file diff --git a/tests/playbooks/node/check-deployed.yaml b/tests/playbooks/node/check-deployed.yaml new file mode 100644 index 000000000..616694997 --- /dev/null +++ b/tests/playbooks/node/check-deployed.yaml @@ -0,0 +1,35 @@ +- name: "{{ testname }} - check if sitegroup1 is deployed with searching for the hash" + hosts: localhost + serial: 1 + vars: + url: "http://{{ sitegroup1 | regex_replace('_', '-') }}.{{ branch | regex_replace('/', '-') }}.{{ lookup('env','OPENSHIFT_ROUTE_SUFFIX') }}" + expected_content: "{{ expected_head }}" + tasks: + - include: ../../tests/test-url-content.yaml + +- name: "{{ testname }} - check if sitegroup2 is deployed with searching for the hash" + hosts: localhost + serial: 1 + vars: + url: "http://{{ sitegroup2 | regex_replace('_', '-') }}.{{ branch | regex_replace('/', '-') }}.{{ lookup('env','OPENSHIFT_ROUTE_SUFFIX') }}" + expected_content: "{{ expected_head }}" + tasks: + - include: ../../tests/test-url-content.yaml + +- name: "{{ testname }} - check if sitegroup1 is deployed with searching for the branch name" + hosts: localhost + serial: 1 + vars: + url: "http://{{ sitegroup1 | regex_replace('_', '-') }}.{{ branch | regex_replace('/', '-') }}.{{ lookup('env','OPENSHIFT_ROUTE_SUFFIX') }}" + expected_content: "{{ expected_branch }}" + tasks: + - include: ../../tests/test-url-content.yaml + +- name: "{{ testname }} - check if sitegroup2 is deployed with searching for the branch name" + hosts: localhost + serial: 1 + vars: + url: "http://{{ sitegroup2 | regex_replace('_', '-') }}.{{ branch | regex_replace('/', '-') }}.{{ lookup('env','OPENSHIFT_ROUTE_SUFFIX') }}" + expected_content: "{{ expected_branch }}" + tasks: + - include: ../../tests/test-url-content.yaml \ No newline at end of file diff --git a/tests/playbooks/node/github.yaml b/tests/playbooks/node/github.yaml new file mode 100644 index 000000000..d6ca6e044 --- /dev/null +++ b/tests/playbooks/node/github.yaml @@ -0,0 +1,105 @@ + +- name: "{{ testname }} - init git, add files, commit, git push" + hosts: localhost + serial: 1 + vars: + git_files: "node{{ node_version }}/" + tasks: + - include: ../../tasks/git-init.yaml + - include: ../../tasks/git-add-commit-push.yaml + +- name: "{{ testname }} - webhook github push first commit hash to repo" + hosts: localhost + serial: 1 + vars: + git_hash_push: "{{ current_head }}" + git_repo_ssh_url: "{{ lookup('env','GIT_REPO_PREFIX') }}{{ git_repo_name }}" + tasks: + - include: ../../tasks/webhook-github/push.yaml + + +- include: check-deployed.yaml + vars: + expected_head: "{{ current_head }}" + expected_branch: "{{ branch }}" + sitegroup1: "{{ sitegroup1 }}" + sitegroup2: "{{ sitegroup2 }}" + +- name: "{{ testname }} - second commit (empty) and git push into same git repo" + hosts: localhost + serial: 1 + tasks: + - include: ../../tasks/git-empty-commit-push.yaml + +- name: "{{ testname }} - webhook github push second commit hash to repo" + hosts: localhost + serial: 1 + vars: + git_hash_push: "{{ current_head }}" + git_repo_ssh_url: "{{ lookup('env','GIT_REPO_PREFIX') }}{{ git_repo_name }}" + tasks: + - include: ../../tasks/webhook-github/push.yaml + +- include: check-deployed.yaml + vars: + expected_head: "{{ current_head }}" + expected_branch: "{{ branch }}" + sitegroup1: "{{ sitegroup1 }}" + sitegroup2: "{{ sitegroup2 }}" + +- name: "{{ testname }} - third commit (empty) and git push into same git repo - no webhook push yet" + hosts: localhost + serial: 1 + tasks: + - include: ../../tasks/git-empty-commit-push.yaml + - set_fact: + third_commit_hash: "{{ current_head }}" + + +- name: "{{ testname }} - fourth commit (empty) and git push into same git repo" + hosts: localhost + serial: 1 + tasks: + - include: ../../tasks/git-empty-commit-push.yaml + +- name: "{{ testname }} - webhook github push for third commit (fourth commit exists but will not yet be deployed)" + hosts: localhost + serial: 1 + vars: + git_hash_push: "{{ third_commit_hash }}" + git_repo_ssh_url: "{{ lookup('env','GIT_REPO_PREFIX') }}{{ git_repo_name }}" + tasks: + - include: ../../tasks/webhook-github/push.yaml + +- include: check-deployed.yaml + vars: + expected_head: "{{ third_commit_hash }}" + expected_branch: "{{ branch }}" + sitegroup1: "{{ sitegroup1 }}" + sitegroup2: "{{ sitegroup2 }}" + +- name: "{{ testname }} - webhook github delete push" + hosts: localhost + serial: 1 + vars: + git_repo_ssh_url: "{{ lookup('env','GIT_REPO_PREFIX') }}{{ git_repo_name }}" + tasks: + - include: ../../tasks/webhook-github/push-delete.yaml + +- name: "{{ testname }} - check if site for sitegroup1 does not exist anymore" + hosts: localhost + serial: 1 + vars: + url: "http://{{ sitegroup1 | regex_replace('_', '-') }}.{{ branch | regex_replace('/', '-') }}.{{ lookup('env','OPENSHIFT_ROUTE_SUFFIX') }}" + expected_returncode: 503 + tasks: + - include: ../../tests/test-url-returncode.yaml + +- name: "{{ testname }} - check if site for sitegroup2 does not exist anymore" + hosts: localhost + serial: 1 + vars: + url: "http://{{ sitegroup2 | regex_replace('_', '-') }}.{{ branch | regex_replace('/', '-') }}.{{ lookup('env','OPENSHIFT_ROUTE_SUFFIX') }}" + expected_returncode: 503 + tasks: + - include: ../../tests/test-url-returncode.yaml \ No newline at end of file diff --git a/tests/playbooks/node/rest.yaml b/tests/playbooks/node/rest.yaml new file mode 100644 index 000000000..a6d734c68 --- /dev/null +++ b/tests/playbooks/node/rest.yaml @@ -0,0 +1,163 @@ + +- name: "{{ testname }} - init git, add files, commit, git push" + hosts: localhost + serial: 1 + vars: + git_files: "node{{ node_version }}/" + tasks: + - include: ../../tasks/git-init.yaml + - include: ../../tasks/git-add-commit-push.yaml + +- name: "{{ testname }} - rest2tasks deploy post for just git branchon sitegroup1, which should deploy the first commit" + hosts: localhost + serial: 1 + vars: + branch: "{{ branch }}" + sitegroup: "{{ sitegroup1 }}" + tasks: + - include: ../../tasks/rest/deploy-no-sha.yaml + +- name: "{{ testname }} - rest2tasks deploy post for just git branchon sitegroup2, which should deploy the first commit" + hosts: localhost + serial: 1 + vars: + branch: "{{ branch }}" + sitegroup: "{{ sitegroup2 }}" + tasks: + - include: ../../tasks/rest/deploy-no-sha.yaml + +- include: check-deployed.yaml + vars: + expected_head: "{{ current_head }}" + expected_branch: "{{ branch }}" + sitegroup1: "{{ sitegroup1 }}" + sitegroup2: "{{ sitegroup2 }}" + +- name: "{{ testname }} - second commit (empty) and git push into same git repo" + hosts: localhost + serial: 1 + tasks: + - include: ../../tasks/git-empty-commit-push.yaml + - set_fact: + second_commit_hash: "{{ current_head }}" + +- name: "{{ testname }} - third commit (empty) and git push into same git repo" + hosts: localhost + serial: 1 + tasks: + - include: ../../tasks/git-empty-commit-push.yaml + +- name: "{{ testname }} - rest2tasks deploy post with sha of second commit on sitegroup1, which should deploy the second commit" + hosts: localhost + serial: 1 + vars: + branch: "{{ branch }}" + sitegroup: "{{ sitegroup1 }}" + sha: "{{ second_commit_hash }}" + tasks: + - include: ../../tasks/rest/deploy-sha.yaml + +- name: "{{ testname }} - rest2tasks deploy post with sha of second commit on sitegroup2, which should deploy the second commit" + hosts: localhost + serial: 1 + vars: + branch: "{{ branch }}" + sitegroup: "{{ sitegroup2 }}" + sha: "{{ second_commit_hash }}" + tasks: + - include: ../../tasks/rest/deploy-sha.yaml + +- include: check-deployed.yaml + vars: + expected_head: "{{ second_commit_hash }}" + expected_branch: "{{ branch }}" + sitegroup1: "{{ sitegroup1 }}" + sitegroup2: "{{ sitegroup2 }}" + +- name: "{{ testname }} - rest2tasks deploy post for just git branch on sitegroup1, which should deploy the third commit" + hosts: localhost + serial: 1 + vars: + branch: "{{ branch }}" + sitegroup: "{{ sitegroup1 }}" + tasks: + - include: ../../tasks/rest/deploy-no-sha.yaml + +- name: "{{ testname }} - rest2tasks deploy post for just git branchon sitegroup2, which should deploy the third commit" + hosts: localhost + serial: 1 + vars: + branch: "{{ branch }}" + sitegroup: "{{ sitegroup2 }}" + tasks: + - include: ../../tasks/rest/deploy-no-sha.yaml + +- include: check-deployed.yaml + vars: + expected_head: "{{ current_head }}" + expected_branch: "{{ branch }}" + sitegroup1: "{{ sitegroup1 }}" + sitegroup2: "{{ sitegroup2 }}" + +- name: "{{ testname }} - rest2tasks deploy post with sha of second commit on sitegroup1, which should deploy again the second commit even we had a deployment of the branch before" + hosts: localhost + serial: 1 + vars: + branch: "{{ branch }}" + sitegroup: "{{ sitegroup1 }}" + sha: "{{ second_commit_hash }}" + tasks: + - include: ../../tasks/rest/deploy-sha.yaml + +- name: "{{ testname }} - rest2tasks deploy post with sha of second commit on sitegroup2, which should deploy again the second commit even we had a deployment of the branch before" + hosts: localhost + serial: 1 + vars: + branch: "{{ branch }}" + sitegroup: "{{ sitegroup2 }}" + sha: "{{ second_commit_hash }}" + tasks: + - include: ../../tasks/rest/deploy-sha.yaml + +- include: check-deployed.yaml + vars: + expected_head: "{{ second_commit_hash }}" + expected_branch: "{{ branch }}" + sitegroup1: "{{ sitegroup1 }}" + sitegroup2: "{{ sitegroup2 }}" + +- name: "{{ testname }} - rest2tasks /remove POST on sitegroup1, which should remove all resources" + hosts: localhost + serial: 1 + vars: + sitegroup: "{{ sitegroup1 }}" + openshiftRessourceAppName: "{{ sitegroup1 | regex_replace('_', '-') }}-{{ branch | regex_replace('/', '-') }}" + tasks: + - include: ../../tasks/rest/remove.yaml + +- name: "{{ testname }} - rest2tasks /remove POST on sitegroup2, which should remove all resources" + hosts: localhost + serial: 1 + vars: + sitegroup: "{{ sitegroup2 }}" + openshiftRessourceAppName: "{{ sitegroup2 | regex_replace('_', '-') }}-{{ branch | regex_replace('/', '-') }}" + tasks: + - include: ../../tasks/rest/remove.yaml + +- name: "{{ testname }} - check if site for sitegroup1 does not exist anymore" + hosts: localhost + serial: 1 + vars: + url: "http://{{ sitegroup1 | regex_replace('_', '-') }}.{{ branch | regex_replace('/', '-') }}.{{ lookup('env','OPENSHIFT_ROUTE_SUFFIX') }}" + expected_returncode: 503 + tasks: + - include: ../../tests/test-url-returncode.yaml + +- name: "{{ testname }} - check if site for sitegroup2 does not exist anymore" + hosts: localhost + serial: 1 + vars: + url: "http://{{ sitegroup2 | regex_replace('_', '-') }}.{{ branch | regex_replace('/', '-') }}.{{ lookup('env','OPENSHIFT_ROUTE_SUFFIX') }}" + expected_returncode: 503 + tasks: + - include: ../../tests/test-url-returncode.yaml \ No newline at end of file diff --git a/tests/tasks/git-add-commit-push.yaml b/tests/tasks/git-add-commit-push.yaml new file mode 100644 index 000000000..bf49d940e --- /dev/null +++ b/tests/tasks/git-add-commit-push.yaml @@ -0,0 +1,36 @@ +- name: "{{ testname }} - create new branch {{ branch }} in {{git_repo_name}}" + command: git checkout -b {{ branch }} + args: + chdir: /{{git_repo_name}} + +- name: "{{ testname }} - copying all files from {{git_files}} into git repo {{git_repo_name}}" + copy: + src: /ansible/files/{{git_files}} + dest: /{{git_repo_name}}/ + +- name: "{{ testname }} - git adding all files from {{git_files}} to git repo {{git_repo_name}}" + command: git add . + args: + chdir: /{{git_repo_name}} + +- name: "{{ testname }} - git commit to git repo {{git_repo_name}}" + command: git commit -m "push" + args: + chdir: /{{git_repo_name}} + +- name: "{{ testname }} - force push branch {{ branch }} to remote in git repo {{git_repo_name}}" + command: git push --force origin {{ branch }} + args: + chdir: /{{git_repo_name}} + +- name: "{{ testname }} - getting current head git hash in repo {{git_repo_name}}" + command: git rev-parse HEAD + args: + chdir: /{{git_repo_name}} + register: result + +- set_fact: + current_head: "{{ result.stdout }}" + +- debug: + msg: "{{ testname }} - current head git hash: {{ current_head }}" \ No newline at end of file diff --git a/tests/tasks/git-empty-commit-push.yaml b/tests/tasks/git-empty-commit-push.yaml new file mode 100644 index 000000000..16e654f52 --- /dev/null +++ b/tests/tasks/git-empty-commit-push.yaml @@ -0,0 +1,27 @@ +- name: "{{ testname }} - create empty commit in {{git_repo_name}}" + command: git commit -m "empty commit" --allow-empty + args: + chdir: /{{git_repo_name}} + +- name: "{{ testname }} - getting current head git hash in repo {{git_repo_name}}" + command: git rev-parse HEAD + args: + chdir: /{{git_repo_name}} + register: result + +- name: "{{ testname }} - getting current gitbranch in repo {{git_repo_name}}" + command: git symbolic-ref --short HEAD + args: + chdir: /{{git_repo_name}} + register: gitbranch + +- name: "{{ testname }} - force push branch {{ branch }} to remote in git repo {{git_repo_name}}" + command: git push --force origin {{ gitbranch.stdout }} + args: + chdir: /{{git_repo_name}} + +- set_fact: + current_head: "{{ result.stdout }}" + +- debug: + msg: "{{ testname }} - current head git hash: {{ current_head }}" \ No newline at end of file diff --git a/tests/tasks/git-init.yaml b/tests/tasks/git-init.yaml new file mode 100644 index 000000000..7d9d5b3fe --- /dev/null +++ b/tests/tasks/git-init.yaml @@ -0,0 +1,24 @@ +- name: "{{ testname }} - make sure repo folder {{git_repo_name}} exists" + file: + path: /{{git_repo_name}} + state: directory + +- name: "{{ testname }} - cleaning repo folder {{git_repo_name}}" + command: rm -rf * + args: + chdir: /{{git_repo_name}} + +- name: "{{ testname }} - cleaning repo folder {{git_repo_name}}" + command: rm -rf .git + args: + chdir: /{{git_repo_name}} + +- name: "{{ testname }} - init fresh git repo in {{git_repo_name}}" + command: git init + args: + chdir: /{{git_repo_name}} + +- name: "{{ testname }} - add remote {{ lookup('env','GIT_REPO_PREFIX') }}{{git_repo_name}} to git repo in {{git_repo_name}}" + command: git remote add origin {{ lookup('env','GIT_REPO_PREFIX') }}{{git_repo_name}} + args: + chdir: /{{git_repo_name}} diff --git a/tests/tasks/rest/deploy-no-sha.yaml b/tests/tasks/rest/deploy-no-sha.yaml new file mode 100644 index 000000000..4d94327ae --- /dev/null +++ b/tests/tasks/rest/deploy-no-sha.yaml @@ -0,0 +1,8 @@ +- name: "{{ testname }} - POST rest2task /deploy with target git branch {{ branch }} and sitegroup {{ sitegroup }} (no sha) to {{ lookup('env','REST2TASKS_PROTOCOL') }}://{{ lookup('env','REST2TASKS_HOST') }}:{{ lookup('env','REST2TASKS_PORT') }}" + uri: + url: "{{ lookup('env','REST2TASKS_PROTOCOL') }}://{{ lookup('env','REST2TASKS_HOST') }}:{{ lookup('env','REST2TASKS_PORT') }}/deploy" + method: POST + follow_redirects: yes + body_format: json + body: '{"branchName": "{{ branch }}","siteGroupName": "{{ sitegroup }}"}' + diff --git a/tests/tasks/rest/deploy-sha.yaml b/tests/tasks/rest/deploy-sha.yaml new file mode 100644 index 000000000..4c713c314 --- /dev/null +++ b/tests/tasks/rest/deploy-sha.yaml @@ -0,0 +1,8 @@ +- name: "{{ testname }} - POST rest2task /deploy with target git branch {{ branch }} and sitegroup {{ sitegroup }} and sha {{ sha }} to {{ lookup('env','REST2TASKS_PROTOCOL') }}://{{ lookup('env','REST2TASKS_HOST') }}:{{ lookup('env','REST2TASKS_PORT') }}" + uri: + url: "{{ lookup('env','REST2TASKS_PROTOCOL') }}://{{ lookup('env','REST2TASKS_HOST') }}:{{ lookup('env','REST2TASKS_PORT') }}/deploy" + method: POST + follow_redirects: yes + body_format: json + body: '{"branchName": "{{ branch }}","siteGroupName": "{{ sitegroup }}", "sha": "{{ sha }}"}' + diff --git a/tests/tasks/rest/remove.yaml b/tests/tasks/rest/remove.yaml new file mode 100644 index 000000000..1c208d101 --- /dev/null +++ b/tests/tasks/rest/remove.yaml @@ -0,0 +1,7 @@ +- name: "{{ testname }} - POST rest2task /remove with sitegroup {{ sitegroup }} and openshift resource name {{ openshiftRessourceAppName }} to {{ lookup('env','REST2TASKS_PROTOCOL') }}://{{ lookup('env','REST2TASKS_HOST') }}:{{ lookup('env','REST2TASKS_PORT') }}" + uri: + url: "{{ lookup('env','REST2TASKS_PROTOCOL') }}://{{ lookup('env','REST2TASKS_HOST') }}:{{ lookup('env','REST2TASKS_PORT') }}/remove" + method: POST + follow_redirects: yes + body_format: json + body: '{"openshiftRessourceAppName": "{{ openshiftRessourceAppName }}","siteGroupName": "{{ sitegroup }}"}' \ No newline at end of file diff --git a/tests/tasks/webhook-github/push-delete.yaml b/tests/tasks/webhook-github/push-delete.yaml new file mode 100644 index 000000000..e98d79304 --- /dev/null +++ b/tests/tasks/webhook-github/push-delete.yaml @@ -0,0 +1,13 @@ +- name: "{{ testname }} - POST github push delete webhook with branch {{ branch }} and repo {{ git_repo_ssh_url }} to {{ lookup('env','WEBHOOK_PROTOCOL') }}://{{ lookup('env','WEBHOOK_HOST') }}:{{ lookup('env','WEBHOOK_PORT') }}" + uri: + url: "{{ lookup('env','WEBHOOK_PROTOCOL') }}://{{ lookup('env','WEBHOOK_HOST') }}:{{ lookup('env','WEBHOOK_PORT') }}" + headers: + User-Agent: GitHub-Hookshot/eb03e36 + X-GitHub-Event: push + X-GitHub-Delivery: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa + content-type: application/json + method: POST + follow_redirects: yes + body_format: json + body: '{"ref":"refs/heads/{{ branch }}","before":"d8072aa41afa0e91b89cad0bf68963c56658a66f","after":"0000000000000000000000000000000000000000","created":false,"deleted":true,"forced":false,"base_ref":null,"compare":"https://github.com/AmazeeLabs/amazee_io/compare/d8072aa41afa...05ba8a7269b6","commits":[{"id":"05ba8a7269b626e4f121cc395733cd4498219193","tree_id":"33e62fad073ea78bd2f2f516ae7634bd976587a7","distinct":true,"message":"Revert \"hello worl:d\"\n\nThis reverts commit d8072aa41afa0e91b89cad0bf68963c56658a66f.","timestamp":"2016-12-12T09:01:38-06:00","url":"https://github.com/AmazeeLabs/amazee_io/commit/05ba8a7269b626e4f121cc395733cd4498219193","author":{"name":"Michael Schmid","email":"michael@amazeelabs.com","username":"Schnitzel"},"committer":{"name":"Michael Schmid","email":"michael@amazeelabs.com","username":"Schnitzel"},"added":[],"removed":[],"modified":["themes/beaker/templates/page.html.twig"]}],"head_commit":{"id":"05ba8a7269b626e4f121cc395733cd4498219193","tree_id":"33e62fad073ea78bd2f2f516ae7634bd976587a7","distinct":true,"message":"Revert \"hello worl:d\"\n\nThis reverts commit d8072aa41afa0e91b89cad0bf68963c56658a66f.","timestamp":"2016-12-12T09:01:38-06:00","url":"https://github.com/AmazeeLabs/amazee_io/commit/05ba8a7269b626e4f121cc395733cd4498219193","author":{"name":"Michael Schmid","email":"michael@amazeelabs.com","username":"Schnitzel"},"committer":{"name":"Michael Schmid","email":"michael@amazeelabs.com","username":"Schnitzel"},"added":[],"removed":[],"modified":["themes/beaker/templates/page.html.twig"]},"repository":{"id":57102603,"name":"amazee_io","full_name":"AmazeeLabs/amazee_io","owner":{"name":"AmazeeLabs","email":""},"private":true,"html_url":"https://github.com/AmazeeLabs/amazee_io","description":null,"fork":false,"url":"https://github.com/AmazeeLabs/amazee_io","forks_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/forks","keys_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/teams","hooks_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks","issue_events_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}","events_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/events","assignees_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}","branches_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}","tags_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/tags","blobs_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}","trees_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}","languages_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/languages","stargazers_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers","contributors_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors","subscribers_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers","subscription_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription","commits_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}","git_commits_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}","comments_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}","issue_comment_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}","contents_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}","compare_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/merges","archive_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads","issues_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}","pulls_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}","milestones_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}","notifications_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}","releases_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}","deployments_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments","created_at":1461650975,"updated_at":"2016-04-26T06:10:35Z","pushed_at":1481554905,"git_url":"git://github.com/AmazeeLabs/amazee_io.git","ssh_url":"{{ git_repo_ssh_url }}","clone_url":"https://github.com/AmazeeLabs/amazee_io.git","svn_url":"https://github.com/AmazeeLabs/amazee_io","homepage":null,"size":107137,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":3,"forks":0,"open_issues":3,"watchers":0,"default_branch":"prod","stargazers":0,"master_branch":"prod","organization":"AmazeeLabs"},"pusher":{"name":"Schnitzel","email":"michael@amazeelabs.com"},"organization":{"login":"AmazeeLabs","id":5390584,"url":"https://api.github.com/orgs/AmazeeLabs","repos_url":"https://api.github.com/orgs/AmazeeLabs/repos","events_url":"https://api.github.com/orgs/AmazeeLabs/events","hooks_url":"https://api.github.com/orgs/AmazeeLabs/hooks","issues_url":"https://api.github.com/orgs/AmazeeLabs/issues","members_url":"https://api.github.com/orgs/AmazeeLabs/members{/member}","public_members_url":"https://api.github.com/orgs/AmazeeLabs/public_members{/member}","avatar_url":"https://avatars.githubusercontent.com/u/5390584?v=3","description":""},"sender":{"login":"Schnitzel","id":750999,"avatar_url":"https://avatars.githubusercontent.com/u/750999?v=3","gravatar_id":"","url":"https://api.github.com/users/Schnitzel","html_url":"https://github.com/Schnitzel","followers_url":"https://api.github.com/users/Schnitzel/followers","following_url":"https://api.github.com/users/Schnitzel/following{/other_user}","gists_url":"https://api.github.com/users/Schnitzel/gists{/gist_id}","starred_url":"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Schnitzel/subscriptions","organizations_url":"https://api.github.com/users/Schnitzel/orgs","repos_url":"https://api.github.com/users/Schnitzel/repos","events_url":"https://api.github.com/users/Schnitzel/events{/privacy}","received_events_url":"https://api.github.com/users/Schnitzel/received_events","type":"User","site_admin":false}}' + diff --git a/tests/tasks/webhook-github/push.yaml b/tests/tasks/webhook-github/push.yaml new file mode 100644 index 000000000..368c8e7be --- /dev/null +++ b/tests/tasks/webhook-github/push.yaml @@ -0,0 +1,13 @@ +- name: "{{ testname }} - POST github push webhook with target git hash {{ git_hash_push }}, branch {{ branch }} and repo {{ git_repo_ssh_url }} to {{ lookup('env','WEBHOOK_PROTOCOL') }}://{{ lookup('env','WEBHOOK_HOST') }}:{{ lookup('env','WEBHOOK_PORT') }}" + uri: + url: "{{ lookup('env','WEBHOOK_PROTOCOL') }}://{{ lookup('env','WEBHOOK_HOST') }}:{{ lookup('env','WEBHOOK_PORT') }}" + headers: + User-Agent: GitHub-Hookshot/eb03e36 + X-GitHub-Event: push + X-GitHub-Delivery: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa + content-type: application/json + method: POST + follow_redirects: yes + body_format: json + body: '{"ref":"refs/heads/{{ branch }}","before":"d8072aa41afa0e91b89cad0bf68963c56658a66f","after":"{{ git_hash_push }}","created":false,"deleted":false,"forced":false,"base_ref":null,"compare":"https://github.com/AmazeeLabs/amazee_io/compare/d8072aa41afa...05ba8a7269b6","commits":[{"id":"05ba8a7269b626e4f121cc395733cd4498219193","tree_id":"33e62fad073ea78bd2f2f516ae7634bd976587a7","distinct":true,"message":"Revert \"hello worl:d\"\n\nThis reverts commit d8072aa41afa0e91b89cad0bf68963c56658a66f.","timestamp":"2016-12-12T09:01:38-06:00","url":"https://github.com/AmazeeLabs/amazee_io/commit/05ba8a7269b626e4f121cc395733cd4498219193","author":{"name":"Michael Schmid","email":"michael@amazeelabs.com","username":"Schnitzel"},"committer":{"name":"Michael Schmid","email":"michael@amazeelabs.com","username":"Schnitzel"},"added":[],"removed":[],"modified":["themes/beaker/templates/page.html.twig"]}],"head_commit":{"id":"05ba8a7269b626e4f121cc395733cd4498219193","tree_id":"33e62fad073ea78bd2f2f516ae7634bd976587a7","distinct":true,"message":"Revert \"hello worl:d\"\n\nThis reverts commit d8072aa41afa0e91b89cad0bf68963c56658a66f.","timestamp":"2016-12-12T09:01:38-06:00","url":"https://github.com/AmazeeLabs/amazee_io/commit/05ba8a7269b626e4f121cc395733cd4498219193","author":{"name":"Michael Schmid","email":"michael@amazeelabs.com","username":"Schnitzel"},"committer":{"name":"Michael Schmid","email":"michael@amazeelabs.com","username":"Schnitzel"},"added":[],"removed":[],"modified":["themes/beaker/templates/page.html.twig"]},"repository":{"id":57102603,"name":"amazee_io","full_name":"AmazeeLabs/amazee_io","owner":{"name":"AmazeeLabs","email":""},"private":true,"html_url":"https://github.com/AmazeeLabs/amazee_io","description":null,"fork":false,"url":"https://github.com/AmazeeLabs/amazee_io","forks_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/forks","keys_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/teams","hooks_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/hooks","issue_events_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/events{/number}","events_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/events","assignees_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/assignees{/user}","branches_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/branches{/branch}","tags_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/tags","blobs_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/refs{/sha}","trees_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/statuses/{sha}","languages_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/languages","stargazers_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/stargazers","contributors_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/contributors","subscribers_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/subscribers","subscription_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/subscription","commits_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/commits{/sha}","git_commits_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/git/commits{/sha}","comments_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/comments{/number}","issue_comment_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/issues/comments{/number}","contents_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/contents/{+path}","compare_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/merges","archive_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/downloads","issues_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/issues{/number}","pulls_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/pulls{/number}","milestones_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/milestones{/number}","notifications_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/labels{/name}","releases_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/releases{/id}","deployments_url":"https://api.github.com/repos/AmazeeLabs/amazee_io/deployments","created_at":1461650975,"updated_at":"2016-04-26T06:10:35Z","pushed_at":1481554905,"git_url":"git://github.com/AmazeeLabs/amazee_io.git","ssh_url":"{{ git_repo_ssh_url }}","clone_url":"https://github.com/AmazeeLabs/amazee_io.git","svn_url":"https://github.com/AmazeeLabs/amazee_io","homepage":null,"size":107137,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":3,"forks":0,"open_issues":3,"watchers":0,"default_branch":"prod","stargazers":0,"master_branch":"prod","organization":"AmazeeLabs"},"pusher":{"name":"Schnitzel","email":"michael@amazeelabs.com"},"organization":{"login":"AmazeeLabs","id":5390584,"url":"https://api.github.com/orgs/AmazeeLabs","repos_url":"https://api.github.com/orgs/AmazeeLabs/repos","events_url":"https://api.github.com/orgs/AmazeeLabs/events","hooks_url":"https://api.github.com/orgs/AmazeeLabs/hooks","issues_url":"https://api.github.com/orgs/AmazeeLabs/issues","members_url":"https://api.github.com/orgs/AmazeeLabs/members{/member}","public_members_url":"https://api.github.com/orgs/AmazeeLabs/public_members{/member}","avatar_url":"https://avatars.githubusercontent.com/u/5390584?v=3","description":""},"sender":{"login":"Schnitzel","id":750999,"avatar_url":"https://avatars.githubusercontent.com/u/750999?v=3","gravatar_id":"","url":"https://api.github.com/users/Schnitzel","html_url":"https://github.com/Schnitzel","followers_url":"https://api.github.com/users/Schnitzel/followers","following_url":"https://api.github.com/users/Schnitzel/following{/other_user}","gists_url":"https://api.github.com/users/Schnitzel/gists{/gist_id}","starred_url":"https://api.github.com/users/Schnitzel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Schnitzel/subscriptions","organizations_url":"https://api.github.com/users/Schnitzel/orgs","repos_url":"https://api.github.com/users/Schnitzel/repos","events_url":"https://api.github.com/users/Schnitzel/events{/privacy}","received_events_url":"https://api.github.com/users/Schnitzel/received_events","type":"User","site_admin":false}}' + diff --git a/tests/tests/test-url-content.yaml b/tests/tests/test-url-content.yaml new file mode 100644 index 000000000..923d84f26 --- /dev/null +++ b/tests/tests/test-url-content.yaml @@ -0,0 +1,10 @@ +--- +- name: "{{ testname }} - Test if URL {{url}} contains content {{expected_content}}" + uri: + url: "{{ url }}" + return_content: yes + register: result + until: result.content | search(expected_content) + retries: 20 + delay: 10 +- debug: msg="Success!!!" diff --git a/tests/tests/test-url-returncode.yaml b/tests/tests/test-url-returncode.yaml new file mode 100644 index 000000000..1dbf25b5d --- /dev/null +++ b/tests/tests/test-url-returncode.yaml @@ -0,0 +1,11 @@ +--- +- name: "{{ testname }} - Test if URL {{url}} returns with resturn code {{expected_returncode}}" + uri: + url: "{{ url }}" + status_code: "{{ expected_returncode }}" + register: result + until: result.status == expected_returncode + retries: 20 + delay: 10 +- debug: msg="Success!!!" +