From bf6bf1b8339f4099d89adff74d9de798369f6ff5 Mon Sep 17 00:00:00 2001 From: Lod Date: Mon, 4 Apr 2022 09:32:59 +0200 Subject: [PATCH 1/2] Manala init --- .manala.yaml | 46 + .manala/.dockerignore | 1 + .manala/.gitignore | 1 + .manala/Jenkinsfile | 5 + .manala/Makefile | 120 + .manala/README.md | 751 ++++ .manala/ansible/collections/requirements.yaml | 11 + .manala/ansible/deploy.yaml | 7 + .manala/ansible/inventories/deploy.yaml | 2 + .manala/ansible/inventories/release.yaml | 2 + .../inventories/system.development.yaml | 61 + .../inventories/system.integration.yaml | 30 + .manala/ansible/inventories/system.yaml | 120 + .manala/ansible/make.mk | 50 + .manala/ansible/release.yaml | 6 + .../roles/certificates/defaults/main.yml | 10 + .../roles/certificates/tasks/main.yaml | 107 + .../roles/deploy/callback_plugins/.gitignore | 1 + .../roles/deploy/callback_plugins/log.py | 73 + .../ansible/roles/deploy/defaults/main.yml | 49 + .../roles/deploy/lookup_plugins/.gitignore | 1 + .../deploy/lookup_plugins/deploy_tasks.py | 59 + .../lookup_plugins/deploy_writable_dirs.py | 53 + .manala/ansible/roles/deploy/tasks/main.yml | 84 + .manala/ansible/roles/deploy/tasks/shared.yml | 47 + .../roles/deploy/tasks/strategy/git.yml | 32 + .../deploy/tasks/strategy/synchronize.yml | 10 + .../roles/deploy/tasks/strategy/unarchive.yml | 14 + .../ansible/roles/deploy/tasks/task/shell.yml | 11 + .../roles/deploy/tasks/writable/dirs.yml | 19 + .../roles/release/callback_plugins/.gitignore | 1 + .../roles/release/callback_plugins/log.py | 73 + .../ansible/roles/release/defaults/main.yml | 24 + .../roles/release/lookup_plugins/.gitignore | 1 + .../release/lookup_plugins/release_tasks.py | 51 + .manala/ansible/roles/release/tasks/main.yml | 116 + .../roles/release/tasks/task/shell.yml | 11 + .manala/ansible/system.yaml | 473 +++ .manala/ansible/templates/apt/sources.list.j2 | 3 + .manala/ansible/templates/git/gitconfig.j2 | 23 + .manala/ansible/templates/nginx/cors.j2 | 8 + .../ansible/templates/nginx/default.conf.j2 | 8 + .manala/ansible/templates/nginx/gzip.j2 | 7 + .../ansible/templates/nginx/html/404.html.j2 | 36 + .manala/ansible/templates/nginx/nginx.conf.j2 | 67 + .manala/ansible/templates/nginx/no_index.j2 | 1 + .../ansible/templates/nginx/php_fpm_app.j2 | 6 + .../templates/nginx/ssl_offloading.conf.j2 | 25 + .manala/ansible/templates/ngrok/ngrok.yml.j2 | 1 + .manala/ansible/templates/ohmyzsh/.zshrc.j2 | 147 + .../ansible/templates/ohmyzsh/functions/ip.j2 | 7 + .../ohmyzsh/functions/nginx_timeout.j2 | 9 + .../templates/ohmyzsh/functions/ngrok_http.j2 | 7 + .../templates/ohmyzsh/functions/php_xdebug.j2 | 31 + .../templates/ohmyzsh/theme.zsh-theme.j2 | 36 + .manala/ansible/templates/php/5.6/app.ini.j2 | 37 + .manala/ansible/templates/php/7.0/app.ini.j2 | 65 + .manala/ansible/templates/php/7.1/app.ini.j2 | 41 + .manala/ansible/templates/php/app.ini.j2 | 49 + .manala/ansible/templates/php/opcache.ini.j2 | 15 + .manala/ansible/templates/php/xdebug.ini.j2 | 29 + .../templates/ssh/development/ssh_config.j2 | 9 + .../templates/ssh/integration/ssh_config.j2 | 11 + .../ansible/templates/ssh/keys/git.elao.com | 1 + .../ansible/templates/supervisor/app.conf.j2 | 40 + .manala/ansible/templates/vim/vimrc.local.j2 | 17 + .manala/certificates/ca.crt | 29 + .manala/certificates/ca.key | 54 + .manala/docker/Dockerfile | 227 ++ .manala/docker/compose.yaml | 20 + .manala/docker/compose/cache.yaml | 14 + .manala/docker/compose/development.yaml | 33 + .manala/docker/compose/git.yaml | 9 + .manala/docker/compose/github.yaml | 9 + .manala/docker/compose/init.openrc.yaml | 17 + .manala/docker/compose/init.systemd.yaml | 14 + .manala/docker/compose/init.sysv.yaml | 14 + .manala/docker/compose/integration.yaml | 13 + .manala/docker/compose/mutagen.yaml | 30 + .manala/docker/compose/ssh-agent.yaml | 12 + .manala/docker/compose/ssh-key.yaml | 10 + .manala/docker/entrypoint.sh | 21 + .manala/docker/make.mk | 98 + .manala/github/deliveries/README.md | 3 + .manala/github/deliveries/action.yaml | 32 + .manala/github/integration/README.md | 3 + .manala/github/integration/action.yaml | 18 + .manala/github/system/action.yaml | 129 + .manala/jenkins/Jenkinsfile | 5 + .manala/make/git.mk | 30 + .manala/make/help.mk | 72 + .manala/make/os.mk | 29 + .manala/make/semver.mk | 23 + .manala/make/text.mk | 132 + .manala/make/try.mk | 23 + Makefile | 16 +- package-lock.json | 3025 +++++++++-------- 97 files changed, 5927 insertions(+), 1506 deletions(-) create mode 100644 .manala.yaml create mode 100644 .manala/.dockerignore create mode 100644 .manala/.gitignore create mode 100644 .manala/Jenkinsfile create mode 100644 .manala/Makefile create mode 100644 .manala/README.md create mode 100644 .manala/ansible/collections/requirements.yaml create mode 100644 .manala/ansible/deploy.yaml create mode 100644 .manala/ansible/inventories/deploy.yaml create mode 100644 .manala/ansible/inventories/release.yaml create mode 100644 .manala/ansible/inventories/system.development.yaml create mode 100644 .manala/ansible/inventories/system.integration.yaml create mode 100644 .manala/ansible/inventories/system.yaml create mode 100644 .manala/ansible/make.mk create mode 100644 .manala/ansible/release.yaml create mode 100644 .manala/ansible/roles/certificates/defaults/main.yml create mode 100644 .manala/ansible/roles/certificates/tasks/main.yaml create mode 100644 .manala/ansible/roles/deploy/callback_plugins/.gitignore create mode 100644 .manala/ansible/roles/deploy/callback_plugins/log.py create mode 100644 .manala/ansible/roles/deploy/defaults/main.yml create mode 100644 .manala/ansible/roles/deploy/lookup_plugins/.gitignore create mode 100644 .manala/ansible/roles/deploy/lookup_plugins/deploy_tasks.py create mode 100644 .manala/ansible/roles/deploy/lookup_plugins/deploy_writable_dirs.py create mode 100644 .manala/ansible/roles/deploy/tasks/main.yml create mode 100644 .manala/ansible/roles/deploy/tasks/shared.yml create mode 100644 .manala/ansible/roles/deploy/tasks/strategy/git.yml create mode 100644 .manala/ansible/roles/deploy/tasks/strategy/synchronize.yml create mode 100644 .manala/ansible/roles/deploy/tasks/strategy/unarchive.yml create mode 100644 .manala/ansible/roles/deploy/tasks/task/shell.yml create mode 100644 .manala/ansible/roles/deploy/tasks/writable/dirs.yml create mode 100644 .manala/ansible/roles/release/callback_plugins/.gitignore create mode 100644 .manala/ansible/roles/release/callback_plugins/log.py create mode 100644 .manala/ansible/roles/release/defaults/main.yml create mode 100644 .manala/ansible/roles/release/lookup_plugins/.gitignore create mode 100644 .manala/ansible/roles/release/lookup_plugins/release_tasks.py create mode 100644 .manala/ansible/roles/release/tasks/main.yml create mode 100644 .manala/ansible/roles/release/tasks/task/shell.yml create mode 100644 .manala/ansible/system.yaml create mode 100644 .manala/ansible/templates/apt/sources.list.j2 create mode 100644 .manala/ansible/templates/git/gitconfig.j2 create mode 100644 .manala/ansible/templates/nginx/cors.j2 create mode 100644 .manala/ansible/templates/nginx/default.conf.j2 create mode 100644 .manala/ansible/templates/nginx/gzip.j2 create mode 100644 .manala/ansible/templates/nginx/html/404.html.j2 create mode 100644 .manala/ansible/templates/nginx/nginx.conf.j2 create mode 100644 .manala/ansible/templates/nginx/no_index.j2 create mode 100644 .manala/ansible/templates/nginx/php_fpm_app.j2 create mode 100644 .manala/ansible/templates/nginx/ssl_offloading.conf.j2 create mode 100644 .manala/ansible/templates/ngrok/ngrok.yml.j2 create mode 100644 .manala/ansible/templates/ohmyzsh/.zshrc.j2 create mode 100644 .manala/ansible/templates/ohmyzsh/functions/ip.j2 create mode 100644 .manala/ansible/templates/ohmyzsh/functions/nginx_timeout.j2 create mode 100644 .manala/ansible/templates/ohmyzsh/functions/ngrok_http.j2 create mode 100644 .manala/ansible/templates/ohmyzsh/functions/php_xdebug.j2 create mode 100644 .manala/ansible/templates/ohmyzsh/theme.zsh-theme.j2 create mode 100644 .manala/ansible/templates/php/5.6/app.ini.j2 create mode 100644 .manala/ansible/templates/php/7.0/app.ini.j2 create mode 100644 .manala/ansible/templates/php/7.1/app.ini.j2 create mode 100644 .manala/ansible/templates/php/app.ini.j2 create mode 100644 .manala/ansible/templates/php/opcache.ini.j2 create mode 100644 .manala/ansible/templates/php/xdebug.ini.j2 create mode 100644 .manala/ansible/templates/ssh/development/ssh_config.j2 create mode 100644 .manala/ansible/templates/ssh/integration/ssh_config.j2 create mode 100644 .manala/ansible/templates/ssh/keys/git.elao.com create mode 100644 .manala/ansible/templates/supervisor/app.conf.j2 create mode 100644 .manala/ansible/templates/vim/vimrc.local.j2 create mode 100644 .manala/certificates/ca.crt create mode 100644 .manala/certificates/ca.key create mode 100644 .manala/docker/Dockerfile create mode 100644 .manala/docker/compose.yaml create mode 100644 .manala/docker/compose/cache.yaml create mode 100644 .manala/docker/compose/development.yaml create mode 100644 .manala/docker/compose/git.yaml create mode 100644 .manala/docker/compose/github.yaml create mode 100644 .manala/docker/compose/init.openrc.yaml create mode 100644 .manala/docker/compose/init.systemd.yaml create mode 100644 .manala/docker/compose/init.sysv.yaml create mode 100644 .manala/docker/compose/integration.yaml create mode 100644 .manala/docker/compose/mutagen.yaml create mode 100644 .manala/docker/compose/ssh-agent.yaml create mode 100644 .manala/docker/compose/ssh-key.yaml create mode 100755 .manala/docker/entrypoint.sh create mode 100644 .manala/docker/make.mk create mode 100644 .manala/github/deliveries/README.md create mode 100644 .manala/github/deliveries/action.yaml create mode 100644 .manala/github/integration/README.md create mode 100644 .manala/github/integration/action.yaml create mode 100644 .manala/github/system/action.yaml create mode 100644 .manala/jenkins/Jenkinsfile create mode 100644 .manala/make/git.mk create mode 100644 .manala/make/help.mk create mode 100644 .manala/make/os.mk create mode 100644 .manala/make/semver.mk create mode 100644 .manala/make/text.mk create mode 100644 .manala/make/try.mk diff --git a/.manala.yaml b/.manala.yaml new file mode 100644 index 0000000..3458539 --- /dev/null +++ b/.manala.yaml @@ -0,0 +1,46 @@ +#################################################################### +# !!! REMINDER !!! # +# Don't forget to run `manala up` each time you update this file ! # +#################################################################### + +manala: + recipe: elao.app.docker + +########### +# Project # +########### + +project: + name: elao-tricot + ports_prefix: 126 + +########## +# System # +########## + +system: + version: 10 + nginx: + configs: + - template: nginx/gzip.j2 + # App + - file: app.conf + config: | + server { + server_name ~.; + root /srv/app/public; + access_log /srv/log/nginx.access.log; + error_log /srv/log/nginx.error.log; + include conf.d/gzip; + } + nodejs: + version: 8 + php: + version: 8.1 + + # ssh: + # client: + # config: | + # Host *.elao.run + # User app + # ForwardAgent yes diff --git a/.manala/.dockerignore b/.manala/.dockerignore new file mode 100644 index 0000000..4dbe29f --- /dev/null +++ b/.manala/.dockerignore @@ -0,0 +1 @@ +/.cache/ diff --git a/.manala/.gitignore b/.manala/.gitignore new file mode 100644 index 0000000..4dbe29f --- /dev/null +++ b/.manala/.gitignore @@ -0,0 +1 @@ +/.cache/ diff --git a/.manala/Jenkinsfile b/.manala/Jenkinsfile new file mode 100644 index 0000000..1be0dbf --- /dev/null +++ b/.manala/Jenkinsfile @@ -0,0 +1,5 @@ +#!/usr/bin/env groovy + +stage('¯\\_(ツ)_/¯') { + echo 'Because testing is doubting...' +} diff --git a/.manala/Makefile b/.manala/Makefile new file mode 100644 index 0000000..206c05b --- /dev/null +++ b/.manala/Makefile @@ -0,0 +1,120 @@ +# Relative root dir ("."|".."|"../.."|…) +_DIR := $(patsubst %/.,%,$(patsubst %.manala/..,%.,$(patsubst %Makefile,%..,$(lastword $(MAKEFILE_LIST))))) +# Is current dir root ? (""|"1") +_ROOT = $(if $(filter .,$(_DIR)),1) +# Relative current dir ("."|"foo"|"foo/bar"|…) +_CURRENT_DIR = $(patsubst ./%,%,.$(patsubst $(realpath $(CURDIR)/$(_DIR))%,%,$(CURDIR))) + +########### +# Project # +########### + +PROJECT_NAME = elao-tricot + +define project_host +$(PROJECT_NAME).ela.ooo$(if $(1),:126$(shell printf "%02d" $(1))) +endef + +-include $(_DIR)/.manala/make/text.mk +-include $(_DIR)/.manala/make/help.mk +-include $(_DIR)/.manala/make/os.mk +-include $(_DIR)/.manala/docker/make.mk +-include $(_DIR)/.manala/ansible/make.mk +-include $(_DIR)/.manala/make/try.mk +-include $(_DIR)/.manala/make/git.mk +-include $(_DIR)/.manala/make/semver.mk + +############### +# Environment # +############### + +HELP += $(call help_section, Environment) + +# Docker commands only available *OUTSIDE* docker environment +ifndef DOCKER + +# Setup commands only available *IN* root directory +ifdef _ROOT +HELP += $(call help,setup, Setup environment (DEBUG)) +setup: + $(_docker_compose) up \ + --build \ + --detach \ + --wait + $(setup) + $(MAKE) help +endif + +HELP += $(call help,up, Start the environment) +up: + $(_docker_compose) start + $(MAKE) help.project + +HELP += $(call help,halt, Stop the environment) +halt: + $(_docker_compose) stop + +HELP += $(call help,reload, Restart the environment) +reload: + $(_docker_compose) restart + $(MAKE) help.project + +HELP += $(call help,sh, Open shell to the environment) +sh: + $(_docker_compose_exec) \ + sh -c "if [ -x \"$$(command -v zsh)\" ] ; then exec zsh --login ; else exec bash --login ; fi" + +HELP += $(call help,destroy, Stop and delete environment) +destroy: + $(_docker_compose) down \ + --rmi local \ + --volumes \ + --remove-orphans + +HELP += $(call help,docker, Arbitrary docker compose commands) +ifeq (docker, $(firstword $(MAKECMDGOALS))) +ARGS := $(wordlist 2, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS)) +$(eval $(ARGS):;@true) +docker: + $(_docker_compose) $(ARGS) +endif + +endif + +HELP += $(call help,provision, Provision the environment (TAGS|DIFF|VERBOSE|LIMIT)) +provision: SHELL := $(or $(DOCKER_SHELL),$(SHELL)) +provision: _ANSIBLE_PLAYBOOK_INVENTORY = $(_DIR)/.manala/ansible/inventories +provision: _ANSIBLE_PLAYBOOK_BECOME = 1 +provision: + $(call log, Install ansible galaxy collections) + $(_ansible_galaxy_collection_install) \ + $(_DIR)/.manala/ansible/collections/requirements.yaml + $(call log, Run ansible playbook) + $(_ansible_playbook) \ + $(_DIR)/.manala/ansible/system.yaml + +HELP += $(call help,provision.apt, Provision the environment - Apt (DIFF|VERBOSE)) +provision.apt: _ANSIBLE_PLAYBOOK_TAGS = apt +provision.apt: provision + +HELP += $(call help,provision.nginx, Provision the environment - Nginx (DIFF|VERBOSE)) +provision.nginx: _ANSIBLE_PLAYBOOK_TAGS = nginx +provision.nginx: provision + +HELP += $(call help,provision.php, Provision the environment - Php (DIFF|VERBOSE)) +provision.php: _ANSIBLE_PLAYBOOK_TAGS = php +provision.php: provision + +HELP += $(call help,provision.certificates,Provision the environment - Certificates (DIFF|VERBOSE)) +provision.certificates: _ANSIBLE_PLAYBOOK_TAGS = certificates +provision.certificates: _ANSIBLE_PLAYBOOK_EXTRA_VARS = certificates_prompt=true +provision.certificates: provision + +######## +# Help # +######## + +HELP_PROJECT = $(COLOR_COMMENT)┏(°.°)┛┗(°.°)┓$(COLOR_RESET) ♪♫ Let's party ♫♪ $(COLOR_COMMENT)┗(°.°)┛┏(°.°)┓$(COLOR_RESET)\n +HELP_PROJECT += $(call help,Http, http://$(call project_host, 80)) +HELP_PROJECT += $(call help,Https, https://$(call project_host, 43)) +HELP_PROJECT += $(call help,MailHog, http://$(call project_host, 25)) diff --git a/.manala/README.md b/.manala/README.md new file mode 100644 index 0000000..c889534 --- /dev/null +++ b/.manala/README.md @@ -0,0 +1,751 @@ +--- +title: Elao - App - Docker +tableOfContent: 3 +--- + +## Requirements + +* Make + +MacOS + +* Docker Desktop 4.3.2+ +`brew install docker` +* Mutagen Compose 0.13.0+ +`brew install mutagen-io/mutagen/mutagen-compose` + +## Overview + +This recipe contains some helpful scripts in the context of a php/nodejs app, such as Makefile tasks in order to release and deploy your app. + +## Init + +```shell +cd [workspace] +manala init -i elao.app.docker [project] +``` + +## Quick start + +In a shell terminal, change directory to your app, and run the following commands: + +```shell +cd /path/to/my/app +manala init +Select the "elao.app.docker" recipe +``` + +Edit the `Makefile` at the root directory of your project and add the following lines at the beginning of the file: + +```makefile +.SILENT: + +-include .manala/Makefile +``` + +Then update the `.manala.yaml` file (see [the deliveries example](#deliveries) below) and then run the `manala up` command: + +```shell +manala up +``` + +!!! Warning + Don't forget to run the `manala up` command each time you update the + `.manala.yaml` file to actually apply your changes !!! + +From now on, if you execute the `make help` command in your console, you should obtain the following output: + +```shell +Usage: make [target] + +Help: + help This help + +Docker: + docker Run docker container + +App: +``` + +## Environment interaction + +In your app directory. + +Initialise your app: +```shell +make setup +``` + +Start environment: +```shell +make up +``` + +Stop environment: +```shell +make halt +``` + +Environment shell: +```shell +make sh +``` + +Custom docker compose command: +```shell +make docker [COMMAND] +``` + +:warning: separate hyphen based arguments or flags with `--` to avoid shell miss-interpretation: +```shell +make docker logs -- --follow +``` + +## Configuration + +Here is an example of a configuration in `.manala.yaml`: + +```yaml +########### +# Project # +########### + +project: + name: app + ports_prefix: 123 # >= 20, <= 640 + +########## +# System # +########## + +system: + version: 11 + #timezone: Etc/UTC # Optional + #locales: # Optional + # default: C.UTF-8 + # codes: [] + #env: # Optional + # FOO: bar + apt: + #repositories: [] # Optional + #preferences: [] # Optional + packages: + - pdftk + - https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.buster_{{ apt_architecture }}.deb + files: + - path: /srv/app/var/log + src: /srv/log + state: link_directory + - path: /srv/app/var/cache + src: /srv/cache + state: link_directory + #- path: /srv/app/var/sessions + # src: /srv/sessions + # state: link_directory + ## Api + #- path: /srv/app/api/var/log + # src: /srv/log/api + # state: link_directory + #- path: /srv/app/api/var/cache + # src: /srv/cache/api + # state: link_directory + #network: # Optional + # hosts: + # 127.0.0.1: foo.fr foobar.fr + nginx: + configs: [] + # configs: + # - template: nginx/gzip.j2 + # #- template: nginx/cors.j2 + # #- template: nginx/no_index.j2 + # - template: nginx/php_fpm_app.j2 + # # App + # - file: app.conf + # config: | + # server { + # server_name ~.; + # root /srv/app/public; + # access_log /srv/log/nginx.access.log; + # error_log /srv/log/nginx.error.log; + # include conf.d/gzip; + # location / { + # try_files $uri /index.php$is_args$args; + # } + # location ~ ^/index\.php(/|$) { + # include conf.d/php_fpm_app; + # internal; + # } + # } + php: + version: 8.1 + # composer: + # version: 1 # Optional + extensions: + # Symfony + - intl + - curl + - mbstring + - xml + # App + - mysql + configs: + - template: php/opcache.ini.j2 + - template: php/app.ini.j2 + config: + date.timezone: UTC + upload_max_filesize: 16M + post_max_size: 16M + nodejs: + version: 16 + # packages: + # - package: mjml + # version: 4.6.3 + # yarn: + # version: 1 + # cron: + # files: + # - file: app + # env: + # HOME: /srv/app + # jobs: + # # Foo - Bar + # - command: php bin/console app:foo:bar --no-interaction -vv >> /srv/log/cron.foo-bar.log 2>&1 + # minute: 0 + # # Dev + # state: absent + # supervisor: + # configs: + # - file: app.conf + # #groups: + # # acme: + # # programs: + # # - foo + # # - bar + # programs: + # foo: + # command: php bin/console app:acme:foo --no-interaction -vv + # directory: /srv/app + # stdout_logfile: /srv/log/supervisor.acme-foo.log + # bar: + # command: php bin/console app:acme:bar --no-interaction -vv + # directory: /srv/app + # stdout_logfile: /srv/log/supervisor.acme-bar.log + # foo-bar: + # command: php bin/console app:foo:bar --no-interaction -vv + # directory: /srv/app + # stdout_logfile: /srv/log/supervisor.foo-bar.log + # - file: app_foo.conf + # config: | + # [program:foo] + # command=/bin/foo + # MariaDB + mariadb: + version: 10.6 + # ...*OR* MySQL... + mysql: + version: "8.0" + # redis: + # version: "*" + # # config: + # # save: '""' # Disable persistence + elasticsearch: + version: 7 + plugins: + - analysis-icu + # influxdb: + # version: "*" + # config: + # reporting-disabled: true + # databases: + # - app + # users: + # - database: app + # name: app + # password: app + # privileges: + # - database: app + # user: app + # grant: ALL + # mongodb: + # version: 4.4 + ssh: + client: + config: | + Host *.elao.run + User app + ForwardAgent yes + docker: + services: + whoami: + image: traefik/whoami:v1.7.1 + network_mode: service:app + profiles: + - development + # App ports + app: + ports: + # whoami + - 12345:80 +``` + +Details: + +- `project` + - `ports_prefix`: docker network behavior force `localhost` usage for all projects. In order to runs multiple projects simultaneously, a kind of range ports must be set to avoid conflicts. Choose a prefix value, greater or equal to 20, and lower or equal to 640, like 123. All project ports will be based on this value, like 12380 for http or 12343 for https accesses. + +## Integration + +### Jenkins + +Here are some examples of integration configurations in `.manala.yaml` for Jenkins: + +```yaml +############### +# Integration # +############### + +integration: + jenkins: + pipeline: + tasks: + - shell: make install@integration + - label: Integration + junit: report/junit/*.xml + parallel: true + warn: true + tasks: + - label: Lint + tasks: + - shell: make lint.php-cs-fixer@integration + - shell: make lint.twig@integration + - shell: make lint.yaml@integration + - shell: make lint.eslint@integration + - label: Security + tasks: + - shell: make security.symfony@integration + - shell: make security.yarn@integration + - label: Test + tasks: + - shell: make test.phpunit@integration + artifacts: var/log/*.log + # artifacts: + # - var/log/foo.log + # - var/log/bar.log + # env: + # DATABASE_URL: mysql://root@127.0.0.1:3306/app +``` + +In this example we have two parallel stages: `api` and `mobile`, corresponding to two different sub-apps. + +```yaml +############### +# Integration # +############### + +integration: + jenkins: + pipeline: + tasks: + - label: Integration # Optional + parallel: true # ! Careful ! Could *NOT* be nested ! + junit: report/junit/*.xml + artifacts: var/log/*.log + warn: true # Turn errors into warnings (recursively applied) + tasks: + - app: api # Optional + tasks: + - shell: make install@integration + - shell: make build@integration + - shell: make lint.php-cs-fixer@integration + - shell: make security.symfony@integration + - shell: make test.phpunit@integration + artifacts: var/log/*.log + # env: + # DATABASE_URL: mysql://root@127.0.0.1:3306/app + - app: mobile + tasks: + - shell: make install@integration + - shell: make build@integration + - shell: make lint.eslint@integration + - shell: make test.jest@integration +``` + +### Github Actions + +The recipes generates a `Dockerfile` and a `docker-compose.yaml` file that can +be used to provide a fully-fledged environnement according to your project needs. + +The [Elao/manala-ci-action](https://github.com/Elao/manala-ci-action) rely on +this to allow you running any CLI command in this environnement, +using Github Action workflows. + +### Common integration tasks + +Add in your `Makefile`: + +```makefile +########### +# Install # +########### + +... + +install@integration: export APP_ENV = test +install@integration: + # Composer + composer install --ansi --verbose --no-interaction --no-progress --prefer-dist --optimize-autoloader --no-scripts --ignore-platform-reqs + #composer run-script symfony-scripts --ansi --verbose --no-interaction + # Npm + npm install --color=always --no-progress --no-audit + # Yarn + yarn install --color=always --no-progress + +######### +# Build # +######### + +... + +build@integration: + # Webpack Encore + npx encore production --color=always --no-progress + +######## +# Lint # +######## + +... + +lint.php-cs-fixer@integration: + mkdir -p report/junit + vendor/bin/php-cs-fixer fix --dry-run --diff --format=junit > report/junit/php-cs-fixer.xml + +lint.phpstan@integration: + mkdir -p report/junit + vendor/bin/phpstan --error-format=junit --no-progress --no-interaction analyse > report/junit/phpstan.xml + +lint.twig@integration: + bin/console lint:twig templates --ansi --no-interaction + +lint.yaml@integration: + bin/console lint:yaml config translations --ansi --no-interaction + +lint.eslint@integration: + npx eslint src --format junit --output-file report/junit/eslint.xml + +lint.stylelint@integration: + mkdir -p report/junit + npx stylelint "assets/styles/**/*.scss" \ + --syntax scss \ + --custom-formatter "node_modules/stylelint-junit-formatter" \ + > report/junit/stylelint.xml + +lint.flow@integration: + mkdir -p report/junit + npx flow check --json | npx flow-junit-transformer > report/junit/flow.xml + +############ +# Security # +############ + +... + +security.symfony@integration: + symfony check:security + +security.yarn@integration: + yarn audit ; RC=$${?} ; [ $${RC} -gt 2 ] && exit $${RC} || exit 0 + +security.npm@integration: + npm audit --audit-level moderate + +######## +# Test # +######## + +... + +test.phpunit@integration: export APP_ENV = test +test.phpunit@integration: + # Db + bin/console doctrine:database:create --ansi + bin/console doctrine:schema:create --ansi + # PHPUnit + bin/phpunit --colors=always --log-junit report/junit/phpunit.xml + +test.jest@integration: export JEST_JUNIT_OUTPUT_DIR = report/junit +test.jest@integration: export JEST_JUNIT_OUTPUT_NAME = jest.xml +test.jest@integration: + npx jest --ci --color --reporters=default --reporters=jest-junit + +``` + +## Deliveries + +Here is an example of a production/staging deliveries configuration in `.manala.yaml`: + +```yaml +############## +# Deliveries # +############## + +deliveries: + + - &delivery + #app: api # Optional + tier: production + #ref: staging # Default to master + # Release + release_repo: git@git.example.com:/-release.git + #release_ref: master # Based on app/tier by default + release_tasks: + - shell: make install@production + - shell: make build@production + # You can either explicitly list all the paths you want to include + release_add: + - bin + - config + - public + - src + - templates + - translations + - vendor + - composer.* # Composer.json required by src/Kernel.php to determine project root dir + # Composer.lock required by composer on post-install (warmup) + - Makefile + + # Or you can include all by default and only list the paths you want to exclude + # release_remove: + # - ansible + # - build + # - doc + # - node_modules + # - tests + # - .env.test + # - .php_cs.dist + # - .manala* + # - package.json + # - phpunit.xml.dist + # - README.md + # - webpack.config.js + # - yarn.lock + + # Deploy + deploy_hosts: + - ssh_host: foo-01.bar.elao.local + #master: true # Any custom variable are welcomed + - ssh_host: foo-02.bar.elao.local + deploy_dir: /srv/app + #deploy_url: https://foo.com # Url to visit after deploy + deploy_shared_files: + - config/parameters.yml + deploy_shared_dirs: + - var/log + deploy_tasks: + - shell: make warmup@production + #- shell: make migration@production + # when: master | default # Conditions on custom host variables (jinja2 format) + #deploy_remove: + # - web/app_dev.php + deploy_post_tasks: + - shell: sudo /bin/systemctl reload php8.1-fpm + #- shell: sudo /bin/systemctl restart supervisor + + - << : *delivery + tier: staging + release_tasks: + - shell: make install@staging + - shell: make build@staging + # Deploy + deploy_hosts: + - ssh_host: foo.bar.elao.ninja.local + deploy_tasks: + - shell: make warmup@staging +``` + +## Makefile + +Makefile targets that are supposed to be runned via docker must be prefixed. + +```makefile +foo: SHELL := $(or $(DOCKER_SHELL),$(SHELL)) +foo: + # Do something really foo... +``` + +Ssh +```makefile +####### +# Ssh # +####### + +## Ssh to staging server +ssh@staging: SHELL := $(or $(DOCKER_SHELL),$(SHELL)) +ssh@staging: + ssh app@foo.staging.elao.run + +# Single host... + +ssh@production: SHELL := $(or $(DOCKER_SHELL),$(SHELL)) +ssh@production: + ... + +# Multi host... + +ssh@production-01: SHELL := $(or $(DOCKER_SHELL),$(SHELL)) +ssh@production-01: + ... +``` + +Sync +```makefile +sync@staging: SHELL := $(or $(DOCKER_SHELL),$(SHELL)) +sync@staging: + mkdir -p var + rsync --archive --compress --verbose --delete-after \ + app@foo.staging.elao.run:/srv/app/current/var/files/ \ + var/files/ + +# Multi targets... +sync-uploads@staging: SHELL := $(or $(DOCKER_SHELL),$(SHELL)) +sync-uploads@staging: + ... + +# Multi apps... +sync.api-uploads@staging: SHELL := $(or $(DOCKER_SHELL),$(SHELL)) +sync.api-uploads@staging: + ... +``` + +### Git tools + +This recipe contains some git helpers such as the [`git_diff`](./.manala/make/git.mk) function. + +This function is useful for example to apply `php-cs`, `php-cs-fix` or `PHPStan` checks only on the subset of updated PHP files and not on any PHP file of your project. + +Usage (in your `Makefile`): + +```makefile +lint.php-cs-fixer: DIFF = $(call git_diff, php, src tests) +lint.php-cs-fixer: + $(if $(DIFF), \ + vendor/bin/php-cs-fixer fix --config=.php_cs.dist --path-mode=intersection --diff --dry-run $(DIFF), \ + printf "You have made no change in PHP files\n" \ + ) +``` + +### Try tools + +This recipe contains some try helpers such as the [`try_finally`](./.manala/make/try.mk) function. + +This function is useful for example to run `phpunit` tests needing a started symfony server, and to stop this server regardless of the tests retur code. + +Usage (in your `Makefile`): + +```makefile +test.phpunit@integration: + symfony server:start --ansi --no-humanize --daemon --no-tls --port=8000 + $(call try_finally, \ + bin/phpunit --colors=always --log-junit report/junit/phpunit.xml, \ + symfony server:stop --ansi \ + ) +``` + +## Secrets + +In order to generate secrets, use [Gomplate](https://docs.gomplate.ca), called by a make task. +Gomplate takes a template, queries its values from a Vault server and renders a file. + +Add the following tasks in the `Makefile`: + +```makefile +########### +# Secrets # +########### + +secrets@production: + gomplate --input-dir=secrets/production --output-map='{{ .in | replaceAll ".gohtml" "" }}' + +secrets@staging: + gomplate --input-dir=secrets/staging --output-map='{{ .in | replaceAll ".gohtml" "" }}' +``` + +Put your templates in `.gohtml` files inside a `secrets/[production|staging]` directory at the root of the project. +Respect destination file names, extensions, and paths: + +```treeview +secrets/ +├── production/ +| ├── .env.gohtml +| └── config/ +| └── parameters.yaml.gohtml +└── staging/ + ├── .env.gohtml + └── config/ + └── parameters.yaml.gohtml +``` + +Here are some template examples: + +`production/.env.gohtml`: + +```twig +# This file was generated by Gomplate from Vault secrets for production +{{- range $key, $value := (datasource "vault:///foo_bar/data/env").data }} +{{ $key }}={{ $value | quote }} +{{- end }} +``` + +`staging/.env.gohtml`: + +```twig +# This file was generated by Gomplate from Vault secrets for staging +{{- range $key, $value := (datasource (print "vault:///foo_bar/data/env" (has .Env "STAGE" | ternary (printf "-%s" (getenv "STAGE")) ""))).data }} +{{ $key }}={{ $value | quote }} +{{- end }} +``` + +Note the `STAGE` environnement variable usage, allowing to switch from `env` to `env-${STAGE}` vault secret, calling `make secrets@staging STAGE=foo`. + +`production/config/parameters.yaml.gohtml`: + +```twig +# This file was generated by Gomplate from Vault secrets for production +parameters: +{{ (datasource "vault:///foo_bar/data/parameters").data | toYAML | indent 4 -}} +``` + +!!! Note + Note that the path to the secret will slightly differ from what the Vault server will display: + if the path is `MyApp/production/env` on the Vault server, + it will become `MyApp/data/production/env` in the template + +See [Go Template syntax](https://docs.gomplate.ca/syntax/) for more info. + +!!! Warning + Make sure to include the `secrets` directory into your deliveries, using the `release_add` entry. + +## Https + +In order for https to work properly, you must: + +1. ensure elao ca certificate has been added to your local keychain (one time for *all* projects) + + ```shell + $ sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" .manala/certificates/ca.crt + ``` + +2. generate a project certificate (one time *by* project, remember to commit them right after) + + ```shell + ⇒ make provision.certificates + ``` + +3. For firefox only, browse to `about:config` and ensure `security.enterprise_roots.enabled` value is set to true + +## Caveats + +- MySQL 5.7 docker images are not available on arm64, that's why amd64 architecture is forced. Expect rare speed and stability issues. +- Nginx official debian packages for stretch are not available on arm64, that's why debian packages are used in version `1.10`. Expect rare configuration issues. +- OpenSSL debian packages for buster are broken on arm64, that's why bullseye ones are used. Expect rare behavior issues. +- Firefox is blocking some ports like `10080`. Try to avoid them. diff --git a/.manala/ansible/collections/requirements.yaml b/.manala/ansible/collections/requirements.yaml new file mode 100644 index 0000000..bd2d5c6 --- /dev/null +++ b/.manala/ansible/collections/requirements.yaml @@ -0,0 +1,11 @@ +--- + +collections: + - ansible.posix + - community.docker + - community.general + - community.mongodb + - community.mysql + - gluster.gluster + - manala.roles + - community.crypto diff --git a/.manala/ansible/deploy.yaml b/.manala/ansible/deploy.yaml new file mode 100644 index 0000000..93e4f91 --- /dev/null +++ b/.manala/ansible/deploy.yaml @@ -0,0 +1,7 @@ +--- + +- hosts: deploy + any_errors_fatal: true + tasks: + - import_role: + name: deploy diff --git a/.manala/ansible/inventories/deploy.yaml b/.manala/ansible/inventories/deploy.yaml new file mode 100644 index 0000000..19d70ee --- /dev/null +++ b/.manala/ansible/inventories/deploy.yaml @@ -0,0 +1,2 @@ +deploy: + children: diff --git a/.manala/ansible/inventories/release.yaml b/.manala/ansible/inventories/release.yaml new file mode 100644 index 0000000..4d5905c --- /dev/null +++ b/.manala/ansible/inventories/release.yaml @@ -0,0 +1,2 @@ +release: + children: diff --git a/.manala/ansible/inventories/system.development.yaml b/.manala/ansible/inventories/system.development.yaml new file mode 100644 index 0000000..72124d8 --- /dev/null +++ b/.manala/ansible/inventories/system.development.yaml @@ -0,0 +1,61 @@ +system: + + hosts: + + ############### + # Development # + ############### + + development: + + # Alternatives + system_alternatives: true + # Apt + system_apt: true + system_apt_packages: + - pv # for real-time progress on streams (e.g mysql import) + - tcpdump + # Certificates + system_certificates: true + # Cron + system_cron: false + # Elasticsearch + system_elasticsearch: false + # Environment + system_environment: true + # Files + system_files: true + # Git + system_git: true + # Gomplate + system_gomplate: true + # InfluxDB + system_influxdb: false + # Locales + system_locales: true + # Network + system_network: false + system_network_hosts: {} + # Nginx + system_nginx: true + # Ngrok + system_ngrok: true + # NodeJS + system_nodejs: true + # Oh my zsh + system_ohmyzsh: true + # Php + system_php: true + # Redis + system_redis: false + # Ssh + system_ssh: true + system_ssh_client_config_template: ssh/development/ssh_config.j2 + # Supervisor + system_supervisor: false + # Timezone + system_timezone: true + # Vim + system_vim: true + # Zsh + system_zsh: true diff --git a/.manala/ansible/inventories/system.integration.yaml b/.manala/ansible/inventories/system.integration.yaml new file mode 100644 index 0000000..b448267 --- /dev/null +++ b/.manala/ansible/inventories/system.integration.yaml @@ -0,0 +1,30 @@ +system: + + hosts: + + ############### + # Integration # + ############### + + integration: + + # Apt + system_apt: true + system_apt_packages: + - procps + - vim-tiny + # Files + system_files: true + # Git + system_git: true + # Locales + system_locales: true + # NodeJS + system_nodejs: true + # Php + system_php: true + system_php_sapis: + - cli + # Ssh + system_ssh: true + system_ssh_client_config_template: ssh/integration/ssh_config.j2 diff --git a/.manala/ansible/inventories/system.yaml b/.manala/ansible/inventories/system.yaml new file mode 100644 index 0000000..592d11d --- /dev/null +++ b/.manala/ansible/inventories/system.yaml @@ -0,0 +1,120 @@ +system: + + vars: + + # Ansible + ansible_connection: local + ansible_python_interpreter: /usr/bin/python3 + + # Variables + apt_architecture: "{{ ansible_architecture | manala.roles.apt_architecture }}" + + # Alternatives + system_alternatives: false + # App + system_app_group: app + system_app_user: app + system_app_dir: /srv/app + system_app_log_dir: /srv/log + system_app_cache_dir: /srv/cache + system_app_sessions_dir: /srv/sessions + system_app_release_dir: /srv/release + # Apt + system_apt: false + system_apt_repositories: [] + system_apt_preferences: [] + system_apt_holds: [] + # Certificates + system_certificates: false + system_certificates_name: elao-tricot.ela.ooo + # Cron + system_cron: false + system_cron_files: [] + # Elasticsearch + system_elasticsearch: false + system_elasticsearch_version: null + system_elasticsearch_plugins: [] + # Environment + system_environment: false + system_env: {} + # Files + system_files: false + system_files_attributes: [] + # Git + system_git: false + # Gomplate + system_gomplate: false + # InfluxDB + system_influxdb: false + system_influxdb_config: {} + system_influxdb_databases: [] + system_influxdb_users: [] + system_influxdb_privileges: [] + # Locales + system_locales: false + system_locales_codes: [] + # MariaDB + system_mariadb: false + system_mariadb_version: null + system_mariadb_install_packages: + - mariadb-client + # MySQL + system_mysql: false + system_mysql_version: null + system_mysql_install_packages: + - default-mysql-client + - libmariadb3 + # Network + system_network: false + # Nginx + system_nginx: false + system_nginx_configs: + - template: nginx/gzip.j2 + - config: | + server { + server_name ~.; + root /srv/app/public; + access_log /srv/log/nginx.access.log; + error_log /srv/log/nginx.error.log; + include conf.d/gzip; + } + file: app.conf + # Ngrok + system_ngrok: false + # NodeJS + system_nodejs: false + system_nodejs_version: 8 + system_nodejs_npm: "{{ system_nodejs }}" + system_nodejs_packages: [] + system_nodejs_yarn: false + # Oh my zsh + system_ohmyzsh: false + # Php + system_php: false + system_php_version: 8.1 + system_php_composer: "{{ system_php }}" + system_php_composer_version: null + system_php_sapis: + - cli + - fpm + system_php_extensions: [] + system_php_configs: [] + # Redis + system_redis: false + system_redis_version: null + system_redis_server_config: {} + # Ssh + system_ssh: false + system_ssh_client_config: null + # Supervisor + system_supervisor: false + system_supervisor_configs: [] + # Symfony Cli + system_symfony_cli: "{{ system_php }}" + # Timezone + system_timezone: false + system_timezone_default: Etc/UTC + # Vim + system_vim: false + # Zsh + system_zsh: false diff --git a/.manala/ansible/make.mk b/.manala/ansible/make.mk new file mode 100644 index 0000000..006190d --- /dev/null +++ b/.manala/ansible/make.mk @@ -0,0 +1,50 @@ +########### +# Ansible # +########### + +# Tags +ifdef TAGS +_ANSIBLE_PLAYBOOK_TAGS = $(TAGS) +endif + +# Diff +ifdef DIFF +_ANSIBLE_PLAYBOOK_CHECK = 1 +_ANSIBLE_PLAYBOOK_DIFF = 1 +endif + +# Verbose +ifdef VERBOSE +_ANSIBLE_PLAYBOOK_VERBOSE_MORE = 1 +endif + +# Limit +ifdef LIMIT +_ANSIBLE_PLAYBOOK_LIMIT = $(LIMIT) +else +_ANSIBLE_PLAYBOOK_LIMIT = development +endif + +# Internal usage: +# $(_ansible_galaxy_collection_install) [REQUIREMENTS] + +define _ansible_galaxy_collection_install + ansible-galaxy collection install \ + --upgrade \ + --requirements-file +endef + +# Internal usage: +# $(_ansible_playbook) [PLAYBOOK] + +define _ansible_playbook + ansible-playbook \ + $(if $(_ANSIBLE_PLAYBOOK_INVENTORY),--inventory $(_ANSIBLE_PLAYBOOK_INVENTORY)) \ + $(if $(_ANSIBLE_PLAYBOOK_BECOME),--become) \ + $(if $(_ANSIBLE_PLAYBOOK_LIMIT),--limit $(_ANSIBLE_PLAYBOOK_LIMIT)) \ + $(if $(_ANSIBLE_PLAYBOOK_EXTRA_VARS),--extra-vars $(_ANSIBLE_PLAYBOOK_EXTRA_VARS)) \ + $(if $(_ANSIBLE_PLAYBOOK_TAGS),--tags $(_ANSIBLE_PLAYBOOK_TAGS)) \ + $(if $(_ANSIBLE_PLAYBOOK_CHECK),--check) \ + $(if $(_ANSIBLE_PLAYBOOK_DIFF),--diff) \ + $(if $(_ANSIBLE_PLAYBOOK_VERBOSE_MORE),-vvv) +endef diff --git a/.manala/ansible/release.yaml b/.manala/ansible/release.yaml new file mode 100644 index 0000000..53a9416 --- /dev/null +++ b/.manala/ansible/release.yaml @@ -0,0 +1,6 @@ +--- + +- hosts: release + tasks: + - import_role: + name: release diff --git a/.manala/ansible/roles/certificates/defaults/main.yml b/.manala/ansible/roles/certificates/defaults/main.yml new file mode 100644 index 0000000..adc75ef --- /dev/null +++ b/.manala/ansible/roles/certificates/defaults/main.yml @@ -0,0 +1,10 @@ +--- + +certificates_name: ~ +certificates_ca: "{{ playbook_dir }}/../certificates/ca.crt" +certificates_ca_key: "{{ playbook_dir }}/../certificates/ca.key" +certificates_ca_key_passphrase: ~ +certificates_ssl_key: "{{ playbook_dir }}/../certificates/ssl.key" +certificates_ssl_csr: "{{ playbook_dir }}/../certificates/ssl.csr" +certificates_ssl_pem: "{{ playbook_dir }}/../certificates/ssl.pem" +certificates_prompt: false diff --git a/.manala/ansible/roles/certificates/tasks/main.yaml b/.manala/ansible/roles/certificates/tasks/main.yaml new file mode 100644 index 0000000..819dcdb --- /dev/null +++ b/.manala/ansible/roles/certificates/tasks/main.yaml @@ -0,0 +1,107 @@ +--- + +# Install packages +- name: certificates > Install packages + ansible.builtin.apt: + name: + - python3-cryptography + install_recommends: false + update_cache: true + cache_valid_time: 3600 + +# Install ca certificate +- name: certificates > Install ca + ansible.builtin.copy: + src: "{{ certificates_ca }}" + dest: /usr/local/share/ca-certificates/ + remote_src: true + register: __certificates_install_ca_result + +# Update ca certificates +- name: certificates > Update + ansible.builtin.command: update-ca-certificates + when: __certificates_install_ca_result is changed + +# Ca certificate key passphrase prompt +- block: + - name: certificates > Prompt ca key passphrase + ansible.builtin.pause: + prompt: Enter ca key passphrase + echo: false + register: __certificates_ca_key_passphrase + - name: certificates > Assign ca key passphrase + ansible.builtin.set_fact: + certificates_ca_key_passphrase: "{{__certificates_ca_key_passphrase.user_input}}" + when: certificates_prompt + +# Generate ssl certificate from ca certificate +- block: + - name: certificates > Generate ssl private key + community.crypto.openssl_privatekey: + path: "{{ certificates_ssl_key }}" + force: true + type: RSA + size: 4096 + mode: 0644 + - name: certificates > Generate ssl certificate signing request + community.crypto.openssl_csr: + path: "{{ certificates_ssl_csr }}" + privatekey_path: "{{ certificates_ssl_key }}" + force: true + common_name: |- + {{ certificates_name }} + subject_alt_name: |- + DNS:{{ certificates_name }},DNS:*.{{ certificates_name }} + - name: certificates > Generate ssl certificate + community.crypto.x509_certificate: + path: "{{ certificates_ssl_pem }}" + csr_path: "{{ certificates_ssl_csr }}" + force: true + provider: ownca + ownca_path: "{{ certificates_ca }}" + ownca_privatekey_path: "{{ certificates_ca_key }}" + ownca_privatekey_passphrase: "{{ certificates_ca_key_passphrase }}" + ownca_not_after: +825d + when: (certificates_ca_key_passphrase) + +# Copy ssl certificate +- block: + - name: certificates > Copy ssl certificate + ansible.builtin.copy: + src: "{{ item[0] }}" + dest: /etc/ssl/{{ item[1] }}/{{ item[0] | basename }} + loop: + - ["{{ certificates_ssl_pem }}", certs] + - ["{{ certificates_ssl_key }}", private] + notify: + - nginx restart + when: (certificates_ssl_key is file) + and (certificates_ssl_pem is file) + +# Generate self signed ssl certificate +- block: + - name: certificates > Generate self signed ssl private key + community.crypto.openssl_privatekey: + path: /etc/ssl/private/ssl.key + type: RSA + size: 4096 + notify: + - nginx restart + - name: certificates > Generate self signed ssl certificate signing request + community.crypto.openssl_csr: + path: /etc/ssl/certs/ssl.csr + privatekey_path: /etc/ssl/private/ssl.key + common_name: |- + {{ certificates_name }} + subject_alt_name: |- + DNS:{{ certificates_name }},DNS:*.{{ certificates_name }} + - name: certificates > Generate self signed ssl certificate + community.crypto.x509_certificate: + path: /etc/ssl/certs/ssl.pem + csr_path: /etc/ssl/certs/ssl.csr + privatekey_path: /etc/ssl/private/ssl.key + provider: selfsigned + notify: + - nginx restart + when: (certificates_ssl_key is not file) + or (certificates_ssl_pem is not file) diff --git a/.manala/ansible/roles/deploy/callback_plugins/.gitignore b/.manala/ansible/roles/deploy/callback_plugins/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.manala/ansible/roles/deploy/callback_plugins/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/.manala/ansible/roles/deploy/callback_plugins/log.py b/.manala/ansible/roles/deploy/callback_plugins/log.py new file mode 100644 index 0000000..bac150a --- /dev/null +++ b/.manala/ansible/roles/deploy/callback_plugins/log.py @@ -0,0 +1,73 @@ +from ansible import constants as C +from ansible.plugins.callback import CallbackBase + +class CallbackModule(CallbackBase): + CALLBACK_VERSION = 2.0 + CALLBACK_TYPE = 'notification' + CALLBACK_NAME = 'log' + CALLBACK_NEEDS_WHITELIST = False + + def _std(self, result): + stderr = result._result.get('stderr') + if stderr: + self._display.display('<<< stderr', color=C.COLOR_WARN) + self._display.display(stderr) + self._display.display('>>> stderr' + "\r\n", color=C.COLOR_WARN) + + stdout = result._result.get('stdout') + if stdout: + self._display.display('<<< stdout', color=C.COLOR_DEBUG) + self._display.display(stdout) + self._display.display('>>> stdout' + "\r\n", color=C.COLOR_DEBUG) + + def v2_runner_on_ok(self, result): + # No loop + if result._task_fields.get('loop'): + return + + # Command module + if not result._task_fields.get('action') == 'command': + return + + # Tags + if not any(tag in result._task_fields.get('tags') for tag in ('log', 'log_ok')): + return + + self._std(result) + + def v2_runner_item_on_ok(self, result): + # Command module + if not result._task_fields.get('action') == 'command': + return + + # Tags + if not any(tag in result._task_fields.get('tags') for tag in ('log', 'log_ok')): + return + + self._std(result) + + def v2_runner_on_failed(self, result, ignore_errors=False): + # No loop + if result._task_fields.get('loop'): + return + + # Command module + if not result._task_fields.get('action') == 'command': + return + + # Tags + if not any(tag in result._task_fields.get('tags') for tag in ('log', 'log_failed')): + return + + self._std(result) + + def v2_runner_item_on_failed(self, result): + # Command module + if not result._task_fields.get('action') == 'command': + return + + # Tags + if not any(tag in result._task_fields.get('tags') for tag in ('log', 'log_failed')): + return + + self._std(result) diff --git a/.manala/ansible/roles/deploy/defaults/main.yml b/.manala/ansible/roles/deploy/defaults/main.yml new file mode 100644 index 0000000..57a753a --- /dev/null +++ b/.manala/ansible/roles/deploy/defaults/main.yml @@ -0,0 +1,49 @@ +--- + +# Dirs +deploy_dir: ~ +deploy_current_dir: current +deploy_releases_dir: releases +deploy_shared_dir: shared + +# Releases +deploy_releases: 5 + +# Strategy +deploy_strategy: git + +# Strategy - Git +deploy_strategy_git_repo: ~ +deploy_strategy_git_ref: master + +# [READ-ONLY] This variable will be filled with the head commit hash +deploy_strategy_git_head: ~ + +# Strategy - Synchronize +deploy_strategy_synchronize_src: ~ +deploy_strategy_synchronize_dst: ~ +deploy_strategy_synchronize_rsync_options: [] + +# Strategy - Unarchive +deploy_strategy_unarchive_src: ~ + +# Shared +deploy_shared_files: [] +deploy_shared_dirs: [] + +# Copied +deploy_copied: [] + +# Remove +deploy_remove: [] + +# Writable +deploy_writable_dirs_default: # Ensure backward compatibility + mode: "{{ deploy_writable_dirs_mode|default('ug=rwx,o=rx') }}" + follow: true + recurse: true +deploy_writable_dirs: [] + +# Tasks +deploy_tasks: [] +deploy_post_tasks: [] diff --git a/.manala/ansible/roles/deploy/lookup_plugins/.gitignore b/.manala/ansible/roles/deploy/lookup_plugins/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.manala/ansible/roles/deploy/lookup_plugins/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/.manala/ansible/roles/deploy/lookup_plugins/deploy_tasks.py b/.manala/ansible/roles/deploy/lookup_plugins/deploy_tasks.py new file mode 100644 index 0000000..5a81de4 --- /dev/null +++ b/.manala/ansible/roles/deploy/lookup_plugins/deploy_tasks.py @@ -0,0 +1,59 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.plugins.lookup import LookupBase +from ansible.module_utils.six import string_types +from ansible.errors import AnsibleError + +class LookupModule(LookupBase): + + def run(self, terms, variables=None, **kwargs): + + results = [] + + itemDefault = { + 'options': None, + 'when': True, + 'dir': + (variables['deploy_helper']['new_release_path']) + if 'deploy_helper' in variables else + (variables['deploy_dir'] + '/' + variables['deploy_current_dir']), + 'shared_dir': + (variables['deploy_helper']['shared_path']) + if 'deploy_helper' in variables else + (variables['deploy_dir'] + '/' + variables['deploy_shared_dir']) + } + + for term in self._flatten(terms): + + items = [] + + # Task as a single line + if isinstance(term, string_types): + item = itemDefault.copy() + item.update({ + 'task': term + }) + items.append(item) + else: + # Guess task (first one not in blacklist) + item = None + for termKey, termValue in term.items(): + if termKey not in ['when']: + item = itemDefault.copy() + item.update({ + 'task': termKey, + 'options': termValue + }) + break + if item: + item.update({ + 'when': term.get('when') if 'when' in term else True + }) + items.append(item) + + # Merge + for item in items: + results.append(item) + + return results diff --git a/.manala/ansible/roles/deploy/lookup_plugins/deploy_writable_dirs.py b/.manala/ansible/roles/deploy/lookup_plugins/deploy_writable_dirs.py new file mode 100644 index 0000000..43e738d --- /dev/null +++ b/.manala/ansible/roles/deploy/lookup_plugins/deploy_writable_dirs.py @@ -0,0 +1,53 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.plugins.lookup import LookupBase +from ansible.module_utils.six import string_types +from ansible.errors import AnsibleError + +class LookupModule(LookupBase): + + def run(self, terms, variables=None, **kwargs): + + results = [] + + dirs = self._flatten(terms[0]) + default = terms[1] + + for dir in dirs: + + items = [] + + # Dir as a single line + if isinstance(dir, string_types): + item = default.copy() + item.update({ + 'dir': dir + }) + items.append(item) + else: + + # Must be a dict + if not isinstance(dir, dict): + raise AnsibleError('Expect a dict') + + # Check index key + if 'dir' not in dir: + raise AnsibleError('Expect "dir" key') + + item = default.copy() + item.update(dir) + items.append(item) + + # Merge by index key + for item in items: + itemFound = False + for i, result in enumerate(results): + if result['dir'] == item['dir']: + results[i] = item + itemFound = True + break + if not itemFound: + results.append(item) + + return results diff --git a/.manala/ansible/roles/deploy/tasks/main.yml b/.manala/ansible/roles/deploy/tasks/main.yml new file mode 100644 index 0000000..650722c --- /dev/null +++ b/.manala/ansible/roles/deploy/tasks/main.yml @@ -0,0 +1,84 @@ +--- + +# Setup +- name: setup > Create structure + community.general.deploy_helper: + path: "{{ deploy_dir }}" + current_path: "{{ deploy_current_dir }}" + releases_path: "{{ deploy_releases_dir }}" + shared_path: "{{ deploy_shared_dir }}" + keep_releases: "{{ deploy_releases }}" + state: present + +# Strategy +- name: strategy + ansible.builtin.include_tasks: "strategy/{{ deploy_strategy }}.yml" + +# Unfinished +- name: unfinished > Add an unfinished file, to allow cleanup on successful finalize + ansible.builtin.file: + path: "{{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }}" + state: touch + +# Shared +- ansible.builtin.import_tasks: shared.yml + +# Copied +- name: copied > Stat + ansible.builtin.stat: + path: "{{ deploy_helper.previous_release_path ~ '/' ~ item }}" + register: __deploy_copied_stats_output + with_items: "{{ deploy_copied }}" + +- name: copied > Copy + ansible.builtin.shell: > + cp -R {{ deploy_helper.previous_release_path ~ '/' ~ item.1 ~ (__deploy_copied_stats_output.results[item.0].stat.isdir|ternary('/', '')) }} + {{ deploy_helper.new_release_path ~ '/' ~ item.1 }} + delegate_to: "{{ inventory_hostname }}" + with_indexed_items: "{{ deploy_copied }}" + when: __deploy_copied_stats_output.results[item.0].stat.exists + tags: log_failed + +# Writable - Dirs +- ansible.builtin.import_tasks: writable/dirs.yml + +# Tasks +- name: tasks + ansible.builtin.include_tasks: task/{{ item.task }}.yml + loop: "{{ query('deploy_tasks', deploy_tasks) }}" + when: item.when + +# Remove +- name: remove > Files + file: + path: "{{ deploy_helper.new_release_path ~ '/' ~ item }}" + state: absent + with_items: "{{ deploy_remove }}" + +# Finalize +- name: finalize > Remove the unfinished file and create a symlink to the newly deployed release + deploy_helper: + path: "{{ deploy_dir }}" + current_path: "{{ deploy_current_dir }}" + releases_path: "{{ deploy_releases_dir }}" + release: "{{ deploy_helper.new_release }}" + keep_releases: "{{ deploy_releases }}" + state: finalize + clean: false + +# Clean +- name: clean > Remove failed and old releases, keeping "{{ deploy_releases }}" releases + deploy_helper: + path: "{{ deploy_dir }}" + current_path: "{{ deploy_current_dir }}" + releases_path: "{{ deploy_releases_dir }}" + release: "{{ deploy_helper.new_release }}" + keep_releases: "{{ deploy_releases }}" + state: clean + ignore_errors: true + +# Post tasks +- name: post tasks + include_tasks: task/{{ item.task }}.yml + loop: "{{ query('deploy_tasks', deploy_post_tasks) }}" + when: item.when diff --git a/.manala/ansible/roles/deploy/tasks/shared.yml b/.manala/ansible/roles/deploy/tasks/shared.yml new file mode 100644 index 0000000..d70c590 --- /dev/null +++ b/.manala/ansible/roles/deploy/tasks/shared.yml @@ -0,0 +1,47 @@ +--- + +- name: shared > Ensure release targets are absent + ansible.builtin.file: + path: "{{ deploy_helper.new_release_path ~ '/' ~ item }}" + state: absent + with_items: "{{ deploy_shared_files + deploy_shared_dirs }}" + +- name: shared > Stat shared files + ansible.builtin.stat: + path: "{{ deploy_helper.shared_path ~ '/' ~ item }}" + register: __deploy_shared_files_stats_output + with_items: "{{ deploy_shared_files }}" + +- name: shared > Ensure shared directories files are present + ansible.builtin.file: + path: "{{ (deploy_helper.shared_path ~ '/' ~ item.1)|dirname }}" + state: directory + with_indexed_items: "{{ deploy_shared_files }}" + when: not __deploy_shared_files_stats_output.results[item.0].stat.exists + +- name: shared > Ensure shared files are present + ansible.builtin.file: + path: "{{ deploy_helper.shared_path ~ '/' ~ item.1 }}" + state: touch + with_indexed_items: "{{ deploy_shared_files }}" + when: not __deploy_shared_files_stats_output.results[item.0].stat.exists + +- name: shared > Ensure shared dirs are present + ansible.builtin.file: + path: "{{ deploy_helper.shared_path ~ '/' ~ item }}" + state: directory + follow: true + with_items: "{{ deploy_shared_dirs }}" + +- name: shared > Ensure directories links are present + ansible.builtin.file: + path: "{{ (deploy_helper.new_release_path ~ '/' ~ item)|dirname }}" + state: directory + with_items: "{{ deploy_shared_files + deploy_shared_dirs }}" + +- name: shared > Links + ansible.builtin.file: + path: "{{ deploy_helper.new_release_path ~ '/' ~ item }}" + src: "{{ (deploy_helper.shared_path ~ '/' ~ item)|relpath((deploy_helper.new_release_path ~ '/' ~ item)|dirname) }}" + state: link + with_items: "{{ deploy_shared_files + deploy_shared_dirs }}" diff --git a/.manala/ansible/roles/deploy/tasks/strategy/git.yml b/.manala/ansible/roles/deploy/tasks/strategy/git.yml new file mode 100644 index 0000000..640aec7 --- /dev/null +++ b/.manala/ansible/roles/deploy/tasks/strategy/git.yml @@ -0,0 +1,32 @@ +--- + +- name: strategy/git + block: + + - name: strategy/git > Repository + ansible.builtin.git: + repo: "{{ deploy_strategy_git_repo }}" + dest: "{{ deploy_dir ~ '/repo' }}" + version: "{{ deploy_strategy_git_ref }}" + accept_hostkey: true + update: true + force: true + + - name: strategy/git > Get head + ansible.builtin.shell: > + git rev-parse --short HEAD + args: + chdir: "{{ deploy_dir ~ '/repo' }}" + tags: log_failed + register: __deploy_strategy_git_head_result + + - name: strategy/git > Set head + ansible.builtin.set_fact: + deploy_strategy_git_head: "{{ __deploy_strategy_git_head_result.stdout }}" + + - name: strategy/git > Export repository + ansible.builtin.shell: > + git checkout-index -f -a --prefix="{{ deploy_helper.new_release_path }}/" + args: + chdir: "{{ deploy_dir ~ '/repo' }}" + tags: log_failed diff --git a/.manala/ansible/roles/deploy/tasks/strategy/synchronize.yml b/.manala/ansible/roles/deploy/tasks/strategy/synchronize.yml new file mode 100644 index 0000000..967f80d --- /dev/null +++ b/.manala/ansible/roles/deploy/tasks/strategy/synchronize.yml @@ -0,0 +1,10 @@ +--- + +- name: strategy/synchronize + block: + + - name: strategy/synchronize > Synchronize + ansible.posix.synchronize: + src: "{{ deploy_strategy_synchronize_src }}" + dest: "{{ deploy_helper.new_release_path }}/" + rsync_opts: "{{ deploy_strategy_synchronize_rsync_options }}" diff --git a/.manala/ansible/roles/deploy/tasks/strategy/unarchive.yml b/.manala/ansible/roles/deploy/tasks/strategy/unarchive.yml new file mode 100644 index 0000000..c06dcd0 --- /dev/null +++ b/.manala/ansible/roles/deploy/tasks/strategy/unarchive.yml @@ -0,0 +1,14 @@ +--- + +- name: strategy/unarchive + block: + + - name: strategy/unarchive > Create dir + ansible.builtin.file: + path: "{{ deploy_helper.new_release_path }}/" + state: directory + + - name: strategy/unarchive > Unarchive + ansible.builtin.unarchive: + src: "{{ deploy_strategy_unarchive_src }}" + dest: "{{ deploy_helper.new_release_path }}" diff --git a/.manala/ansible/roles/deploy/tasks/task/shell.yml b/.manala/ansible/roles/deploy/tasks/task/shell.yml new file mode 100644 index 0000000..2bbe0c4 --- /dev/null +++ b/.manala/ansible/roles/deploy/tasks/task/shell.yml @@ -0,0 +1,11 @@ +--- + +- name: task/shell + block: + + - name: task/shell > "{{ item.options }}" in "{{ item.dir }}" + ansible.builtin.shell: > + {{ item.options }} + args: + chdir: "{{ item.dir }}" + tags: log diff --git a/.manala/ansible/roles/deploy/tasks/writable/dirs.yml b/.manala/ansible/roles/deploy/tasks/writable/dirs.yml new file mode 100644 index 0000000..424c5f9 --- /dev/null +++ b/.manala/ansible/roles/deploy/tasks/writable/dirs.yml @@ -0,0 +1,19 @@ +--- + +- name: writable/dirs > "{{ item.dir }}" + ansible.builtin.file: + path: "{{ deploy_helper.new_release_path ~ '/' ~ item.dir }}" + recurse: "{{ item.recurse|default(omit) }}" + follow: "{{ item.follow|default(omit) }}" + mode: "{{ item.mode|default(omit) }}" + state: directory + with_deploy_writable_dirs: + - "{{ deploy_writable_dirs }}" + - "{{ deploy_writable_dirs_default }}" + +- name: writable/dirs > Raw "{{ item.dir }}" + ansible.builtin.raw: "{{ item.raw|format(dir=deploy_helper.new_release_path ~ '/' ~ item.dir) }}" + when: item.raw is defined + with_deploy_writable_dirs: + - "{{ deploy_writable_dirs }}" + - "{{ deploy_writable_dirs_default }}" diff --git a/.manala/ansible/roles/release/callback_plugins/.gitignore b/.manala/ansible/roles/release/callback_plugins/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.manala/ansible/roles/release/callback_plugins/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/.manala/ansible/roles/release/callback_plugins/log.py b/.manala/ansible/roles/release/callback_plugins/log.py new file mode 100644 index 0000000..bac150a --- /dev/null +++ b/.manala/ansible/roles/release/callback_plugins/log.py @@ -0,0 +1,73 @@ +from ansible import constants as C +from ansible.plugins.callback import CallbackBase + +class CallbackModule(CallbackBase): + CALLBACK_VERSION = 2.0 + CALLBACK_TYPE = 'notification' + CALLBACK_NAME = 'log' + CALLBACK_NEEDS_WHITELIST = False + + def _std(self, result): + stderr = result._result.get('stderr') + if stderr: + self._display.display('<<< stderr', color=C.COLOR_WARN) + self._display.display(stderr) + self._display.display('>>> stderr' + "\r\n", color=C.COLOR_WARN) + + stdout = result._result.get('stdout') + if stdout: + self._display.display('<<< stdout', color=C.COLOR_DEBUG) + self._display.display(stdout) + self._display.display('>>> stdout' + "\r\n", color=C.COLOR_DEBUG) + + def v2_runner_on_ok(self, result): + # No loop + if result._task_fields.get('loop'): + return + + # Command module + if not result._task_fields.get('action') == 'command': + return + + # Tags + if not any(tag in result._task_fields.get('tags') for tag in ('log', 'log_ok')): + return + + self._std(result) + + def v2_runner_item_on_ok(self, result): + # Command module + if not result._task_fields.get('action') == 'command': + return + + # Tags + if not any(tag in result._task_fields.get('tags') for tag in ('log', 'log_ok')): + return + + self._std(result) + + def v2_runner_on_failed(self, result, ignore_errors=False): + # No loop + if result._task_fields.get('loop'): + return + + # Command module + if not result._task_fields.get('action') == 'command': + return + + # Tags + if not any(tag in result._task_fields.get('tags') for tag in ('log', 'log_failed')): + return + + self._std(result) + + def v2_runner_item_on_failed(self, result): + # Command module + if not result._task_fields.get('action') == 'command': + return + + # Tags + if not any(tag in result._task_fields.get('tags') for tag in ('log', 'log_failed')): + return + + self._std(result) diff --git a/.manala/ansible/roles/release/defaults/main.yml b/.manala/ansible/roles/release/defaults/main.yml new file mode 100644 index 0000000..e81cd8c --- /dev/null +++ b/.manala/ansible/roles/release/defaults/main.yml @@ -0,0 +1,24 @@ +--- + +# Dirs +release_dir: ~ +release_target_dir: ~ + +# Git +release_git_dir: ~ +release_repo: ~ +release_ref: master + +# Tasks +release_tasks: [] + +# Add / Remove +release_add: [] +release_remove: [] + +# Author +release_author: ~ + +# Regex +release_git_url_regex: '^(?Phttps|git)(:\/\/|@)(?P[^\/:]+)[\/:](?P[^\/:]+)\/(?P.+).git$' +release_email_regex: '^(?P.*) <(?P.*)>$' diff --git a/.manala/ansible/roles/release/lookup_plugins/.gitignore b/.manala/ansible/roles/release/lookup_plugins/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.manala/ansible/roles/release/lookup_plugins/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/.manala/ansible/roles/release/lookup_plugins/release_tasks.py b/.manala/ansible/roles/release/lookup_plugins/release_tasks.py new file mode 100644 index 0000000..97b37be --- /dev/null +++ b/.manala/ansible/roles/release/lookup_plugins/release_tasks.py @@ -0,0 +1,51 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.plugins.lookup import LookupBase +from ansible.module_utils.six import string_types +from ansible.errors import AnsibleError + +class LookupModule(LookupBase): + + def run(self, terms, variables=None, **kwargs): + + results = [] + + itemDefault = { + 'options': None, + 'when': True + } + + for term in self._flatten(terms): + + items = [] + + # Task as a single line + if isinstance(term, string_types): + item = itemDefault.copy() + item.update({ + 'task': term + }) + items.append(item) + else: + # Guess task (first one not in blacklist) + item = None + for termKey, termValue in term.items(): + if termKey not in ['when']: + item = itemDefault.copy() + item.update({ + 'task': termKey, + 'options': termValue + }) + break + if item: + item.update({ + 'when': term.get('when') if 'when' in term else True + }) + items.append(item) + + # Merge + for item in items: + results.append(item) + + return results diff --git a/.manala/ansible/roles/release/tasks/main.yml b/.manala/ansible/roles/release/tasks/main.yml new file mode 100644 index 0000000..595a4e6 --- /dev/null +++ b/.manala/ansible/roles/release/tasks/main.yml @@ -0,0 +1,116 @@ +--- + +- name: git > Get url + ansible.builtin.shell: > + git config --get remote.origin.url + args: + chdir: "{{ release_git_dir }}" + tags: log_failed + register: __release_git_url + +- name: git > Get informations + ansible.builtin.git: + repo: "{{ __release_git_url.stdout }}" + dest: "{{ release_git_dir }}" + clone: false + update: false + register: __release_git + +- name: Release directory "{{ release_dir }}" + ansible.builtin.shell: > + rm --recursive --force {{ release_dir }} + && mkdir -p {{ release_dir }} + args: + warn: false + tags: log_failed + +- name: git > Export repository + ansible.builtin.shell: > + git archive HEAD{{ + ' ' ~ release_target_dir if (release_target_dir) else '' + }} + | tar -x -C {{ release_dir }}{{ + ' ' ~ release_target_dir + ~ ' --strip-components=' ~ release_target_dir.split('/')|length + if (release_target_dir) else + '' + }} + args: + chdir: "{{ release_git_dir }}" + tags: log_failed + +- name: tasks + ansible.builtin.include_tasks: task/{{ item.task }}.yml + loop: "{{ query('release_tasks', release_tasks) }}" + when: item.when + +- name: git > Init "{{ release_repo }}" on branch "{{ release_ref }}" + ansible.builtin.shell: > + git init + && git checkout -b {{ release_ref }} + && git remote add origin {{ release_repo }} + && git fetch + && ( + git show-ref -q origin/{{ release_ref }} ; rc=$? ; + if [ $rc -eq 0 -o $rc -eq 1 ] ; then + if [ $rc -eq 0 ] ; then + git update-ref HEAD origin/{{ release_ref }} ; + fi ; + else + return $rc ; + fi + ) + args: + chdir: "{{ release_dir }}" + tags: log_failed + +- name: Remove + ansible.builtin.shell: > + rm --recursive --force {{ [release_dir, item]|join('/') }} + args: + warn: false + tags: log_failed + loop: "{{ release_remove }}" + +- name: git > Add all + ansible.builtin.shell: > + git add --force --all + args: + chdir: "{{ release_dir }}" + when: release_add|length == 0 + tags: log_failed + +- name: git > Add + ansible.builtin.shell: > + git add --force {{ item }} + args: + chdir: "{{ release_dir }}" + loop: "{{ release_add }}" + tags: log_failed + +- name: git > Commit + ansible.builtin.shell: | + git {{ + release_author|ternary(release_author|regex_replace(release_email_regex, '-c user.name="\g" -c user.email="\g"'), '') + }} commit --allow-empty --message "{{ + ansible_date_time.year + ~ ansible_date_time.month + ~ ansible_date_time.day + ~ ansible_date_time.hour + ~ ansible_date_time.minute + ~ ansible_date_time.second + }} + Original commit: https://{{ + __release_git_url.stdout|regex_replace(release_git_url_regex, '\g/\g/\g') + }}/commit/{{ __release_git.after }}" + args: + chdir: "{{ release_dir }}" + tags: log_failed + +- name: git > Push "{{ release_ref }}" + ansible.builtin.shell: > + git push --set-upstream origin {{ release_ref }} + && git push origin HEAD + args: + chdir: "{{ release_dir }}" + tags: log_failed diff --git a/.manala/ansible/roles/release/tasks/task/shell.yml b/.manala/ansible/roles/release/tasks/task/shell.yml new file mode 100644 index 0000000..efc1b89 --- /dev/null +++ b/.manala/ansible/roles/release/tasks/task/shell.yml @@ -0,0 +1,11 @@ +--- + +- name: task/shell + block: + + - name: task/shell > "{{ item.options }}" + ansible.builtin.shell: > + {{ item.options }} + args: + chdir: "{{ release_dir }}" + tags: log diff --git a/.manala/ansible/system.yaml b/.manala/ansible/system.yaml new file mode 100644 index 0000000..ba3631d --- /dev/null +++ b/.manala/ansible/system.yaml @@ -0,0 +1,473 @@ +--- + +- hosts: system + + collections: + - manala.roles + + vars: + + ################ + # Alternatives # + ################ + + manala_alternatives_selections: + - selection: editor + path: "{{ manala_vim_bin }}" + + ####### + # Apt # + ####### + + manala_apt: + update: true + + manala_apt_components: + - main + + manala_apt_sources_list_template: apt/sources.list.j2 + + manala_apt_repositories_exclusive: true + manala_apt_repositories: "{{ system_apt_repositories }}" + + manala_apt_preferences_exclusive: true + manala_apt_preferences: + # NodeJS + - preference: "nodejs@{{ + 'nodesource_' ~ system_nodejs_version|string|replace('.', '_') if (system_nodejs) else + 'default' + }}" + state: "{{ 'present' if (system_nodejs) else 'ignore' }}" + # Yarn + - preference: yarn@yarn + state: "{{ 'present' if (system_nodejs_yarn) else 'ignore' }}" + # Php + - preference: php@sury_php + state: "{{ 'present' if (system_php) else 'ignore' }}" + - preference: symfony-cli@symfony + state: "{{ 'present' if (system_php) else 'ignore' }}" + # InfluxDB + - preference: influxdb@influxdata + state: "{{ 'present' if (system_influxdb) else 'ignore' }}" + # Nginx + - preference: nginx@nginx + state: "{{ 'present' if (system_nginx and (ansible_distribution_release not in ['stretch'])) else 'ignore' }}" + # Supervisor + - preference: "supervisor@{{ + 'backports' if (ansible_distribution_release in ['stretch']) else + 'default' + }}" + state: "{{ 'present' if (system_supervisor and (ansible_distribution_release in ['stretch'])) else 'ignore' }}" + # MariaDB + - preference: "mariadb@{{ + 'mariadb_' ~ system_mariadb_version|string|replace('.', '_') if (system_mariadb) else + 'default' + }}" + state: "{{ 'present' if (system_mariadb) else 'ignore' }}" + # Redis + - preference: redis@backports + state: "{{ 'present' if ( + (system_redis_version|string == '5.0') and (ansible_distribution_release in ['stretch']) + or (system_redis_version|string == '6.0') and (ansible_distribution_release in ['buster']) + ) else 'ignore' }}" + # GitHub CLI + - preference: gh@github_cli + state: "{{ 'present' if (system_git) else 'ignore' }}" + - "{{ system_apt_preferences }}" + + manala_apt_holds_exclusive: true + manala_apt_holds: + - "{{ system_apt_holds }}" + + manala_apt_packages: + - xz-utils + - rsync + - wget + - less + - ssl-cert + - bzip2 + - iproute2 + - "{{ ['symfony-cli'] if (system_php) else [] }}" + - "{{ ['gh'] if (system_git) else [] }}" + - "{{ system_apt_packages }}" + + ################ + # Certificates # + ################ + + certificates_name: "{{ system_certificates_name }}" + + ############ + # Composer # + ############ + + manala_composer_version: "{{ system_php_composer_version }}" + + ######## + # Cron # + ######## + + manala_cron_files_defaults: + user: "{{ system_app_user }}" + manala_cron_files: "{{ system_cron_files }}" + + ############### + # Environment # + ############### + + manala_environment_files: + - zsh + + manala_environment_variables: "{{ {}|combine( + system_env, + system_php_composer|ternary( + {'COMPOSER_MEMORY_LIMIT': -1,}, + {} + ) + ) }}" + + ######### + # Files # + ######### + + manala_files_attributes_defaults: + - parents: true + force: true + - path: "^{{ system_app_log_dir }}" + user: "{{ system_app_user }}" + group: "{{ system_app_group }}" + - path: "^{{ system_app_cache_dir }}" + user: "{{ system_app_user }}" + group: "{{ system_app_group }}" + - path: "^{{ system_app_sessions_dir }}" + user: "{{ system_app_user }}" + group: "{{ system_app_group }}" + - path: "^{{ system_app_release_dir }}" + user: "{{ system_app_user }}" + group: "{{ system_app_group }}" + manala_files_attributes: + - path: "{{ system_app_log_dir }}" + state: directory + - path: "{{ system_app_cache_dir }}" + state: directory + - path: "{{ system_app_sessions_dir }}" + state: directory + - path: "{{ system_app_release_dir }}" + state: directory + - path: /usr/share/nginx/html/404.html + template: nginx/html/404.html.j2 + mode: "0644" + - "{{ system_files_attributes }}" + + ####### + # Git # + ####### + + manala_git_config_template: git/gitconfig.j2 + + ############ + # Gomplate # + ############ + + manala_gomplate_version: 3.7.0 + + ############ + # InfluxDB # + ############ + + manala_influxdb_config_template: config/influxdata/influxdb.conf.j2 + manala_influxdb_config: "{{ system_influxdb_config }}" + + manala_influxdb_databases: "{{ system_influxdb_databases }}" + + manala_influxdb_users: "{{ system_influxdb_users }}" + + manala_influxdb_privileges: "{{ system_influxdb_privileges }}" + + ########### + # Locales # + ########### + + manala_locales_codes: "{{ system_locales_codes }}" + + ################### + # MySQL / MariaDB # + ################### + + manala_mysql_install_packages: "{{ + system_mariadb_install_packages + if (system_mariadb) else + system_mysql_install_packages + }}" + + manala_mysql_server: false + + manala_mysql_config: | + [client] + host = 127.0.0.1 + user = root + + ########### + # Network # + ########### + + manala_network_hosts: "{{ system_network_hosts }}" + + ######### + # Nginx # + ######### + + manala_nginx_config_template: nginx/nginx.conf.j2 + + manala_nginx_configs_exclusive: true + manala_nginx_configs: + - template: nginx/default.conf.j2 + - template: nginx/ssl_offloading.conf.j2 + - "{{ system_nginx_configs }}" + + ######### + # Ngrok # + ######### + + manala_ngrok_configs_exclusive: true + manala_ngrok_configs: + - template: ngrok/ngrok.yml.j2 + + ####### + # Npm # + ####### + + manala_npm_packages: "{{ system_nodejs_packages }}" + + ############# + # Oh my zsh # + ############# + + manala_ohmyzsh_custom_themes_exclusive: true + manala_ohmyzsh_custom_themes: + - template: ohmyzsh/theme.zsh-theme.j2 + + manala_ohmyzsh_users: + - user: "{{ system_app_user }}" + group: "{{ system_app_group }}" + template: ohmyzsh/.zshrc.j2 + + ####### + # Php # + ####### + + manala_php_version: "{{ system_php_version }}" + + manala_php_sapis_exclusive: true + manala_php_sapis: "{{ system_php_sapis }}" + + manala_php_fpm_pools_exclusive: true + manala_php_fpm_pools: + - file: app.conf + template: fpm_pools/sury/pools.conf.j2 + config: + app: + user: "{{ system_app_user }}" + group: "{{ system_app_group }}" + listen: /run/php-fpm.app.sock + pm.max_children: 20 + env: "{{ system_env }}" + php_admin_value: + error_log: "{{ system_app_log_dir }}/php.error.log" + + manala_php_extensions_exclusive: true + manala_php_extensions: + - opcache + - readline + - extension: json + state: "{{ 'present' if (manala_php_version and manala_php_version|string is version('8.0', '<')) else 'ignore' }}" + - extension: xdebug + enabled: false + - "{{ system_php_extensions }}" + + manala_php_configs_exclusive: true + manala_php_configs: + - template: php/xdebug.ini.j2 + - "{{ system_php_configs }}" + + ######### + # Redis # + ######### + + manala_redis_server_config_template: config/debian/redis.conf.j2 + manala_redis_server_config: "{{ { + 'bind': '0.0.0.0', + }|combine(system_redis_server_config) }}" + + ####### + # Ssh # + ####### + + manala_ssh_server: false + + manala_ssh_client_config_template: "{{ system_ssh_client_config_template }}" + manala_ssh_client_config: "{{ system_ssh_client_config }}" + + manala_ssh_known_hosts: + - github.com + - host: git.elao.com + file: "{{ playbook_dir ~ '/templates/ssh/keys/git.elao.com' }}" + + ############## + # Supervisor # + ############## + + manala_supervisor_config_template: config/debian/supervisord.conf.j2 + + manala_supervisor_configs_exclusive: true + manala_supervisor_configs_defaults: + template: supervisor/app.conf.j2 + manala_supervisor_configs: + - template: configs/inet_http_server.conf.j2 + config: + port: "*:9001" + - "{{ system_supervisor_configs }}" + + ############ + # Timezone # + ############ + + manala_timezone_default: "{{ system_timezone_default }}" + + ####### + # Vim # + ####### + + manala_vim_config_template: vim/vimrc.local.j2 + + tasks: + + - import_role: + name: zsh + when: system_zsh + tags: [zsh] + + - import_role: + name: environment + when: system_environment + tags: [environment, env] + + - import_role: + name: apt + when: system_apt + tags: [apt] + + - import_role: + name: network + when: system_network + tags: [network] + + - import_role: + name: locales + when: system_locales + tags: [locales] + + - import_role: + name: ssh + when: system_ssh + tags: [ssh] + + - import_role: + name: timezone + when: system_timezone + tags: [timezone] + + - import_role: + name: vim + when: system_vim + tags: [vim] + + - import_role: + name: git + when: system_git + tags: [git] + + - import_role: + name: ohmyzsh + when: system_ohmyzsh + tags: [ohmyzsh] + + - import_role: + name: alternatives + when: system_alternatives + tags: [alternatives] + + - import_role: + name: files + when: system_files + tags: [files] + + - import_role: + name: nodejs + when: system_nodejs + tags: [nodejs, node] + + - import_role: + name: npm + when: system_nodejs_npm + tags: [npm, nodejs, node] + + - import_role: + name: yarn + when: system_nodejs_yarn + tags: [yarn, nodejs, node] + + - import_role: + name: php + when: system_php + tags: [php] + + - import_role: + name: composer + when: system_php_composer + tags: [composer] + + - import_role: + name: certificates + when: system_certificates + tags: [certificates, nginx] + + - import_role: + name: nginx + when: system_nginx + tags: [nginx, certificates] + + - import_role: + name: redis + when: system_redis + tags: [redis] + + - import_role: + name: cron + when: system_cron + tags: [cron] + + - import_role: + name: supervisor + when: system_supervisor + tags: [supervisor] + + - import_role: + name: mysql + when: system_mysql or system_mariadb + tags: [mysql, mariadb] + + - import_role: + name: influxdb + when: system_influxdb + tags: [influxdb] + + - import_role: + name: gomplate + when: system_gomplate + tags: [gomplate] + + - import_role: + name: ngrok + when: system_ngrok + tags: [ngrok] diff --git a/.manala/ansible/templates/apt/sources.list.j2 b/.manala/ansible/templates/apt/sources.list.j2 new file mode 100644 index 0000000..13edd57 --- /dev/null +++ b/.manala/ansible/templates/apt/sources.list.j2 @@ -0,0 +1,3 @@ +deb http://deb.debian.org/debian {{ ansible_distribution_release }} {{ manala_apt_components|flatten|join(' ') }} +deb http://deb.debian.org/debian {{ ansible_distribution_release }}-updates {{ manala_apt_components|flatten|join(' ') }} +deb http://security.debian.org/debian-security {{ ansible_distribution_release }}{{ (ansible_distribution_release in ['stretch', 'buster'])|ternary('/updates', '-security') }} {{ manala_apt_components|flatten|join(' ') }} diff --git a/.manala/ansible/templates/git/gitconfig.j2 b/.manala/ansible/templates/git/gitconfig.j2 new file mode 100644 index 0000000..1f7962e --- /dev/null +++ b/.manala/ansible/templates/git/gitconfig.j2 @@ -0,0 +1,23 @@ +{%- set config = { + 'core': {}, + 'oh-my-zsh': {}, +} | combine(manala_git_config|default({}, true)) -%} + +[core] + ; See: http://git.661346.n2.nabble.com/git-status-takes-30-seconds-on-Windows-7-Why-td7580816.html + {{ config.core | manala.roles.git_config_parameter('preloadindex', default=true) | indent(4) }} + ; See: https://news.ycombinator.com/item?id=11388479 + {{ config.core | manala.roles.git_config_parameter('untrackedCache', default=true) | indent(4) }} + {{- config.core | manala.roles.git_config_section(exclude=[ + 'preloadindex', + 'untrackedCache' + ]) }} + +[oh-my-zsh] + ; See: http://marc-abramowitz.com/archives/2012/04/10/fix-for-oh-my-zsh-git-svn-prompt-slowness/ + {{ config['oh-my-zsh'] | manala.roles.git_config_parameter('hide-status', default=1) | indent(4) }} + {{- config['oh-my-zsh'] | manala.roles.git_config_section(exclude=[ + 'hide-status' + ]) }} + +{{ config | manala.roles.git_config(exclude=['core', 'oh-my-zsh']) }} diff --git a/.manala/ansible/templates/nginx/cors.j2 b/.manala/ansible/templates/nginx/cors.j2 new file mode 100644 index 0000000..0f859d8 --- /dev/null +++ b/.manala/ansible/templates/nginx/cors.j2 @@ -0,0 +1,8 @@ +add_header Access-Control-Allow-Origin "*" always; +add_header Access-Control-Allow-Methods "GET, POST, PUT, PATCH, DELETE, OPTIONS" always; +add_header Access-Control-Allow-Headers "Authorization, Content-Type, Accept-Encoding, Cache-Control" always; +add_header Access-Control-Allow-Credentials "true" always; +add_header Access-Control-Expose-Headers "Content-Disposition" always; +if ($request_method = OPTIONS) { + return 204; +} diff --git a/.manala/ansible/templates/nginx/default.conf.j2 b/.manala/ansible/templates/nginx/default.conf.j2 new file mode 100644 index 0000000..434627a --- /dev/null +++ b/.manala/ansible/templates/nginx/default.conf.j2 @@ -0,0 +1,8 @@ +server { + listen * default_server; + error_page 404 /404.html; + location /404.html { + root /usr/share/nginx/html; + internal; + } +} diff --git a/.manala/ansible/templates/nginx/gzip.j2 b/.manala/ansible/templates/nginx/gzip.j2 new file mode 100644 index 0000000..556b46e --- /dev/null +++ b/.manala/ansible/templates/nginx/gzip.j2 @@ -0,0 +1,7 @@ +gzip off; +gzip_disable msie6; +gzip_vary on; +gzip_proxied expired no-cache no-store private auth; +gzip_comp_level 6; +gzip_min_length 1000; +gzip_types text/css text/javascript text/xml text/plain application/javascript application/x-javascript application/json application/xml application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml; diff --git a/.manala/ansible/templates/nginx/html/404.html.j2 b/.manala/ansible/templates/nginx/html/404.html.j2 new file mode 100644 index 0000000..e843334 --- /dev/null +++ b/.manala/ansible/templates/nginx/html/404.html.j2 @@ -0,0 +1,36 @@ + + + + Error 404 + + + + + + + + + + + +
+

Error 404

+

Oops. We can't find the page you're looking for. Please try again.

+
+ + diff --git a/.manala/ansible/templates/nginx/nginx.conf.j2 b/.manala/ansible/templates/nginx/nginx.conf.j2 new file mode 100644 index 0000000..0c5d2c0 --- /dev/null +++ b/.manala/ansible/templates/nginx/nginx.conf.j2 @@ -0,0 +1,67 @@ +{%- set config = { + 'events': {}, + 'http': {}, +} | combine(manala_nginx_config|default({}, true)) -%} + +user www-data; +{{ config | manala.roles.nginx_config_parameter('worker_processes', default=1) }} + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +{{ config | manala.roles.nginx_config_parameter('load_module', default=[]) }} + +events { + {{ config.events | manala.roles.nginx_config_parameter('worker_connections', default=1024) }} +} + +http { + server_tokens on; + default_type application/octet-stream; + + {{ config.http | manala.roles.nginx_config_parameter('log_format', default='main \'$remote_addr - $remote_user [$time_local] "$request" \' + \'$status $body_bytes_sent "$http_referer" \' + \'"$http_user_agent" "$http_x_forwarded_for"\'') }} + + access_log /var/log/nginx/access.log; + + # See: https://serverfault.com/questions/269420/disable-caching-when-serving-static-files-with-nginx-for-development + sendfile off; + #tcp_nopush on; + + {{ config.http | manala.roles.nginx_config_parameter('keepalive_timeout', default=65) }} + + # See: http://www.nicogiraud.com/blog/nginx-erreur-502-bad-gateway-sur-les-requetes-en-post.html + {{ config.http | manala.roles.nginx_config_parameter('fastcgi_buffer_size', default='128k') }} + {{ config.http | manala.roles.nginx_config_parameter('fastcgi_buffers', default='4 256k') }} + {{ config.http | manala.roles.nginx_config_parameter('fastcgi_busy_buffers_size', default='256k') }} + + # See: http://charles.lescampeurs.org/2008/11/14/fix-nginx-increase-server_names_hash_bucket_size + {{ config.http | manala.roles.nginx_config_parameter('server_names_hash_bucket_size', default=128) }} + + include mime.types; + include /etc/nginx/conf.d/*.conf; + {{- ('\n' ~ config.http | manala.roles.nginx_config(exclude=[ + 'server_tokens', + 'default_type', + 'log_format', + 'access_log', + 'sendfile', + 'tcp_nopush', + 'keepalive_timeout', + 'fastcgi_buffer_size', + 'fastcgi_buffers', + 'fastcgi_busy_buffers_size', + 'server_names_hash_bucket_size', + 'include', + ])).rstrip() | indent(4) }} +} +{{ config | manala.roles.nginx_config(exclude=[ + 'user', + 'worker_processes', + 'error_log', + 'pid', + 'load_module', + 'events', + 'http', +]) }} diff --git a/.manala/ansible/templates/nginx/no_index.j2 b/.manala/ansible/templates/nginx/no_index.j2 new file mode 100644 index 0000000..1d7ddd5 --- /dev/null +++ b/.manala/ansible/templates/nginx/no_index.j2 @@ -0,0 +1 @@ +add_header X-Robots-Tag "noindex"; diff --git a/.manala/ansible/templates/nginx/php_fpm_app.j2 b/.manala/ansible/templates/nginx/php_fpm_app.j2 new file mode 100644 index 0000000..bc9975e --- /dev/null +++ b/.manala/ansible/templates/nginx/php_fpm_app.j2 @@ -0,0 +1,6 @@ +fastcgi_pass unix:/run/php-fpm.app.sock; +fastcgi_split_path_info ^(.+\.php)(/.*)$; +fastcgi_read_timeout 60s; +include fastcgi_params; +fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; +fastcgi_param DOCUMENT_ROOT $realpath_root; diff --git a/.manala/ansible/templates/nginx/ssl_offloading.conf.j2 b/.manala/ansible/templates/nginx/ssl_offloading.conf.j2 new file mode 100644 index 0000000..bc862d1 --- /dev/null +++ b/.manala/ansible/templates/nginx/ssl_offloading.conf.j2 @@ -0,0 +1,25 @@ +# Extract incoming port from HOST header +map $http_host $http_host_port { + default 443; + "~^[^\:]+:(?

\d+)$" $p; +} + +server { + + listen 443 ssl; + server_name _; + + ssl_certificate /etc/ssl/certs/ssl.pem; + ssl_certificate_key /etc/ssl/private/ssl.key; + + location / { + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Port $http_host_port; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_pass http://127.0.0.1; + client_max_body_size 0; + } +} diff --git a/.manala/ansible/templates/ngrok/ngrok.yml.j2 b/.manala/ansible/templates/ngrok/ngrok.yml.j2 new file mode 100644 index 0000000..6480f00 --- /dev/null +++ b/.manala/ansible/templates/ngrok/ngrok.yml.j2 @@ -0,0 +1 @@ +web_addr: 0.0.0.0:4040 diff --git a/.manala/ansible/templates/ohmyzsh/.zshrc.j2 b/.manala/ansible/templates/ohmyzsh/.zshrc.j2 new file mode 100644 index 0000000..ab2151a --- /dev/null +++ b/.manala/ansible/templates/ohmyzsh/.zshrc.j2 @@ -0,0 +1,147 @@ +{%- set config = item.config|default({}) -%} + +# If you come from bash you might have to change your $PATH. +{{ config | manala.roles.zsh_config_parameter('export PATH', comment='# export PATH=$HOME/bin:/usr/local/bin:$PATH') }} + +# Path to your oh-my-zsh installation. +{{ config | manala.roles.zsh_config_parameter('export ZSH', default=manala_ohmyzsh_dir) }} + +# Ensure per-user cache +{{ config | manala.roles.zsh_config_parameter('ZSH_CACHE_DIR', default='$HOME/.oh-my-zsh/cache') }} + +if [[ ! -d $ZSH_CACHE_DIR ]]; then + mkdir -p $ZSH_CACHE_DIR +fi + +# Set name of the theme to load --- if set to "random", it will +# load a random theme each time oh-my-zsh is loaded, in which case, +# to know which specific one was loaded, run: echo $RANDOM_THEME +# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes +{{ config | manala.roles.zsh_config_parameter('ZSH_THEME', default='theme') }} + +# Set list of themes to pick from when loading at random +# Setting this variable when ZSH_THEME=random will cause zsh to load +# a theme from this variable instead of looking in $ZSH/themes/ +# If set to an empty array, this variable will have no effect. +{{ config | manala.roles.zsh_config_parameter('ZSH_THEME_RANDOM_CANDIDATES', comment='# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )') }} + +# Uncomment the following line to use case-sensitive completion. +{{ config | manala.roles.zsh_config_parameter('CASE_SENSITIVE', default=true, comment=true) }} + +# Uncomment the following line to use hyphen-insensitive completion. +# Case-sensitive completion must be off. _ and - will be interchangeable. +{{ config | manala.roles.zsh_config_parameter('HYPHEN_INSENSITIVE', default=true, comment=true) }} + +# Uncomment the following line to disable bi-weekly auto-update checks. +{{ config | manala.roles.zsh_config_parameter('DISABLE_AUTO_UPDATE', default=true, comment=true) }} + +# Uncomment the following line to automatically update without prompting. +{{ config | manala.roles.zsh_config_parameter('DISABLE_UPDATE_PROMPT', default=true, comment=true) }} + +# Uncomment the following line to change how often to auto-update (in days). +{{ config | manala.roles.zsh_config_parameter('export UPDATE_ZSH_DAYS', default=13, comment=true) }} + +# Uncomment the following line if pasting URLs and other text is messed up. +{{ config | manala.roles.zsh_config_parameter('DISABLE_MAGIC_FUNCTIONS', default=true, comment=true) }} + +# Uncomment the following line to disable colors in ls. +{{ config | manala.roles.zsh_config_parameter('DISABLE_LS_COLORS', default=true, comment=true) }} + +# Uncomment the following line to disable auto-setting terminal title. +{{ config | manala.roles.zsh_config_parameter('DISABLE_AUTO_TITLE', default=true, comment=true) }} + +# Uncomment the following line to enable command auto-correction. +{{ config | manala.roles.zsh_config_parameter('ENABLE_CORRECTION', default=true, comment=true) }} + +# Uncomment the following line to display red dots whilst waiting for completion. +# Caution: this setting can cause issues with multiline prompts (zsh 5.7.1 and newer seem to work) +# See https://github.com/ohmyzsh/ohmyzsh/issues/5765 +{{ config | manala.roles.zsh_config_parameter('COMPLETION_WAITING_DOTS', default=true, comment=true) }} + +# Uncomment the following line if you want to disable marking untracked files +# under VCS as dirty. This makes repository status check for large repositories +# much, much faster. +{{ config | manala.roles.zsh_config_parameter('DISABLE_UNTRACKED_FILES_DIRTY', default=true, comment=true) }} + +# Uncomment the following line if you want to change the command execution time +# stamp shown in the history command output. +# You can set one of the optional three formats: +# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" +# or set a custom format using the strftime function format specifications, +# see 'man strftime' for details. +{{ config | manala.roles.zsh_config_parameter('HIST_STAMPS', default='mm/dd/yyyy', comment=true) }} + +# Would you like to use another custom folder than $ZSH/custom? +{{ config | manala.roles.zsh_config_parameter('ZSH_CUSTOM', comment='# ZSH_CUSTOM=/path/to/new-custom-folder') }} + +# Which plugins would you like to load? +# Standard plugins can be found in $ZSH/plugins/ +# Custom plugins may be added to $ZSH_CUSTOM/plugins/ +# Example format: plugins=(rails git textmate ruby lighthouse) +# Add wisely, as too many plugins slow down shell startup. +{{ config | manala.roles.zsh_config_parameter('plugins', default=['git', 'debian', 'common-aliases', 'history', 'history-substring-search']) }} + +source $ZSH/oh-my-zsh.sh + +# User configuration + +{{ config | manala.roles.zsh_config_parameter('export MANPATH', default='/usr/local/man:$MANPATH', comment=true) }} + +# You may need to manually set your language environment +{{ config | manala.roles.zsh_config_parameter('export LANG', comment='# export LANG=en_US.UTF-8') }} + +# Preferred editor for local and remote sessions +# if [[ -n $SSH_CONNECTION ]]; then +# export EDITOR='vim' +# else +# export EDITOR='mvim' +# fi + +# Compilation flags +{{ config | manala.roles.zsh_config_parameter('export ARCHFLAGS', default='-arch x86_64', comment=true) }} + +# Set personal aliases, overriding those provided by oh-my-zsh libs, +# plugins, and themes. Aliases can be placed here, though oh-my-zsh +# users are encouraged to define aliases within the ZSH_CUSTOM folder. +# For a full list of active aliases, run `alias`. +{{ config | manala.roles.zsh_config_parameter('alias', comment='#\n# Example aliases\n# alias zshconfig="mate ~/.zshrc"\n# alias ohmyzsh="mate ~/.oh-my-zsh"') }} + +{{ config | manala.roles.zsh_config(exclude=[ + 'export PATH', + 'export ZSH', + 'ZSH_CACHE_DIR', + 'ZSH_THEME', + 'ZSH_THEME_RANDOM_CANDIDATES', + 'CASE_SENSITIVE', + 'HYPHEN_INSENSITIVE', + 'DISABLE_AUTO_UPDATE', + 'DISABLE_UPDATE_PROMPT', + 'UPDATE ZSH_DAYS', + 'DISABLE_MAGIC_FUNCTIONS', + 'DISABLE_LS_COLORS', + 'DISABLE_AUTO_TITLE', + 'ENABLE_CORRECTION', + 'COMPLETION_WAITING_DOTS', + 'DISABLE_UNTRACKED_FILES_DIRTY', + 'HIST_STAMPS', + 'ZSH_CUSTOM', + 'plugins', + 'export MANPATH', + 'export LANG', + 'export ARCHFLAGS', + 'alias' +]) }} + +echo + +{% include 'functions/ip.j2' %} + +{% if system_php %} +{% include 'functions/php_xdebug.j2' %} +{% endif %} + +{% if system_nginx %} +{% include 'functions/nginx_timeout.j2' %} +{% endif %} + +{% include 'functions/ngrok_http.j2' %} diff --git a/.manala/ansible/templates/ohmyzsh/functions/ip.j2 b/.manala/ansible/templates/ohmyzsh/functions/ip.j2 new file mode 100644 index 0000000..b2ce589 --- /dev/null +++ b/.manala/ansible/templates/ohmyzsh/functions/ip.j2 @@ -0,0 +1,7 @@ +manala_ip () { + wget http://ipecho.net/plain -O - -q ; echo +} + +echo -e " \e[36m‣\e[0m \e[36mSHOW PUBLIC IP\e[0m + manala_ip +" diff --git a/.manala/ansible/templates/ohmyzsh/functions/nginx_timeout.j2 b/.manala/ansible/templates/ohmyzsh/functions/nginx_timeout.j2 new file mode 100644 index 0000000..846fd45 --- /dev/null +++ b/.manala/ansible/templates/ohmyzsh/functions/nginx_timeout.j2 @@ -0,0 +1,9 @@ +manala_nginx_timeout () { + if [[ $1 == off ]]; then sudo sed -ri 's/fastcgi_read_timeout (.*);$/fastcgi_read_timeout 999s;#origin\1/' /etc/nginx/conf.d/php_fpm_app + else sudo sed -ri 's/^fastcgi_read_timeout 999s;#origin(.*)/fastcgi_read_timeout \1;/' /etc/nginx/conf.d/php_fpm_app; fi + sudo /etc/init.d/nginx restart +} + +echo -e " \e[36m‣\e[0m \e[36mENABLE/DISABLE NGINX TIMEOUT\e[0m + manala_nginx_timeout [on|off] +" diff --git a/.manala/ansible/templates/ohmyzsh/functions/ngrok_http.j2 b/.manala/ansible/templates/ohmyzsh/functions/ngrok_http.j2 new file mode 100644 index 0000000..e9c794c --- /dev/null +++ b/.manala/ansible/templates/ohmyzsh/functions/ngrok_http.j2 @@ -0,0 +1,7 @@ +manala_ngrok_http () { + ngrok http -config=/etc/ngrok/config.yml 80 +} + +echo -e " \e[36m‣\e[0m \e[36mSTART NGROK HTTP\e[0m + manala_ngrok_http +" diff --git a/.manala/ansible/templates/ohmyzsh/functions/php_xdebug.j2 b/.manala/ansible/templates/ohmyzsh/functions/php_xdebug.j2 new file mode 100644 index 0000000..d3d7431 --- /dev/null +++ b/.manala/ansible/templates/ohmyzsh/functions/php_xdebug.j2 @@ -0,0 +1,31 @@ +manala_php_xdebug () { + if [[ $1 == on ]]; then + if [ -f /usr/sbin/php5enmod ]; then + sudo php5enmod xdebug; + sudo service php5-fpm restart; + else + PHP_VERSION=`php -v | head -n 1 | cut -d ' ' -f 2 | cut -c 1-3` + sudo phpenmod -v ${PHP_VERSION} -s ALL xdebug; + sudo service php${PHP_VERSION}-fpm restart; + fi + elif [[ $1 == off ]]; then + if [ -f /usr/sbin/php5dismod ]; then + sudo php5dismod xdebug; + sudo service php5-fpm restart; + else + PHP_VERSION=`php -v | head -n 1 | cut -d ' ' -f 2 | cut -c 1-3` + sudo phpdismod -v ${PHP_VERSION} -s ALL xdebug; + sudo service php${PHP_VERSION}-fpm restart; + fi + else + if [[ $(/usr/bin/php -v 2>/dev/null) != *Xdebug* ]]; then + echo off + else + echo on + fi + fi +} + +echo -e " \e[36m‣\e[0m \e[36mENABLE/DISABLE PHP XDEBUG\e[0m + manala_php_xdebug [on|off] +" diff --git a/.manala/ansible/templates/ohmyzsh/theme.zsh-theme.j2 b/.manala/ansible/templates/ohmyzsh/theme.zsh-theme.j2 new file mode 100644 index 0000000..8b3f7c8 --- /dev/null +++ b/.manala/ansible/templates/ohmyzsh/theme.zsh-theme.j2 @@ -0,0 +1,36 @@ +{%- set config = item.config|default({}, true) -%} + +# Inspired by Pygmalion: https://github.com/ohmyzsh/ohmyzsh/blob/master/themes/pygmalion.zsh-theme + +prompt_setup_theme(){ + setopt localoptions extendedglob + + ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[green]%}" + ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} " + ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[yellow]%}⚡%{$reset_color%}" + ZSH_THEME_GIT_PROMPT_CLEAN="" + + FULL_HOSTNAME=`hostname -f` + + base_prompt='%{$fg[magenta]%}%n%{$reset_color%}%{$fg[cyan]%}@%{$reset_color%}%{$fg[yellow]%}$FULL_HOSTNAME%{$reset_color%}%{$fg[red]%}:%{$reset_color%}%{$fg[cyan]%}%0~%{$reset_color%}%{$fg[red]%}|%{$reset_color%}' + post_prompt='%{$fg[cyan]%}⇒%{$reset_color%} ' + + base_prompt_nocolor=${base_prompt//\%\{[^\}]##\}} + post_prompt_nocolor=${post_prompt//\%\{[^\}]##\}} + + autoload -U add-zsh-hook + add-zsh-hook precmd prompt_theme_precmd +} + +prompt_theme_precmd(){ + setopt localoptions nopromptsubst extendedglob + + local gitinfo=$(git_prompt_info) + local gitinfo_nocolor=${gitinfo//\%\{[^\}]##\}} + local exp_nocolor="$(print -P \"${base_prompt_nocolor}${gitinfo_nocolor}${post_prompt_nocolor}\")" + local prompt_length={% raw %}${#exp_nocolor}{% endraw %} + + PROMPT="%{$bg[green]%}%{$fg[black]%}❱Dev❰%{$reset_color%} ${base_prompt}\$(git_prompt_info)${post_prompt}" +} + +prompt_setup_theme diff --git a/.manala/ansible/templates/php/5.6/app.ini.j2 b/.manala/ansible/templates/php/5.6/app.ini.j2 new file mode 100644 index 0000000..3e21523 --- /dev/null +++ b/.manala/ansible/templates/php/5.6/app.ini.j2 @@ -0,0 +1,37 @@ +{%- set config = item.config|default({}) -%} + +{# Upstream - [PHP] - Error handling and logging #} +{{ config | manala.roles.php_config_parameter('error_reporting', default='E_ALL') }} +{{ config | manala.roles.php_config_parameter('display_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('display_startup_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('track_errors', default=True) }} + +{# [PHP] - Miscellaneous #} +{{ config | manala.roles.php_config_parameter('expose_php', default=True) }} + +{# [PHP] - Resource Limits #} +{{ config | manala.roles.php_config_parameter('memory_limit', default='512M') }} + +{# [PHP] - Error handling and logging #} +{{ config | manala.roles.php_config_parameter('error_log', default='/var/log/php' ~ manala_php_version|string ~ '/error.log') }} + +{# Enable apc on cli as soon as apcu/apcu-bc extension is installed #} +{{ config | manala.roles.php_config_parameter('apc.enable_cli', default=True) }} + +{# [PHP] - Language Options - Dev #} +{# See: http://stackoverflow.com/questions/12905404/symfony2-slow-initialization-time #} +{{ config | manala.roles.php_config_parameter('realpath_cache_size', default='4096k') }} +{{ config | manala.roles.php_config_parameter('realpath_cache_ttl', default=7200) }} + +{{ config | manala.roles.php_config(exclude=[ + 'error_reporting', + 'display_errors', + 'display_startup_errors', + 'track_errors', + 'expose_php', + 'memory_limit', + 'error_log', + 'apc.enable_cli', + 'realpath_cache_size', + 'realpath_cache_ttl', +]) -}} diff --git a/.manala/ansible/templates/php/7.0/app.ini.j2 b/.manala/ansible/templates/php/7.0/app.ini.j2 new file mode 100644 index 0000000..917d670 --- /dev/null +++ b/.manala/ansible/templates/php/7.0/app.ini.j2 @@ -0,0 +1,65 @@ +{%- set config = item.config|default({}) -%} + +{{ config | manala.roles.php_config_parameter('display_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('display_startup_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('error_reporting', default='E_ALL') }} +{{ config | manala.roles.php_config_parameter('html_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('log_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('max_input_time', default=60) }} +{{ config | manala.roles.php_config_parameter('output_buffering', default=4096) }} +{{ config | manala.roles.php_config_parameter('register_argc_argv', default=False) }} +{{ config | manala.roles.php_config_parameter('request_order', default='GP') }} +{{ config | manala.roles.php_config_parameter('short_open_tag', default=False) }} +{{ config | manala.roles.php_config_parameter('track_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('variables_order', default='GPCS') }} +{{ config | manala.roles.php_config_parameter('expose_php', default=True) }} +{{ config | manala.roles.php_config_parameter('memory_limit', default='512M') }} +{{ config | manala.roles.php_config_parameter('session.gc_divisor', default=1000) }} +{{ config | manala.roles.php_config_parameter('session.hash_bits_per_character', default=5) }} +{{ config | manala.roles.php_config_parameter('url_rewriter.tags', default='\'a=href,area=href,frame=src,input=src,form=fakeentry\'') }} + +{# Error log #} +{{ config | manala.roles.php_config_parameter('error_log', default='/var/log/php' ~ manala_php_version|string ~ '/error.log') }} + +{# Enable apc in cli as soon as apcu/apcu-bc extension is installed #} +{{ config | manala.roles.php_config_parameter('apc.enable_cli', default=True) }} + +; Switch whether to compile assertions at all (to have no overhead at run-time) +; -1: Do not compile at all +; 0: Jump over assertion at run-time +; 1: Execute assertions +; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) +; Default Value: 1 +; Development Value: 1 +; Production Value: -1 +; http://php.net/zend.assertions +{{ config | manala.roles.php_config_parameter('zend.assertions', default=1) }} + +{# See: http://stackoverflow.com/questions/12905404/symfony2-slow-initialization-time #} +{{ config | manala.roles.php_config_parameter('realpath_cache_size', default='4096k') }} +{{ config | manala.roles.php_config_parameter('realpath_cache_ttl', default=7200) }} + +{{ config | manala.roles.php_config(exclude=[ + 'display_errors', + 'display_startup_errors', + 'error_reporting', + 'html_errors', + 'log_errors', + 'max_input_time', + 'output_buffering', + 'register_argc_argv', + 'request_order', + 'short_open_tag', + 'track_errors', + 'variables_order', + 'expose_php', + 'memory_limit', + 'session.gc_divisor', + 'session.hash_bits_per_character', + 'url_rewriter.tags', + 'error_log', + 'apc.enable_cli', + 'zend.assertions', + 'realpath_cache_size', + 'realpath_cache_ttl', +]) -}} diff --git a/.manala/ansible/templates/php/7.1/app.ini.j2 b/.manala/ansible/templates/php/7.1/app.ini.j2 new file mode 100644 index 0000000..78177a9 --- /dev/null +++ b/.manala/ansible/templates/php/7.1/app.ini.j2 @@ -0,0 +1,41 @@ +{%- set config = item.config|default({}) -%} + +{# Upstream - [PHP] - Error handling and logging #} +{{ config | manala.roles.php_config_parameter('error_reporting', default='E_ALL') }} +{{ config | manala.roles.php_config_parameter('display_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('display_startup_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('track_errors', default=True) }} + +{# Upstream - [Assertion] #} +{{ config | manala.roles.php_config_parameter('zend.assertions', default=1) }} + +{# [PHP] - Miscellaneous #} +{{ config | manala.roles.php_config_parameter('expose_php', default=True) }} + +{# [PHP] - Resource Limits #} +{{ config | manala.roles.php_config_parameter('memory_limit', default='512M') }} + +{# [PHP] - Error handling and logging #} +{{ config | manala.roles.php_config_parameter('error_log', default='/var/log/php' ~ manala_php_version|string ~ '/error.log') }} + +{# Enable apc in cli as soon as apcu/apcu-bc extension is installed #} +{{ config | manala.roles.php_config_parameter('apc.enable_cli', default=True) }} + +{# [PHP] - Language Options - Dev #} +{# See: http://stackoverflow.com/questions/12905404/symfony2-slow-initialization-time #} +{{ config | manala.roles.php_config_parameter('realpath_cache_size', default='4096k') }} +{{ config | manala.roles.php_config_parameter('realpath_cache_ttl', default=7200) }} + +{{ config | manala.roles.php_config(exclude=[ + 'error_reporting', + 'display_errors', + 'display_startup_errors', + 'track_errors', + 'zend.assertions', + 'expose_php', + 'memory_limit', + 'error_log', + 'apc.enable_cli', + 'realpath_cache_size', + 'realpath_cache_ttl', +]) -}} diff --git a/.manala/ansible/templates/php/app.ini.j2 b/.manala/ansible/templates/php/app.ini.j2 new file mode 100644 index 0000000..36c1ddc --- /dev/null +++ b/.manala/ansible/templates/php/app.ini.j2 @@ -0,0 +1,49 @@ +{%- if manala_php_version is version('5.6', '=') %} + {%- include'5.6/app.ini.j2' %} +{%- elif manala_php_version is version('7.0', '=') %} + {%- include'7.0/app.ini.j2' %} +{%- elif manala_php_version is version('7.1', '=') %} + {%- include'7.1/app.ini.j2' %} +{%- else %} + +{%- set config = item.config|default({}) -%} + +{# Upstream - [PHP] - Error handling and logging #} +{{ config | manala.roles.php_config_parameter('error_reporting', default='E_ALL') }} +{{ config | manala.roles.php_config_parameter('display_errors', default=True) }} +{{ config | manala.roles.php_config_parameter('display_startup_errors', default=True) }} + +{# Upstream - [Assertion] #} +{{ config | manala.roles.php_config_parameter('zend.assertions', default=1) }} + +{# [PHP] - Miscellaneous #} +{{ config | manala.roles.php_config_parameter('expose_php', default=True) }} + +{# [PHP] - Resource Limits #} +{{ config | manala.roles.php_config_parameter('memory_limit', default='512M') }} + +{# [PHP] - Error handling and logging #} +{{ config | manala.roles.php_config_parameter('error_log', default='/var/log/php' ~ manala_php_version|string ~ '/error.log') }} + +{# Enable apc in cli as soon as apcu/apcu-bc extension is installed #} +{{ config | manala.roles.php_config_parameter('apc.enable_cli', default=True) }} + +{# [PHP] - Language Options - Dev #} +{# See: http://stackoverflow.com/questions/12905404/symfony2-slow-initialization-time #} +{{ config | manala.roles.php_config_parameter('realpath_cache_size', default='4096k') }} +{{ config | manala.roles.php_config_parameter('realpath_cache_ttl', default=7200) }} + +{{ config | manala.roles.php_config(exclude=[ + 'error_reporting', + 'display_errors', + 'display_startup_errors', + 'zend.assertions', + 'expose_php', + 'memory_limit', + 'error_log', + 'apc.enable_cli', + 'realpath_cache_size', + 'realpath_cache_ttl', +]) }} + +{%- endif %} diff --git a/.manala/ansible/templates/php/opcache.ini.j2 b/.manala/ansible/templates/php/opcache.ini.j2 new file mode 100644 index 0000000..7369b36 --- /dev/null +++ b/.manala/ansible/templates/php/opcache.ini.j2 @@ -0,0 +1,15 @@ +{%- set config = item.config|default({}) -%} + +{{ config | manala.roles.php_config_parameter('opcache.memory_consumption', default=128) }} +{{ config | manala.roles.php_config_parameter('opcache.interned_strings_buffer', default=8) }} +{{ config | manala.roles.php_config_parameter('opcache.max_accelerated_files', default=4000) }} +{{ config | manala.roles.php_config_parameter('opcache.revalidate_freq', default=2) }} +{{ config | manala.roles.php_config_parameter('opcache.fast_shutdown', default=1) }} + +{{ config | manala.roles.php_config(exclude=[ + 'opcache.memory_consumption', + 'opcache.interned_strings_buffer', + 'opcache.max_accelerated_files', + 'opcache.revalidate_freq', + 'opcache.fast_shutdown', +]) -}} diff --git a/.manala/ansible/templates/php/xdebug.ini.j2 b/.manala/ansible/templates/php/xdebug.ini.j2 new file mode 100644 index 0000000..fe828ff --- /dev/null +++ b/.manala/ansible/templates/php/xdebug.ini.j2 @@ -0,0 +1,29 @@ +{%- set config = item.config|default({}) -%} + +{%- set host = ansible_env.MANALA_HOST | default('linux') -%} +{% if host == 'linux' %} +# Linux +xdebug.discover_client_host = 1 +{% elif host == 'darwin' %} +# MacOS +xdebug.client_host = host.docker.internal +{% elif host == 'windows' %} +# Windows +xdebug.client_host = host.docker.internal +{% endif %} + +{{ config | manala.roles.php_config_parameter('xdebug.mode', default='develop,debug,coverage') }} +{{ config | manala.roles.php_config_parameter('xdebug.max_nesting_level', default=300) }} +{{ config | manala.roles.php_config_parameter('xdebug.var_display_max_children', default=128) }} +{{ config | manala.roles.php_config_parameter('xdebug.var_display_max_data', default=512) }} +{{ config | manala.roles.php_config_parameter('xdebug.var_display_max_depth', default=4) }} +{{ config | manala.roles.php_config_parameter('xdebug.cli_color', default=1) }} + +{{ config | manala.roles.php_config(exclude=[ + 'xdebug.mode', + 'xdebug.max_nesting_level', + 'xdebug.var_display_max_children', + 'xdebug.var_display_max_data', + 'xdebug.var_display_max_depth', + 'xdebug.cli_color', +]) }} diff --git a/.manala/ansible/templates/ssh/development/ssh_config.j2 b/.manala/ansible/templates/ssh/development/ssh_config.j2 new file mode 100644 index 0000000..0e65a47 --- /dev/null +++ b/.manala/ansible/templates/ssh/development/ssh_config.j2 @@ -0,0 +1,9 @@ +{%- set config = manala_ssh_client_config|default('', True) -%} + +Host * + HashKnownHosts yes + GSSAPIAuthentication yes + GSSAPIDelegateCredentials no + StrictHostKeyChecking no + +{{ config }} diff --git a/.manala/ansible/templates/ssh/integration/ssh_config.j2 b/.manala/ansible/templates/ssh/integration/ssh_config.j2 new file mode 100644 index 0000000..390191b --- /dev/null +++ b/.manala/ansible/templates/ssh/integration/ssh_config.j2 @@ -0,0 +1,11 @@ +{%- set config = manala_ssh_client_config|default('', True) -%} + +Host * + HashKnownHosts no + GSSAPIAuthentication yes + GSSAPIDelegateCredentials no + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR + +{{ config }} diff --git a/.manala/ansible/templates/ssh/keys/git.elao.com b/.manala/ansible/templates/ssh/keys/git.elao.com new file mode 100644 index 0000000..0c2b554 --- /dev/null +++ b/.manala/ansible/templates/ssh/keys/git.elao.com @@ -0,0 +1 @@ +git.elao.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCT21UxvHdQ3VLGoPDFYt9BFwKOaNpxEWjh913y+UtbOWrobSAdAth6wMiA9yNC3xmctAo8ctfYSZ7Nt9VFxTlpXNpdYeMmQnyjgiN/yzYdMzKFWJCMh35O1HbhBeTpnkcxbQiyVdrg+9nK4ACqlgzRlEoaQciW7NShqz04UnfIEDN8AgekY8HGBa7TpgaZDxjhZznrWSAT0C/S7+tYrnvS9kMuHo03LWA7B95Vwev/sQrjQNmdIykbjKpP1ljs7b5UkGSynWMWbO45sLzLrvlFjNztevzF2vRF1muMb7A3nk9NU7jkRZ+1BIsL5/cK4SjrQCINxxaAT8sOYzUYou21 diff --git a/.manala/ansible/templates/supervisor/app.conf.j2 b/.manala/ansible/templates/supervisor/app.conf.j2 new file mode 100644 index 0000000..18fd15e --- /dev/null +++ b/.manala/ansible/templates/supervisor/app.conf.j2 @@ -0,0 +1,40 @@ +{%- set config = item.config|default('') -%} + +{%- if config -%} + +{{ config }} + +{%- else -%} + +{%- set groups = item.groups|default({}) -%} + +{% for group, parameters in groups|dictsort %} +[group:{{ group }}] +{{- parameters | manala.roles.supervisor_config_section() }} + +{% endfor %} + +{%- set programs = item.programs|default({}) -%} + +{% for program, parameters in programs|dictsort %} +[program:{{ program }}] +{{ parameters | manala.roles.supervisor_config_parameter('autorestart', default=True) }} +{{ parameters | manala.roles.supervisor_config_parameter('autostart', default=False) }} +{{ parameters | manala.roles.supervisor_config_parameter('redirect_stderr', default=True) }} +{{ parameters | manala.roles.supervisor_config_parameter('startretries', default=20) }} +{{ parameters | manala.roles.supervisor_config_parameter('stderr_logfile_maxbytes', default=0) }} +{{ parameters | manala.roles.supervisor_config_parameter('stdout_logfile_maxbytes', default=0) }} +{{ parameters | manala.roles.supervisor_config_parameter('user', default=system_app_user) }} +{{- parameters | manala.roles.supervisor_config_section(exclude=[ + 'autorestart', + 'autostart', + 'redirect_stderr', + 'startretries', + 'stderr_logfile_maxbytes', + 'stdout_logfile_maxbytes', + 'user', +]) }} + +{% endfor %} + +{%- endif -%} diff --git a/.manala/ansible/templates/vim/vimrc.local.j2 b/.manala/ansible/templates/vim/vimrc.local.j2 new file mode 100644 index 0000000..d29cb39 --- /dev/null +++ b/.manala/ansible/templates/vim/vimrc.local.j2 @@ -0,0 +1,17 @@ +{%- set config = manala_vim_config|default({}, true) -%} + +syntax on + +{{ config | manala.roles.vim_config_parameter('encoding', default='utf8') }} +{{ config | manala.roles.vim_config_parameter('expandtab', default=True) }} +{{ config | manala.roles.vim_config_parameter('smarttab', default=True) }} +{{ config | manala.roles.vim_config_parameter('shiftwidth', default=4) }} +{{ config | manala.roles.vim_config_parameter('tabstop', default=4) }} + +{{ config | manala.roles.vim_config(exclude=[ + 'encoding', + 'expandtab', + 'smarttab', + 'shiftwidth', + 'tabstop' +]) }} diff --git a/.manala/certificates/ca.crt b/.manala/certificates/ca.crt new file mode 100644 index 0000000..383c1da --- /dev/null +++ b/.manala/certificates/ca.crt @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE6DCCAtACCQDyl2RWgrfvXjANBgkqhkiG9w0BAQsFADA2MQ0wCwYDVQQKDARF +bGFvMSUwIwYDVQQDDBxFbGFvIERldmVsb3BtZW50IE9ubHkgLSAyMDIxMB4XDTIx +MDYyMzA3MjEyMVoXDTIzMDkyNjA3MjEyMVowNjENMAsGA1UECgwERWxhbzElMCMG +A1UEAwwcRWxhbyBEZXZlbG9wbWVudCBPbmx5IC0gMjAyMTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAKcrvyChJ0MWvYMGrfIeE1CYLNATIApLJAxCyroW +sE77gi2swuyMPmijrSCdEkjZ+xtZFBCsuC+MfXrzApdJHEiTQFVOrewcvn2iPnPa +qMCeXOCaaoPl8KLxlwo5s4U77Y7izNSpq3tPrxtSZIZYLiQCTI6g/g0G62mk+4tr +if6oLSbo/GssCdUaXZCwiz8BnAPnaXnT0lO7iIHtehkeCfDinLA6MvSw9+dTSVl3 +mRTsfQt+X+RNfnMBI0NvB9Ju4cbvmwJCNKsb0K2RYFKtYWWfwOYLirZ8aGpGO/Lw +tOuvVlMyHwtrojuGt55/ULZoj+Fb00gGkGyk1XyJSNlzi1jE8gxL7ABm2K68BxVH +dAE4DM4JvSwFgXv/Wmv17N7SAhILHktOYBLOlfLt9Sdr+3eiJndLX3UtYPllrFRB +RH2s0MYKn79QWdkMx2bFKtAOQDpO3WH5+xG3gSH7Ojoyf+b2whUpDhjGfMTVZwms +qe+A084gvTJc10T5GcvaBU7RXqo7+AiiLnWN5QjthBts3ydlEdHGb2+xZG5mKh6G +EAtwWKmR88rggqHKCMI98cTXtZRWuo0GitJS9oAd0FQr0w8g3eQzWArags1YrTGq +W0it/yCaI4nfpBo7i1NRQzuNPZb2Fyxgy5jqF2dFDI7HS5qkKfbT4SAGWABGlpOT +4LNzAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAJc1TCdDbBMG/SyqypH2wKbu/+/U +qKuw+jYzKlan4bKk7CcEGBQELjpTSibPSAKn5Q/3IgX4DX4uBzKQuwfjBMLF0yGS +HKaX+aBjD3y7ugQaKJMHE01q1STNDhJGCJAnju8mzPI1R8UXsCnf3sJWzNQA186W +AVyOOFAZuulNbqwimnJmraQxuhwdcTX02va7Z2M2Ettlfg3phEa9cKhkdktDrW5o +yJEhqtJQb1rh3BCQK6lrLQlCq1p/1czx4FaxDs05QzCU0kz92G1+HOrLZ8dqI9vZ +NvcP9ETiDrtL17Azg4jhiXDd/C9gWaB6iGuyNMmI6I1pBez+hBaEGijoTYRFa+1y +ctk/kqApti5zfSyp169PzyqUqqUuDystcmWLvgm2ldFruSFXxmKlOHALwFmMicjl +0k7jkcCg94RYlI/zyIYOmWdVyNCbj5Y6+zJu3tXRMKTpnfyQl0Fpu8uwl46uzMjP +UY0HxADr4KQwWtRFJWFS7e0uyoGSAnxlHMmuigbZKoynRRE8XHdOYTQvrCNOmvap +GJZc5EAkkmDBnf3sQJTGHC50b5+EWA6QLsqXCK8DSUY8jEgbgp3x8ntFgjds3RtN +FKLZNMqM1GZps3FN8rF2I62bbcOrd9sr+1m46hbYPhT0nvfpexAbloJFM76q48+l +YnUFLkP235xp77jj +-----END CERTIFICATE----- diff --git a/.manala/certificates/ca.key b/.manala/certificates/ca.key new file mode 100644 index 0000000..f2f49c1 --- /dev/null +++ b/.manala/certificates/ca.key @@ -0,0 +1,54 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIJnzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIo5JdOGAMOhACAggA +MB0GCWCGSAFlAwQBKgQQRN/loFLkUi3ex30DWxJE/QSCCVBCdRqjHlgHWJN0cIJe +MtSGOYwhWPxZJKAERf/Dh9v3p/iXatTSxTShwRSNwz0Xd0QUEwfqg1U+E+lceBIq +8/3u1quGEiMZm7hATz6nk/OCPyckJCjH4aOwhPILRcAehXv2pPegG1wxhVLRNAem +rl7GjlMl5JIap8Yz3hod+hXaRcENO/61j4g4UYUsrAIYk2ODuYrXImIKEtGvYMg6 +WWfiAMU73PPcSqH1P0XHan5otAreKdGHxT8ai6zdIXwUklGs3sn1HT+7fAcpQzU/ +CX7pEAVktAUchslwdut4C9pwh1JXD+YZvJwdQnliqPo4tpgyC6kjuikvr/IElUha +IbCPZJ3gZ9FJcVEJv51JbXzFgMdV6dLoIbzDI+B2+HtSbYg7MFdNhZ+BQdX77cqZ +aOwfzpUA/czWU8bqn2Jkwh3hj9XXZTrsmtMNIK1PY3b55pDm9O71195QAbKqd3Wl +BVvgxPhcQhxtitgY7+fZFi6uIk3pDIP4rWaK9SnMrU0wW4aT97Hc+qgaZfKV7Mab +vFHy2bu5QxZRg70mERtVijvH0X63D6EsHwCmESeEuIlLOL49y+hGQ3NmyQywtLIa +Pb7WzeRVvKPQcnUnJnpCeVlzM3oyNXApWNJDJgLVVCiiyKTOoCryRyV+zkTFKmeL +nK9SlxWmoWoqDK5Z4/UNn2peRQtxhGplHTNHbcYOTKuLOvWAqc32BM089t6oUxi8 +uAoHke2Iq7GxFJneLh5kenJZAlwVfw0EcauGyGqBzcoNHtJ8Nt28XEN7cCAtJ9Mz +4PYbjfL0aFBbfWEBq510Q5PEL2qt+DTkTh6/Np4ItQczFnMrmw7LV0eR08nyVkwv +sVH8eAUgjVin+H7KZmd296dcBKSmADZE6IReoxERD5P4SmqBPnHguy1obU6GkwDK +mhVezDHaBGfdzIzBZYoiNjGnYW/iev/MSWNLXuwvp1pZKyjaf/Xo6qSFUXYfys+6 +wmqJ7mPUVsEnNfMPKl5m2EheB7pZWAI6k+XvpPkZHxz3dXo7yQPt9N9cnmZdg0HS +RO776Au8Z84WitfDptlHUtrlg4hTMDnK9pLaqhY06eWQLTX2X2U90HmcV9tClvDg +SA8+8q0aJhjcXjAnstN85zn7PJFgtYTPO5/axPIC/MgAl9hE1OclQJaIbGJ2akuc +4izSwRs1woJTpAXpGfzoMCDoCmv3CbGvWOT7oMcUJSdvO7P+FOfWybcdycCWte1c +jDqUeRuws/6mES7fI0c5pMdvcGZThZMGgsPPRQoCzXURMRvfF+4/i7Dk9f6QN0qM +kcwnN/3+KHwt09GKLpT4dF2jcdar7PMIWjPsLraCObROlasmI/aKVCI928EpXTUK +CYS/UoWfv1CYRbGxEQV79+1uZa5HKdF3brD60f9htD5ANBawmFzz+HkiTCUe5YuE +N3Ey1z6624flkUG/WMaKAT7ZhijeAphBlm3WU9NRwWtMs997NipnfWTcAhF3ucif +ZT4Ce1cMy8DUTgSUi5fpBcrhRGnsEsLhDAn/bIUibLxNzB7WtPA4XBxTwvD/kUCF +ITUn6rQyArQq8g0WDA8r32Ho8/oId+ZNMx+ZZu1o7zw5EmW/E20gqSId9w0pSx6w +7+wX76+FSSOeJ2sxZ1Ap6r2EBZW7OSAWA+a3l1C0ToFB89PEHUjC8eRTuOksC/rH +QNhFQVqqEd49kT59tI3c+/RLYAbuzcZQvlNzIKFe0POErtZZxthHv9tEzfbkG8Y5 +X40Z9wCCwUmTmIfIA2gTUJGvbCNbotZoPBsjd6w0Fz2CTeRIXyaHNrC8TwqTnyMt +DDRPOOqxbTOz5Ukoy58mS7KIu8rKpmkgTUrTSyFTv5iUpYj1EvAzUgVUlwH0CKqq +/VLsXh/aB9QOR5dBm/b0v+rVR42sMQBsn+t65Y0yFHqbUvFtK88BSB4aAJSedVDe +5/ZwsG1Ib1xthgoTmVMuAX70OcuUDNrLVFBoGA384Bzgf77yuqvho7GPmpDuZWV+ +xI9jbZDTjq/bHxEqjHn9iYt57TSYF9gOJtwrCmcOE3x8jWF9iF871h5eXJ8Yx5Zd +Teo6VVkDikrUqEHuzZCUH4zmGBNm/shb4SZKF9r6gkSEjv2eevPB/p5Jl7GK66ZP +COeegWncHimseciLkoY9D0e7pw/FMp3ygBuCN2mr9hr2MB4qLHeBAUKXUm5VvTUb +bNzr10T1peuykZhEl6s62X5dQz87vjg/mZwO0W1la7dJgQCbWP8U7giGe3EZjGhW +UhRhFvXwttbdslEZqFGq0RniWjk5CqAVTiKqYfmXf0G1XnyDFI+m9BcEQ6T0cfn4 +zauGv0lV9Oo/Qa/k/oVxaPMfnB/HWL0Z+HK9C9jHrf+eJWbCVgtwqvyMcYEskx5l +NFtFJo9zwQjGxi0aGkyCP9hOsz17ptvdWQYwN0s89CxjFlT+Gsrgn1tXXbrspnCN +FCzwiMhWJMRH+Vdcr/lKOTjpzF8QX1X8NfWW1hpfChIMHjXJ3P0ALwto7PoMhW3l +fDc8RL2Zaj1LxSnzFbQ2VE3OFntQ5vn/KzpI3PucqWah6ry14hV0bnucs54/zqF5 +LjHeECkfmPkqjHSMJUVRwQfPX0hTszgnIL8eyc2zBpA9pXAxaQX0ySLlEKqvFao9 +EWPadBzFFiO2XZ8dmuI5rq9kppMTc2HjHLfKWg7+8S574YWZ49/JrqOo0W0QMx4S +rQhBiJHGC2iTxa3GLFKii3eF/HwRWEH3RtyS7tW2Wv4ip4luooKu+S4JxgJTNwX+ +vlJnMWGZPiSbq8OYAYHStvW8y4i1fg3jCtr3q0PwbQi7BXheozIx37tsQcgbblZi +d2JtZiwaZbqK8PdS8F5loNYG/DiJWrkEnSJKesHx7qIiCUbvX57RGplaeafJrj7i +bGu6q0kQUN0/Puyl/7p3ZR1wiVfgP0t5Zm7Yk5jDR7iwzp5M4E09LIybB8Io2xXg +aM5g1DzEWnsdg4pQwf8z104npEEh/WwEq3sMCL7pRpTiq79a0VhH3HxmYbRVaMm/ +c1FkOiPxcAFZwxLo9VV3yIz+e1zd+Plb2fxi2n8Sd8szJjTizQWY9L+Y1QUdV5LO +Mm29tsH5ahPIKXyEBNa7mtHsFU2+JdvSTPJC82lqiL8aLHknqFhFUEMXPCuQLvpJ +6TYZa5g1tQMM3rxgzcpXjqS8jg== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/.manala/docker/Dockerfile b/.manala/docker/Dockerfile new file mode 100644 index 0000000..227a008 --- /dev/null +++ b/.manala/docker/Dockerfile @@ -0,0 +1,227 @@ +# Init system (none|sysv|openrc|systemd) +ARG MANALA_INIT=none +# Provision system (none|ansible) +ARG MANALA_PROVISION=none + +########## +# System # +########## + +FROM debian:10-slim AS system + +LABEL maintainer="Elao " + +ARG MANALA_HOST=linux +ARG MANALA_USER_ID=1000 +ARG MANALA_GROUP_ID=1000 + +# Used for checking we're running inside a container +ENV container="docker" +ENV MANALA_HOST=${MANALA_HOST} + +RUN \ + # Disable irrelevants apt-key warnings + export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE="1" \ + # Disable all debian user interaction + && export DEBIAN_FRONTEND="noninteractive" \ + && apt-get --quiet --allow-releaseinfo-change update \ + && apt-get --quiet --yes -o=Dpkg::Use-Pty=0 --purge --auto-remove dist-upgrade \ + && apt-get --quiet --yes -o=Dpkg::Use-Pty=0 --no-install-recommends --verbose-versions install \ + gnupg \ + ca-certificates \ + sudo \ + curl \ + make \ + socat \ + # Openssl packages are broken on buster/arm64, install them from bullseye + # See: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=989604 + && if [ $(dpkg --print-architecture) = "arm64" ]; then \ + curl -sSL "http://snapshot.debian.org/archive/debian/20210827T161311Z/pool/main/o/openssl/{openssl,libssl1.1}_1.1.1k-1%2Bdeb11u1_arm64.deb" \ + -o /var/cache/apt/archives/#1.deb \ + && dpkg --install \ + /var/cache/apt/archives/openssl.deb \ + /var/cache/apt/archives/libssl1.1.deb ; \ + fi \ + # User + && addgroup --gid ${MANALA_GROUP_ID} app \ + && adduser --disabled-password --gecos "" app --uid ${MANALA_USER_ID} --ingroup app \ + # Sudo + && echo "app ALL=(ALL) NOPASSWD:ALL" \ + > /etc/sudoers.d/app + +WORKDIR /srv/app + +######## +# Init # +######## + +# None +FROM system AS init-none + +STOPSIGNAL SIGKILL + +CMD ["sleep", "9999999"] + +ENTRYPOINT ["/entrypoint.sh"] + +# SysV +FROM system AS init-sysv + +RUN \ + # Disable irrelevants apt-key warnings + export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE="1" \ + # Disable all debian user interaction + && export DEBIAN_FRONTEND="noninteractive" \ + # Work around chroot check to avoid sysvinit restart after install + && mv /usr/bin/ischroot /usr/bin/ischroot_ \ + && ln -s /bin/true /usr/bin/ischroot \ + && apt-get --quiet --yes -o=Dpkg::Use-Pty=0 --no-install-recommends --verbose-versions install \ + sysvinit-core \ + && mv /usr/bin/ischroot_ /usr/bin/ischroot \ + # Disable getty + && sed -i "s/^\([[:digit:]]:\)/#\1/g" /etc/inittab \ + # Shutdown on SIGINT + && sed -i "s/^\(ca:.*\)/ca:12345:ctrlaltdel:\/sbin\/shutdown -h now/g" /etc/inittab \ + # Don't bring networking down right before halting system + && echo "NETDOWN=no" >> /etc/default/halt \ + # Useless services + && insserv --remove \ + # rcS / rc2 + mountall-bootclean.sh mountall.sh checkroot-bootclean.sh checkfs.sh checkroot.sh bootlogs hostname.sh \ + hwclock.sh mountdevsubfs.sh mountkernfs.sh \ + brightness \ + mountnfs-bootclean.sh mountnfs.sh \ + urandom \ + bootmisc.sh \ + # rc2 + rmnologin \ + rc.local \ + # rc0 + sendsigs \ + umountnfs.sh \ + umountfs \ + umountroot \ + # Block systemd replacement + && printf "\ +Package: systemd-sysv\n\ +Pin: release *\n\ +Pin-Priority: -1\n\ +" > /etc/apt/preferences + +STOPSIGNAL SIGINT + +CMD ["/sbin/init"] + +ENTRYPOINT ["/entrypoint.sh"] + +# OpenRC +FROM system AS init-openrc + +RUN \ + # Disable irrelevants apt-key warnings + export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE="1" \ + # Disable all debian user interaction + && export DEBIAN_FRONTEND="noninteractive" \ + && rm -f /etc/init.d/hwclock.sh \ + && apt-get --quiet --yes -o=Dpkg::Use-Pty=0 --no-install-recommends --verbose-versions install \ + openrc + +STOPSIGNAL SIGINT + +CMD ["/sbin/openrc-init"] + +ENTRYPOINT ["/entrypoint.sh"] + +# Systemd +FROM system AS init-systemd + +RUN \ + # Disable irrelevants apt-key warnings + export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE="1" \ + # Disable all debian user interaction + && export DEBIAN_FRONTEND="noninteractive" \ + && apt-get --quiet --yes -o=Dpkg::Use-Pty=0 --no-install-recommends --verbose-versions install \ + systemd dbus \ + && systemctl set-default multi-user.target \ + && sed -i 's/#\(ForwardToConsole=\).*$/\1yes/' \ + /etc/systemd/journald.conf \ + && printf "Defaults env_keep += \"container\"\n" \ + > /etc/sudoers.d/systemd \ + && rm -rf \ + /etc/systemd/system/*.wants/* \ + /lib/systemd/system/multi-user.target.wants/* \ + /lib/systemd/system/local-fs.target.wants/* \ + /lib/systemd/system/sockets.target.wants/*udev* \ + /lib/systemd/system/sockets.target.wants/*initctl* \ + /lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev* \ + /lib/systemd/system/systemd-update-utmp* + +VOLUME /sys/fs/cgroup + +STOPSIGNAL SIGRTMIN+3 + +CMD ["/lib/systemd/systemd"] + +ENTRYPOINT ["/entrypoint.sh"] + +############# +# Provision # +############# + +# None +FROM init-${MANALA_INIT} AS provision-none + +# Ansible +FROM init-${MANALA_INIT} AS provision-ansible + +ARG ANSIBLE_CORE_VERSION=2.11.8 +ARG MANALA_PROVISION_LIMIT + +# Locale +ENV LANG=C.UTF-8 + +RUN \ + # Disable irrelevants apt-key warnings + export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE="1" \ + # Disable all debian user interaction + && export DEBIAN_FRONTEND="noninteractive" \ + && apt-get --quiet --yes -o=Dpkg::Use-Pty=0 --no-install-recommends --verbose-versions install \ + python3 python3-pip \ + python3-setuptools python3-wheel python3-cryptography \ + python3-apt \ + && pip3 install ansible-core==${ANSIBLE_CORE_VERSION} \ + && mkdir -p /etc/ansible/ \ + && printf "\ +[defaults]\n\ +force_color = True\n\ +gather_subset = all,!hardware\n\ +display_skipped_hosts = False\n\ +deprecation_warnings = False\n\ +retry_files_enabled = False\n\ +stdout_callback = yaml\n\ +[ssh_connection]\n\ +pipelining = True\n\ +[privilege_escalation]\n\ +become_flags = -E\n\ +" > /etc/ansible/ansible.cfg + +COPY Makefile ./.manala/ +COPY ansible/ ./.manala/ansible/ +COPY certificates/ ./.manala/certificates/ + +RUN \ + if [ -n "${MANALA_PROVISION_LIMIT}" ]; then \ + su app -s /usr/bin/make -- \ + --silent \ + --directory .manala \ + provision \ + LIMIT=${MANALA_PROVISION_LIMIT} ; \ + fi + +####### +# App # +####### + +FROM provision-${MANALA_PROVISION} AS app + +COPY docker/entrypoint.sh / diff --git a/.manala/docker/compose.yaml b/.manala/docker/compose.yaml new file mode 100644 index 0000000..481f617 --- /dev/null +++ b/.manala/docker/compose.yaml @@ -0,0 +1,20 @@ +version: "3.8" + +services: + + ####### + # App # + ####### + + app: + hostname: elao-tricot + build: + context: .. + dockerfile: docker/Dockerfile + target: app + args: + MANALA_HOST: ${MANALA_HOST:-linux} + MANALA_USER_ID: ${MANALA_USER_ID:-1000} + MANALA_GROUP_ID: ${MANALA_GROUP_ID:-1000} + volumes: + - ../..:/srv/app diff --git a/.manala/docker/compose/cache.yaml b/.manala/docker/compose/cache.yaml new file mode 100644 index 0000000..f0d3b85 --- /dev/null +++ b/.manala/docker/compose/cache.yaml @@ -0,0 +1,14 @@ +services: + + ####### + # App # + ####### + + app: + volumes: + - ../.cache:/srv/cache + environment: + # Composer, Yarn, ... + XDG_CACHE_HOME: /srv/cache/app + # Npm (dynamically based on XDG_CACHE_HOME) + NPM_CONFIG_CACHE: $${XDG_CACHE_HOME}/npm diff --git a/.manala/docker/compose/development.yaml b/.manala/docker/compose/development.yaml new file mode 100644 index 0000000..68b8fb3 --- /dev/null +++ b/.manala/docker/compose/development.yaml @@ -0,0 +1,33 @@ +version: "3.8" + +services: + + ########### + # MailHog # + ########### + + mailhog: + image: mailhog/mailhog:v1.0.1 + entrypoint: + - /bin/sh + - -c + - MailHog -smtp-bind-addr 0.0.0.0:25 &>/dev/null + network_mode: service:app + + ####### + # App # + ####### + + app: + build: + args: + MANALA_PROVISION: ansible + MANALA_PROVISION_LIMIT: development + ports: + # Usuals + - 12688:8080 + # MailHog + - 12625:8025 + # Nginx + - 12680:80 + - 12643:443 diff --git a/.manala/docker/compose/git.yaml b/.manala/docker/compose/git.yaml new file mode 100644 index 0000000..5b8f5cf --- /dev/null +++ b/.manala/docker/compose/git.yaml @@ -0,0 +1,9 @@ +services: + + ####### + # App # + ####### + + app: + volumes: + - ${MANALA_GIT_CONFIG}:/home/app/.gitconfig diff --git a/.manala/docker/compose/github.yaml b/.manala/docker/compose/github.yaml new file mode 100644 index 0000000..e488008 --- /dev/null +++ b/.manala/docker/compose/github.yaml @@ -0,0 +1,9 @@ +services: + + ####### + # App # + ####### + + app: + volumes: + - ${MANALA_GITHUB_CONFIG}:/home/app/.config/gh diff --git a/.manala/docker/compose/init.openrc.yaml b/.manala/docker/compose/init.openrc.yaml new file mode 100644 index 0000000..41c4fd8 --- /dev/null +++ b/.manala/docker/compose/init.openrc.yaml @@ -0,0 +1,17 @@ +services: + + ####### + # App # + ####### + + app: + build: + args: + MANALA_INIT: openrc + tty: true + cap_add: + - SYS_BOOT + tmpfs: + - /run + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw diff --git a/.manala/docker/compose/init.systemd.yaml b/.manala/docker/compose/init.systemd.yaml new file mode 100644 index 0000000..9d79cd5 --- /dev/null +++ b/.manala/docker/compose/init.systemd.yaml @@ -0,0 +1,14 @@ +services: + + ####### + # App # + ####### + + app: + build: + args: + MANALA_INIT: systemd + tty: true + privileged: true + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw diff --git a/.manala/docker/compose/init.sysv.yaml b/.manala/docker/compose/init.sysv.yaml new file mode 100644 index 0000000..4068fe4 --- /dev/null +++ b/.manala/docker/compose/init.sysv.yaml @@ -0,0 +1,14 @@ +services: + + ####### + # App # + ####### + + app: + build: + args: + MANALA_INIT: sysv + tty: true + tmpfs: + - /tmp + - /run diff --git a/.manala/docker/compose/integration.yaml b/.manala/docker/compose/integration.yaml new file mode 100644 index 0000000..8d1d85a --- /dev/null +++ b/.manala/docker/compose/integration.yaml @@ -0,0 +1,13 @@ +version: "3.8" + +services: + + ####### + # App # + ####### + + app: + build: + args: + MANALA_PROVISION: ansible + MANALA_PROVISION_LIMIT: integration diff --git a/.manala/docker/compose/mutagen.yaml b/.manala/docker/compose/mutagen.yaml new file mode 100644 index 0000000..2e83369 --- /dev/null +++ b/.manala/docker/compose/mutagen.yaml @@ -0,0 +1,30 @@ +version: "3.8" + +volumes: + app: + +services: + + ####### + # App # + ####### + + app: + volumes: + # App + - app:/srv/app + +x-mutagen: + sync: + defaults: + permissions: + defaultFileMode: 0644 + defaultDirectoryMode: 0755 + configurationBeta: + permissions: + defaultGroup: id:1000 + defaultOwner: id:1000 + app: + alpha: ../.. + beta: volume://app + mode: two-way-resolved diff --git a/.manala/docker/compose/ssh-agent.yaml b/.manala/docker/compose/ssh-agent.yaml new file mode 100644 index 0000000..4b90801 --- /dev/null +++ b/.manala/docker/compose/ssh-agent.yaml @@ -0,0 +1,12 @@ +services: + + ####### + # App # + ####### + + app: + volumes: + - ${SSH_AUTH_SOCK}:${MANALA_SSH_AUTH_SOCK_BIND:-${SSH_AUTH_SOCK}} + environment: + SSH_AUTH_SOCK: ${SSH_AUTH_SOCK} + MANALA_SSH_AUTH_SOCK_BIND: ${MANALA_SSH_AUTH_SOCK_BIND:-} diff --git a/.manala/docker/compose/ssh-key.yaml b/.manala/docker/compose/ssh-key.yaml new file mode 100644 index 0000000..5c1b2b5 --- /dev/null +++ b/.manala/docker/compose/ssh-key.yaml @@ -0,0 +1,10 @@ +services: + + ####### + # App # + ####### + + app: + environment: + SSH_AUTH_SOCK: /tmp/ssh-agent + MANALA_SSH_KEY: ${MANALA_SSH_KEY} diff --git a/.manala/docker/entrypoint.sh b/.manala/docker/entrypoint.sh new file mode 100755 index 0000000..a65a0ac --- /dev/null +++ b/.manala/docker/entrypoint.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +set -e + +# If ssh-agent bind differs from sock, establish an unprivileged relay +if [ -n "${SSH_AUTH_SOCK}" ] && [ -n "${MANALA_SSH_AUTH_SOCK_BIND}" ] && [ "${SSH_AUTH_SOCK}" != "${MANALA_SSH_AUTH_SOCK_BIND}" ]; then + printf "Bind privileged ssh-agent socket\n" + socat \ + UNIX-LISTEN:${SSH_AUTH_SOCK},fork,mode=777 \ + UNIX-CONNECT:${MANALA_SSH_AUTH_SOCK_BIND} & +fi + +# Ssh key +if [ -n "${SSH_AUTH_SOCK}" ] && [ -n "${MANALA_SSH_KEY}" ]; then + printf "Start ssh-agent as app user\n" + su app -c "ssh-agent -a ${SSH_AUTH_SOCK}" + printf "Add ssh key\n" + su app -c "echo \"${MANALA_SSH_KEY}\" | ssh-add -" +fi + +exec "$@" diff --git a/.manala/docker/make.mk b/.manala/docker/make.mk new file mode 100644 index 0000000..4d82fc9 --- /dev/null +++ b/.manala/docker/make.mk @@ -0,0 +1,98 @@ +########## +# Docker # +########## + +ifeq ($(container),docker) +DOCKER := 1 +DOCKER_SHELL := $(SHELL) +DOCKER_MAKE := $(MAKE) +else +DOCKER_SHELL = $(_docker_compose_exec) /bin/sh +DOCKER_MAKE = $(_docker_compose_exec) make +endif + +################### +# Mutagen Compose # +################### + +_MUTAGEN_COMPOSE = $(shell command -v mutagen-compose) + +####### +# Git # +####### + +_GIT_CONFIG = $(wildcard ~/.gitconfig) +_GITHUB_CONFIG = $(wildcard ~/.config/gh) + +################## +# Docker Compose # +################## + +_DOCKER_COMPOSE = $(if $(_MUTAGEN_COMPOSE), \ + $(_MUTAGEN_COMPOSE), \ + $(shell command -v docker) compose \ +) +_DOCKER_COMPOSE_ENV = \ + DOCKER_BUILDKIT=1 \ + MANALA_HOST=$(OS) \ + $(if $(_GIT_CONFIG),MANALA_GIT_CONFIG=$(_GIT_CONFIG)) \ + $(if $(_GITHUB_CONFIG),MANALA_GITHUB_CONFIG=$(_GITHUB_CONFIG)) +_DOCKER_COMPOSE_FILE = \ + $(_DIR)/.manala/docker/compose.yaml \ + $(_DIR)/.manala/docker/compose/init.sysv.yaml \ + $(_DIR)/.manala/docker/compose/development.yaml \ + $(if $(_MUTAGEN_COMPOSE),$(_DIR)/.manala/docker/compose/mutagen.yaml) \ + $(if $(_GIT_CONFIG),$(_DIR)/.manala/docker/compose/git.yaml) \ + $(if $(_GITHUB_CONFIG),$(_DIR)/.manala/docker/compose/github.yaml) +_DOCKER_COMPOSE_PROJECT_NAME = $(PROJECT_NAME) +_DOCKER_COMPOSE_PROJECT_DIRECTORY = $(_DIR)/.manala/docker +_DOCKER_COMPOSE_PROFILE = development +_DOCKER_COMPOSE_EXEC_SERVICE = app +_DOCKER_COMPOSE_EXEC_USER = app +_DOCKER_COMPOSE_EXEC_WORKDIR = /srv/app/$(_CURRENT_DIR) + +# Debug +ifdef DEBUG +_DOCKER_COMPOSE_ENV += BUILDKIT_PROGRESS=plain +endif + +# Ssh Agent +ifdef SSH_AUTH_SOCK +_DOCKER_COMPOSE_FILE += $(_DIR)/.manala/docker/compose/ssh-agent.yaml + # See: https://docs.docker.com/desktop/mac/networking/#ssh-agent-forwarding + ifdef OS_DARWIN +_DOCKER_COMPOSE_ENV += SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock +_DOCKER_COMPOSE_ENV += MANALA_SSH_AUTH_SOCK_BIND=/run/host-services/ssh-auth.sock.bind + endif +endif + +# Internal usage: +# $(_docker_compose) [COMMAND] [ARGS...] + +ifndef DOCKER +define _docker_compose + $(_DOCKER_COMPOSE_ENV) \ + $(if $(_DOCKER_COMPOSE_PROJECT_NAME),COMPOSE_PROJECT_NAME=$(_DOCKER_COMPOSE_PROJECT_NAME)) \ + $(_DOCKER_COMPOSE) \ + $(if $(_DOCKER_COMPOSE_PROJECT_DIRECTORY),--project-directory $(_DOCKER_COMPOSE_PROJECT_DIRECTORY)) \ + $(if $(_DOCKER_COMPOSE_PROFILE),--profile $(_DOCKER_COMPOSE_PROFILE)) \ + $(foreach FILE, $(_DOCKER_COMPOSE_FILE), \ + --file $(FILE) \ + ) +endef +else +define _docker_compose + $(call message_error, Unable to execute command inside a docker container) ; \ + exit 1 ; +endef +endif + +# Internal usage: +# $(_docker_compose_exec) COMMAND [ARGS...] + +define _docker_compose_exec + $(_docker_compose) exec \ + $(if $(_DOCKER_COMPOSE_EXEC_USER),--user $(_DOCKER_COMPOSE_EXEC_USER)) \ + $(if $(_DOCKER_COMPOSE_EXEC_WORKDIR),--workdir $(_DOCKER_COMPOSE_EXEC_WORKDIR)) \ + $(_DOCKER_COMPOSE_EXEC_SERVICE) +endef diff --git a/.manala/github/deliveries/README.md b/.manala/github/deliveries/README.md new file mode 100644 index 0000000..4de8512 --- /dev/null +++ b/.manala/github/deliveries/README.md @@ -0,0 +1,3 @@ +# Deliveries + +¯\_(ツ)_/¯ Because it works on my machine... diff --git a/.manala/github/deliveries/action.yaml b/.manala/github/deliveries/action.yaml new file mode 100644 index 0000000..9bf642e --- /dev/null +++ b/.manala/github/deliveries/action.yaml @@ -0,0 +1,32 @@ +name: Release +description: Release +author: Elao + +inputs: + secrets: + description: Secrets + required: true + app: + description: App + required: false + tier: + description: Tier + required: true + ref: + description: Ref + required: false + release: + description: Release + type: boolean + default: ${{ github.job == 'release' && 'true' || 'false' }} + deploy: + description: Deploy + type: boolean + default: ${{ github.job == 'deploy' && 'true' || 'false' }} + deploy_ref: + description: Deploy Ref + required: false + +runs: + using: composite + steps: diff --git a/.manala/github/integration/README.md b/.manala/github/integration/README.md new file mode 100644 index 0000000..9b51141 --- /dev/null +++ b/.manala/github/integration/README.md @@ -0,0 +1,3 @@ +# Integration + +¯\_(ツ)_/¯ Because testing is doubting... diff --git a/.manala/github/integration/action.yaml b/.manala/github/integration/action.yaml new file mode 100644 index 0000000..00a3e37 --- /dev/null +++ b/.manala/github/integration/action.yaml @@ -0,0 +1,18 @@ +name: Integration +description: Integration +author: Elao + +inputs: + job: + description: Job + required: true + default: ${{ github.job }} + +runs: + using: composite + steps: + + - name: Setup + uses: ./.manala/github/system + with: + setup: true diff --git a/.manala/github/system/action.yaml b/.manala/github/system/action.yaml new file mode 100644 index 0000000..08f8da9 --- /dev/null +++ b/.manala/github/system/action.yaml @@ -0,0 +1,129 @@ +name: System +description: System +author: Elao + +inputs: + setup: + description: Setup + default: 'false' + type: boolean + required: false + setup_group: + description: Shell group + required: false + default: 🚧 Setup + ssh_key: + description: Ssh Key + required: false + shell: + description: Shell + required: false + shell_group: + description: Shell group + required: false + default: 🐚 Shell + app: + description: App + required: false + +runs: + using: composite + steps: + + ######### + # Setup # + ######### + + - name: Docker pull + if: inputs.setup != 'false' + shell: bash + env: + DOCKER_BUILDKIT: 1 + BUILDKIT_PROGRESS: plain + run: | + echo "::group::🐳 Docker pull" + docker-compose \ + --project-directory ./.manala/docker \ + --profile integration \ + --file ./.manala/docker/compose.yaml \ + --file ./.manala/docker/compose/integration.yaml \ + pull + echo "::endgroup::" + - name: Cache docker + if: inputs.setup != 'false' + uses: satackey/action-docker-layer-caching@v0.0.11 + with: + key: app-docker-${{ hashFiles('.manala/docker/Dockerfile', '.manala/Makefile', '.manala/ansible/**', '.manala/certificates/**') }}-{hash} + restore-keys: | + app-docker-${{ hashFiles('.manala/docker/Dockerfile', '.manala/Makefile', '.manala/ansible/**', '.manala/certificates/**') }}- + - name: Create dependencies cache dir + if: inputs.setup != 'false' + shell: bash + run: mkdir -p .manala/.cache + - name: Cache dependencies + if: inputs.setup != 'false' + uses: actions/cache@v3 + with: + path: .manala/.cache + key: app-dependencies-${{ hashFiles('**/composer.lock', '**/package-lock.json', '**/yarn.lock') }}-${{ github.workflow }}-${{ github.job }} + restore-keys: | + app-dependencies-${{ hashFiles('**/composer.lock', '**/package-lock.json', '**/yarn.lock') }}-${{ github.workflow }}- + app-dependencies-${{ hashFiles('**/composer.lock', '**/package-lock.json', '**/yarn.lock') }}- + app-dependencies- + - name: Docker up + if: inputs.setup != 'false' + shell: bash + env: + DOCKER_BUILDKIT: 1 + BUILDKIT_PROGRESS: plain + MANALA_SSH_KEY: ${{ inputs.ssh_key }} + run: | + echo "::group::${{ inputs.setup_group }}" + MANALA_USER_ID=$(id -u) \ + MANALA_GROUP_ID=$(id -g) \ + docker-compose \ + --project-directory ./.manala/docker \ + --project-name app \ + --profile integration \ + --file ./.manala/docker/compose.yaml \ + --file ./.manala/docker/compose/integration.yaml \ + --file ./.manala/docker/compose/cache.yaml \ + ${{ inputs.ssh_key != '' && '--file ./.manala/docker/compose/ssh-key.yaml' || '' }} \ + up \ + --detach + echo "::endgroup::" + + ######### + # Shell # + ######### + + - name: Shell + if: inputs.shell + shell: bash + run: | + echo "::group::${{ inputs.shell_group }}" + docker-compose \ + --project-directory ./.manala/docker \ + --project-name app \ + --profile integration \ + --file ./.manala/docker/compose.yaml \ + --file ./.manala/docker/compose/integration.yaml \ + --file ./.manala/docker/compose/cache.yaml \ + exec \ + -T \ + ${{ inputs.app != '' && format('--workdir /srv/app/{0}', inputs.app) || '' }} \ + ${{ inputs.app != '' && format('--env XDG_CACHE_HOME=/srv/cache/{0}', inputs.app) || '' }} \ + --user app \ + --env CI=${CI} \ + --env GITHUB_ACTION=${GITHUB_ACTION} \ + --env GITHUB_ACTION_REF=${GITHUB_ACTION_REF} \ + --env GITHUB_ACTION_REPOSITORY=${GITHUB_ACTION_REPOSITORY} \ + --env GITHUB_ACTIONS=${GITHUB_ACTIONS} \ + --env GITHUB_ACTOR=${GITHUB_ACTOR} \ + --env GITHUB_JOB=${GITHUB_JOB} \ + --env GITHUB_WORKFLOW=${GITHUB_WORKFLOW} \ + app \ + sh -e << 'EOF' + ${{ inputs.shell }} + EOF + echo "::endgroup::" diff --git a/.manala/jenkins/Jenkinsfile b/.manala/jenkins/Jenkinsfile new file mode 100644 index 0000000..1be0dbf --- /dev/null +++ b/.manala/jenkins/Jenkinsfile @@ -0,0 +1,5 @@ +#!/usr/bin/env groovy + +stage('¯\\_(ツ)_/¯') { + echo 'Because testing is doubting...' +} diff --git a/.manala/make/git.mk b/.manala/make/git.mk new file mode 100644 index 0000000..69b036d --- /dev/null +++ b/.manala/make/git.mk @@ -0,0 +1,30 @@ +######## +# Diff # +######## + +# Returns the list of changed files for some given extensions and some given folders. +# +# @param $1 The file extensions of changed files +# @param $2 The relative folders to parse for changed files +# +# Examples: +# +# Example #1: list PHP and Javascript files changed in the src and test folders +# +# $(call git_diff, php js, src test) + +define git_diff +$(shell \ + for ext in $(if $(strip $(1)),$(strip $(1)),"") ; \ + do \ + for dir in $(if $(strip $(2)),$(strip $(2)),"") ; \ + do \ + git --no-pager diff --name-status "$$(git merge-base HEAD origin/master)" \ + | grep "$${ext}\$$" \ + | grep "\\s$${dir}" \ + | grep -v '^D' \ + | awk '{ print $$NF }' || true ; \ + done ; \ + done \ +) +endef diff --git a/.manala/make/help.mk b/.manala/make/help.mk new file mode 100644 index 0000000..d9b2e32 --- /dev/null +++ b/.manala/make/help.mk @@ -0,0 +1,72 @@ +######## +# Help # +######## + +.DEFAULT_GOAL := help + +HELP = \ + Usage: make [$(COLOR_INFO)command$(COLOR_RESET)] \ + $(call help_section, Help) \ + $(call help,help,This help) + +define help_section + \n\n$(COLOR_COMMENT)$(strip $(1)):$(COLOR_RESET) +endef + +define help + \n $(COLOR_INFO)$(1)$(COLOR_RESET) $(2) +endef + +help: + @printf "\n$(HELP)" + @awk ' \ + BEGIN { \ + sectionsName[1] = "Commands" ; \ + sectionsCount = 1 ; \ + } \ + /^[-a-zA-Z0-9_.@%\/]+:/ { \ + if (match(lastLine, /^## (.*)/)) { \ + command = substr($$1, 1, index($$1, ":") - 1) ; \ + section = substr(lastLine, RSTART + 3, index(lastLine, " - ") - 4) ; \ + if (section) { \ + message = substr(lastLine, index(lastLine, " - ") + 3, RLENGTH) ; \ + sectionIndex = 0 ; \ + for (i = 1; i <= sectionsCount; i++) { \ + if (sectionsName[i] == section) { \ + sectionIndex = i ; \ + } \ + } \ + if (!sectionIndex) { \ + sectionIndex = sectionsCount++ + 1 ; \ + sectionsName[sectionIndex] = section ; \ + } \ + } else { \ + message = substr(lastLine, RSTART + 3, RLENGTH) ; \ + sectionIndex = 1 ; \ + } \ + if (length(command) > sectionsCommandLength[sectionIndex]) { \ + sectionsCommandLength[sectionIndex] = length(command) ; \ + } \ + sectionCommandIndex = sectionsCommandCount[sectionIndex]++ + 1; \ + helpsCommand[sectionIndex, sectionCommandIndex] = command ; \ + helpsMessage[sectionIndex, sectionCommandIndex] = message ; \ + } \ + } \ + { lastLine = $$0 } \ + END { \ + for (i = 1; i <= sectionsCount; i++) { \ + if (sectionsCommandCount[i]) { \ + printf "\n\n$(COLOR_COMMENT)%s:$(COLOR_RESET)", sectionsName[i] ; \ + for (j = 1; j <= sectionsCommandCount[i]; j++) { \ + printf "\n $(COLOR_INFO)%-" sectionsCommandLength[i] "s$(COLOR_RESET) %s", helpsCommand[i, j], helpsMessage[i, j] ; \ + } \ + } \ + } \ + } \ + ' $(MAKEFILE_LIST) + @printf "\n\n" + @printf "$(if $(HELP_PROJECT),$(HELP_PROJECT)\n\n)" +.PHONY: help + +help.project: + @printf "$(if $(HELP_PROJECT),\n$(HELP_PROJECT)\n\n)" diff --git a/.manala/make/os.mk b/.manala/make/os.mk new file mode 100644 index 0000000..ae43afe --- /dev/null +++ b/.manala/make/os.mk @@ -0,0 +1,29 @@ +###### +# Os # +###### + +# Os detection helpers. +# +# Examples: +# +# Example #1: conditions on linux +# +# echo $(if $(OS_LINUX),Running on Linux,*NOT* running on Linux) + +ifeq ($(OS),Windows_NT) +OS := windows +else +OS := $(shell uname | tr '[:upper:]' '[:lower:]') +endif + +ifeq ($(OS),linux) +OS_LINUX := 1 +endif + +ifeq ($(OS),darwin) +OS_DARWIN := 1 +endif + +ifeq ($(OS),windows) +OS_WINDOWS := 1 +endif diff --git a/.manala/make/semver.mk b/.manala/make/semver.mk new file mode 100644 index 0000000..5ce2400 --- /dev/null +++ b/.manala/make/semver.mk @@ -0,0 +1,23 @@ +########## +# Semver # +########## + +define semver_bump + VERSION=$(2) ; \ + if [ -z "$${VERSION}" ]; then \ + printf "$(COLOR_INFO)What's the version number? (current: $(COLOR_COMMENT)`cat $(firstword $(1))`$(COLOR_INFO))$(COLOR_RESET)\n" ; \ + read VERSION ; \ + if [ -z $${VERSION} ]; then \ + printf "$(COLOR_ERROR) ❌ Version cannot be empty. Aborting$(COLOR_RESET)\n" ; \ + exit 128 ; \ + fi ; \ + fi ; \ + printf "$(COLOR_INFO)Bumping version $(COLOR_COMMENT)$${VERSION}$(COLOR_INFO)…$(COLOR_RESET)\n" ; \ + for file in $(1) ; \ + do \ + echo $${VERSION} > $${file} ; \ + done ; \ + git add $(1) ; \ + git commit -m "Bump version $${VERSION}" ; \ + git diff HEAD^ HEAD --color | cat +endef diff --git a/.manala/make/text.mk b/.manala/make/text.mk new file mode 100644 index 0000000..7eb4484 --- /dev/null +++ b/.manala/make/text.mk @@ -0,0 +1,132 @@ +########## +# Colors # +########## + +COLOR_RESET := \033[0m +COLOR_ERROR := \033[31m +COLOR_INFO := \033[32m +COLOR_WARNING := \033[33m +COLOR_COMMENT := \033[36m + +###################### +# Special Characters # +###################### + +# Usage: +# $(call message, Foo$(,) bar) = Foo, bar + +, := , + +######## +# Time # +######## + +# Usage: +# $(call time) = 11:06:20 + +define time +`date -u +%T` +endef + +########### +# Message # +########### + +# Usage: +# $(call message, Foo bar) = Foo bar +# $(call message_success, Foo bar) = (っ◕‿◕)っ Foo bar +# $(call message_warning, Foo bar) = ¯\_(ツ)_/¯ Foo bar +# $(call message_error, Foo bar) = (╯°□°)╯︵ ┻━┻ Foo bar + +define message + printf "$(COLOR_INFO)$(strip $(1))$(COLOR_RESET)\n" +endef + +define message_success + printf "$(COLOR_INFO)(っ◕‿◕)っ $(strip $(1))$(COLOR_RESET)\n" +endef + +define message_warning + printf "$(COLOR_WARNING)¯\_(ツ)_/¯ $(strip $(1))$(COLOR_RESET)\n" +endef + +define message_error + printf "$(COLOR_ERROR)(╯°□°)╯︵ ┻━┻ $(strip $(1))$(COLOR_RESET)\n" +endef + +####### +# Log # +####### + +# Usage: +# $(call log, Foo bar) = [11:06:20] [target] Foo bar +# $(call log_warning, Foo bar) = [11:06:20] [target] ¯\_(ツ)_/¯ Foo bar +# $(call log_error, Foo bar) = [11:06:20] [target] (╯°□°)╯︵ ┻━┻ Foo bar + +define log + printf "[$(COLOR_COMMENT)$(call time)$(COLOR_RESET)] [$(COLOR_COMMENT)$(@)$(COLOR_RESET)] " ; $(call message, $(1)) +endef + +define log_warning + printf "[$(COLOR_COMMENT)$(call time)$(COLOR_RESET)] [$(COLOR_COMMENT)$(@)$(COLOR_RESET)] " ; $(call message_warning, $(1)) +endef + +define log_error + printf "[$(COLOR_COMMENT)$(call time)$(COLOR_RESET)] [$(COLOR_COMMENT)$(@)$(COLOR_RESET)] " ; $(call message_error, $(1)) +endef + +########### +# Confirm # +########### + +# Usage: +# $(call confirm, Foo bar) = ༼ つ ◕_◕ ༽つ Foo bar (y/N): + +define confirm + $(if $(CONFIRM),, \ + printf "$(COLOR_INFO) ༼ つ ◕_◕ ༽つ $(COLOR_WARNING)$(strip $(1)) $(COLOR_RESET)$(COLOR_WARNING)(y/N)$(COLOR_RESET): "; \ + read CONFIRM ; if [ "$$CONFIRM" != "y" ]; then printf "\n"; exit 1; fi; \ + ) +endef + +################ +# Conditionals # +################ + +# Usage: +# $(call error_if_not, $(FOO), FOO has not been specified) = (╯°□°)╯︵ ┻━┻ FOO has not been specified + +define error_if_not + $(if $(strip $(1)),, \ + $(call message_error, $(strip $(2))) ; exit 1 \ + ) +endef + +# Usage: +# $(call confirm_if, $(FOO), Foo bar) = ༼ つ ◕_◕ ༽つ Foo bar (y/N): + +define confirm_if + $(if $(strip $(1)), \ + $(call confirm, $(strip $(2))) + ) +endef + +# Usage: +# $(call confirm_if_not, $(FOO), Foo bar) = ༼ つ ◕_◕ ༽つ Foo bar (y/N): + +define confirm_if_not + $(if $(strip $(1)),, \ + $(call confirm, $(strip $(2))) + ) +endef + +########## +# Random # +########## + +# Usage: +# $(call rand, 8) = 8th56zp2 + +define rand +`cat /dev/urandom | LC_ALL=C tr -dc 'a-z0-9' | fold -w $(strip $(1)) | head -n 1` +endef diff --git a/.manala/make/try.mk b/.manala/make/try.mk new file mode 100644 index 0000000..32090fb --- /dev/null +++ b/.manala/make/try.mk @@ -0,0 +1,23 @@ +####### +# Try # +####### + +# Execute first command (try), unconditionnaly run second command (finally), and +# exit with first command return code. +# +# @param $1 First command +# @param $2 Second command +# +# Examples: +# +# Example #1: Run tests and remove artefacts +# +# $(call try_finally, phpunit, rm -Rf artefacts) + +define try_finally +( \ + $(strip $(1)) \ +) ; RC=$${?} \ +; $(strip $(2)) \ +&& exit $${RC} +endef diff --git a/Makefile b/Makefile index 1bdfe6e..ef984ca 100644 --- a/Makefile +++ b/Makefile @@ -2,27 +2,13 @@ .PHONY: build test -include .env +-include ./.manala/Makefile ## Colors COLOR_RESET = \033[0m COLOR_INFO = \033[32m COLOR_COMMENT = \033[33m -## Help -help: - printf "${COLOR_COMMENT}Usage:${COLOR_RESET}\n" - printf " make [target]\n\n" - printf "${COLOR_COMMENT}Available targets:${COLOR_RESET}\n" - awk '/^[a-zA-Z\-\_0-9\.@]+:/ { \ - helpMessage = match(lastLine, /^## (.*)/); \ - if (helpMessage) { \ - helpCommand = substr($$1, 0, index($$1, ":")); \ - helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \ - printf " ${COLOR_INFO}%-16s${COLOR_RESET} %s\n", helpCommand, helpMessage; \ - } \ - } \ - { lastLine = $$0 }' $(MAKEFILE_LIST) - ########### # Install # ########### diff --git a/package-lock.json b/package-lock.json index 150e1f2..378565c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", "dev": true, "requires": { - "mime-types": "2.1.17", + "mime-types": "~2.1.16", "negotiator": "0.6.1" } }, @@ -32,7 +32,7 @@ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { @@ -49,7 +49,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -66,10 +66,10 @@ "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -84,9 +84,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "alphanum-sort": { @@ -131,8 +131,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "aproba": { @@ -147,8 +147,8 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "argparse": { @@ -157,7 +157,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -166,7 +166,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -193,8 +193,8 @@ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-union": { @@ -203,7 +203,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -241,9 +241,9 @@ "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -267,7 +267,7 @@ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "^4.14.0" } }, "async-each": { @@ -294,12 +294,12 @@ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000764", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "browserslist": { @@ -308,8 +308,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000764", - "electron-to-chromium": "1.3.27" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } } } @@ -320,10 +320,10 @@ "integrity": "sha1-Oae2ZGqCaYZQc9lYyX9IYVLCyEo=", "dev": true, "requires": { - "autoprefixer": "6.7.7", - "loader-utils": "0.2.17", - "postcss": "5.2.18", - "postcss-safe-parser": "1.0.7" + "autoprefixer": "^6.0.2", + "loader-utils": "^0.2.11", + "postcss": "^5.0.4", + "postcss-safe-parser": "^1.0.1" }, "dependencies": { "loader-utils": { @@ -332,10 +332,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } @@ -358,9 +358,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -369,25 +369,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" }, "dependencies": { "source-map": { @@ -404,14 +404,14 @@ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" }, "dependencies": { "jsesc": { @@ -434,9 +434,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-builder-react-jsx": { @@ -445,9 +445,9 @@ "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" } }, "babel-helper-call-delegate": { @@ -456,10 +456,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -468,10 +468,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -480,9 +480,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -491,11 +491,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -504,8 +504,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -514,8 +514,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -524,8 +524,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -534,9 +534,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -545,11 +545,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^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-replace-supers": { @@ -558,12 +558,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -572,8 +572,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-loader": { @@ -582,9 +582,9 @@ "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", "dev": true, "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1" + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" } }, "babel-messages": { @@ -593,7 +593,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -602,7 +602,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-async-functions": { @@ -641,9 +641,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -652,7 +652,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -661,7 +661,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -670,11 +670,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -683,15 +683,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "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.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -700,8 +700,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -710,7 +710,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -719,8 +719,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -729,7 +729,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -738,9 +738,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -749,7 +749,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -758,9 +758,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "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": { @@ -769,10 +769,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -781,9 +781,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -792,9 +792,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "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": { @@ -803,8 +803,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -813,12 +813,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -827,8 +827,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -837,7 +837,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -846,9 +846,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -857,7 +857,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -866,7 +866,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -875,9 +875,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -886,9 +886,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -897,8 +897,8 @@ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-display-name": { @@ -907,7 +907,7 @@ "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx": { @@ -916,9 +916,9 @@ "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "dev": true, "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-self": { @@ -927,8 +927,8 @@ "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-source": { @@ -937,8 +937,8 @@ "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-regenerator": { @@ -947,7 +947,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -956,8 +956,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-env": { @@ -966,36 +966,36 @@ "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "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.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.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.26.0", - "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.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.9.0", - "invariant": "2.2.2", - "semver": "5.4.1" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^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.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^2.1.2", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, "babel-preset-flow": { @@ -1004,7 +1004,7 @@ "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "dev": true, "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" + "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, "babel-preset-react": { @@ -1013,12 +1013,12 @@ "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" } }, "babel-register": { @@ -1027,13 +1027,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -1042,8 +1042,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1052,11 +1052,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1065,15 +1065,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1082,10 +1082,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1124,7 +1124,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "big.js": { @@ -1145,7 +1145,7 @@ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "bluebird": { @@ -1167,15 +1167,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.15" + "type-is": "~1.6.15" } }, "bonjour": { @@ -1184,12 +1184,12 @@ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.1.1", - "multicast-dns-service-types": "1.1.0" + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" } }, "boolbase": { @@ -1204,7 +1204,7 @@ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "brace-expansion": { @@ -1213,7 +1213,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1223,9 +1223,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "brorand": { @@ -1240,12 +1240,12 @@ "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -1254,9 +1254,9 @@ "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", "dev": true, "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -1265,9 +1265,9 @@ "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { @@ -1276,8 +1276,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -1286,13 +1286,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1301,7 +1301,7 @@ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", "dev": true, "requires": { - "pako": "0.2.9" + "pako": "~0.2.0" } }, "browserslist": { @@ -1310,8 +1310,8 @@ "integrity": "sha512-vJEBcDTANoDhSHL46NeOEW5hvQw7It9uCqzeFPQhpawXfnOwnpvW5C97vn1eGJ7iCkSg8wWU0nYObE7d/N95Iw==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000764", - "electron-to-chromium": "1.3.27" + "caniuse-lite": "^1.0.30000760", + "electron-to-chromium": "^1.3.27" } }, "buffer": { @@ -1320,9 +1320,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-indexof": { @@ -1361,7 +1361,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -1376,8 +1376,8 @@ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { @@ -1392,8 +1392,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "caniuse-api": { @@ -1402,10 +1402,10 @@ "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000764", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" }, "dependencies": { "browserslist": { @@ -1414,8 +1414,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000764", - "electron-to-chromium": "1.3.27" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } } } @@ -1444,8 +1444,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -1454,11 +1454,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "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" } }, "chardet": { @@ -1473,15 +1473,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^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" } }, "cipher-base": { @@ -1490,8 +1490,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "circular-json": { @@ -1506,7 +1506,7 @@ "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.1.3" } }, "clean-css": { @@ -1515,7 +1515,7 @@ "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "0.5.x" }, "dependencies": { "source-map": { @@ -1532,7 +1532,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -1547,9 +1547,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone": { @@ -1564,10 +1564,10 @@ "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", "dev": true, "requires": { - "for-own": "1.0.0", - "is-plain-object": "2.0.4", - "kind-of": "3.2.2", - "shallow-clone": "0.1.2" + "for-own": "^1.0.0", + "is-plain-object": "^2.0.1", + "kind-of": "^3.2.2", + "shallow-clone": "^0.1.2" }, "dependencies": { "for-own": { @@ -1576,7 +1576,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } } } @@ -1593,7 +1593,7 @@ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.1.2" } }, "code-point-at": { @@ -1608,9 +1608,9 @@ "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "dev": true, "requires": { - "clone": "1.0.3", - "color-convert": "1.9.1", - "color-string": "0.3.0" + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" } }, "color-convert": { @@ -1619,7 +1619,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -1634,7 +1634,7 @@ "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.0.0" } }, "colormin": { @@ -1643,9 +1643,9 @@ "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "dev": true, "requires": { - "color": "0.11.4", + "color": "^0.11.0", "css-color-names": "0.0.4", - "has": "1.0.1" + "has": "^1.0.1" } }, "colors": { @@ -1660,7 +1660,7 @@ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -1681,7 +1681,7 @@ "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", "dev": true, "requires": { - "mime-db": "1.30.0" + "mime-db": ">= 1.30.0 < 2" } }, "compression": { @@ -1690,13 +1690,13 @@ "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", "dev": true, "requires": { - "accepts": "1.3.4", + "accepts": "~1.3.4", "bytes": "3.0.0", - "compressible": "2.0.12", + "compressible": "~2.0.11", "debug": "2.6.9", - "on-headers": "1.0.1", + "on-headers": "~1.0.1", "safe-buffer": "5.1.1", - "vary": "1.1.2" + "vary": "~1.1.2" } }, "concat-map": { @@ -1711,9 +1711,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "connect-history-api-fallback": { @@ -1728,7 +1728,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "console-control-strings": { @@ -1779,12 +1779,12 @@ "integrity": "sha512-cL/Wl3Y1QmmKThl/mWeGB+HH3YH+25tn8nhqEGsZda4Yn7GqGnDZ+TbeKJ7A6zvrxyNhhuviYAxn/tCyyAqh8Q==", "dev": true, "requires": { - "bluebird": "3.5.1", - "glob": "7.1.2", - "is-glob": "4.0.0", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "minimatch": "3.0.4" + "bluebird": "^3.5.1", + "glob": "^7.1.2", + "is-glob": "^4.0.0", + "loader-utils": "^0.2.15", + "lodash": "^4.3.0", + "minimatch": "^3.0.4" }, "dependencies": { "is-extglob": { @@ -1799,7 +1799,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "loader-utils": { @@ -1808,10 +1808,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } @@ -1834,8 +1834,8 @@ "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -1844,10 +1844,10 @@ "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -1856,12 +1856,12 @@ "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -1870,8 +1870,8 @@ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, "cryptiles": { @@ -1880,7 +1880,7 @@ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -1889,7 +1889,7 @@ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } } } @@ -1900,17 +1900,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "css-color-names": { @@ -1925,20 +1925,20 @@ "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" + "babel-code-frame": "^6.11.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": ">=2.6.1 <4", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.0.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.0.0", + "postcss-modules-local-by-default": "^1.0.1", + "postcss-modules-scope": "^1.0.0", + "postcss-modules-values": "^1.1.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" } }, "css-select": { @@ -1947,10 +1947,10 @@ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", + "boolbase": "~1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.1" + "nth-check": "~1.0.1" } }, "css-selector-tokenizer": { @@ -1959,9 +1959,9 @@ "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "dev": true, "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" }, "dependencies": { "regexpu-core": { @@ -1970,9 +1970,9 @@ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } } } @@ -1995,38 +1995,38 @@ "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "dev": true, "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" } }, "csso": { @@ -2035,8 +2035,8 @@ "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "dev": true, "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" + "clap": "^1.0.9", + "source-map": "^0.5.3" }, "dependencies": { "source-map": { @@ -2053,7 +2053,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "d": { @@ -2062,7 +2062,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.35" + "es5-ext": "^0.10.9" } }, "dashdash": { @@ -2071,7 +2071,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "date-now": { @@ -2113,8 +2113,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "defined": { @@ -2129,12 +2129,12 @@ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "dev": true, "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" }, "dependencies": { "pify": { @@ -2169,8 +2169,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { @@ -2185,7 +2185,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-node": { @@ -2200,9 +2200,9 @@ "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dns-equal": { @@ -2217,8 +2217,8 @@ "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", "dev": true, "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.1" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, "dns-txt": { @@ -2227,7 +2227,7 @@ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "buffer-indexof": "1.1.1" + "buffer-indexof": "^1.0.0" } }, "doctrine": { @@ -2236,7 +2236,7 @@ "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "dom-converter": { @@ -2245,7 +2245,7 @@ "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "dev": true, "requires": { - "utila": "0.3.3" + "utila": "~0.3" }, "dependencies": { "utila": { @@ -2262,8 +2262,8 @@ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -2292,7 +2292,7 @@ "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -2301,8 +2301,8 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "ecc-jsbn": { @@ -2312,7 +2312,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -2333,13 +2333,13 @@ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -2359,7 +2359,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.13" } }, "enhanced-resolve": { @@ -2368,10 +2368,10 @@ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "entities": { @@ -2386,7 +2386,7 @@ "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", "dev": true, "requires": { - "prr": "0.0.0" + "prr": "~0.0.0" } }, "error-ex": { @@ -2395,7 +2395,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -2404,11 +2404,11 @@ "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -2417,9 +2417,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es5-ext": { @@ -2428,8 +2428,8 @@ "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" } }, "es6-iterator": { @@ -2438,9 +2438,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -2449,12 +2449,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-set": { @@ -2463,11 +2463,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -2476,8 +2476,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -2486,10 +2486,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -2510,10 +2510,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { @@ -2522,43 +2522,43 @@ "integrity": "sha512-28hOYej+NZ/R5H1yMvyKa1+bPlu+fnsIAQffK6hxXgvmXnImos2bA5XfCn5dYv2k2mrKj+/U/Z4L5ICWxC7TQw==", "dev": true, "requires": { - "ajv": "5.3.0", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.0.2", - "eslint-scope": "3.7.1", - "espree": "3.5.2", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.0.1", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.0.1", + "doctrine": "^2.0.2", + "eslint-scope": "^3.7.1", + "espree": "^3.5.2", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "^4.0.1", + "text-table": "~0.2.0" }, "dependencies": { "ansi-regex": { @@ -2573,7 +2573,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2582,9 +2582,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "cross-spawn": { @@ -2593,9 +2593,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "debug": { @@ -2625,8 +2625,8 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "strip-ansi": { @@ -2635,7 +2635,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -2644,7 +2644,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -2655,10 +2655,10 @@ "integrity": "sha512-YGSjB9Qu6QbVTroUZi66pYky3DfoIPLdHQ/wmrBGyBRnwxQsBXAov9j2rpXt/55i8nyMv6IRWJv2s4d4YnduzQ==", "dev": true, "requires": { - "doctrine": "2.0.2", - "has": "1.0.1", - "jsx-ast-utils": "2.0.1", - "prop-types": "15.6.0" + "doctrine": "^2.0.0", + "has": "^1.0.1", + "jsx-ast-utils": "^2.0.0", + "prop-types": "^15.6.0" } }, "eslint-scope": { @@ -2667,8 +2667,8 @@ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "espree": { @@ -2677,8 +2677,8 @@ "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.2.1", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -2693,7 +2693,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -2702,8 +2702,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" } }, "estraverse": { @@ -2730,8 +2730,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "eventemitter3": { @@ -2752,7 +2752,7 @@ "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "dev": true, "requires": { - "original": "1.0.0" + "original": ">=0.0.5" } }, "evp_bytestokey": { @@ -2761,8 +2761,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -2771,13 +2771,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { "cross-spawn": { @@ -2786,9 +2786,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } } } @@ -2799,7 +2799,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -2808,7 +2808,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "express": { @@ -2817,36 +2817,36 @@ "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", "dev": true, "requires": { - "accepts": "1.3.4", + "accepts": "~1.3.4", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.0", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", + "proxy-addr": "~2.0.2", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.1", "serve-static": "1.13.1", "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", + "statuses": "~1.3.1", + "type-is": "~1.6.15", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "array-flatten": { @@ -2869,9 +2869,9 @@ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -2880,7 +2880,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "extract-text-webpack-plugin": { @@ -2889,10 +2889,10 @@ "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "dev": true, "requires": { - "async": "2.6.0", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0", - "webpack-sources": "1.0.2" + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" } }, "extsprintf": { @@ -2931,7 +2931,7 @@ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } }, "fbjs": { @@ -2939,13 +2939,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.17" + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.9" }, "dependencies": { "core-js": { @@ -2961,7 +2961,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -2970,8 +2970,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-loader": { @@ -2980,8 +2980,8 @@ "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" } }, "filename-regex": { @@ -2996,11 +2996,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "finalhandler": { @@ -3010,12 +3010,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" } }, "find-cache-dir": { @@ -3024,9 +3024,9 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.1.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, "find-up": { @@ -3035,8 +3035,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "flat-cache": { @@ -3045,10 +3045,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" }, "dependencies": { "del": { @@ -3057,13 +3057,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "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" } }, "globby": { @@ -3072,12 +3072,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "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" } } } @@ -3100,7 +3100,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -3121,9 +3121,9 @@ "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "forwarded": { @@ -3151,8 +3151,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.39" + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" }, "dependencies": { "abbrev": { @@ -3174,7 +3174,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.1.1", @@ -3225,7 +3226,8 @@ "balanced-match": { "version": "0.4.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "bcrypt-pbkdf": { "version": "1.0.1", @@ -3240,6 +3242,7 @@ "version": "0.0.9", "bundled": true, "dev": true, + "optional": true, "requires": { "inherits": "2.0.3" } @@ -3248,6 +3251,7 @@ "version": "2.10.1", "bundled": true, "dev": true, + "optional": true, "requires": { "hoek": "2.16.3" } @@ -3256,6 +3260,7 @@ "version": "1.1.7", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "0.4.2", "concat-map": "0.0.1" @@ -3264,7 +3269,8 @@ "buffer-shims": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "caseless": { "version": "0.12.0", @@ -3281,12 +3287,14 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "combined-stream": { "version": "1.0.5", "bundled": true, "dev": true, + "optional": true, "requires": { "delayed-stream": "1.0.0" } @@ -3294,22 +3302,26 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "cryptiles": { "version": "2.0.5", "bundled": true, "dev": true, + "optional": true, "requires": { "boom": "2.10.1" } @@ -3349,7 +3361,8 @@ "delayed-stream": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "delegates": { "version": "1.0.0", @@ -3381,7 +3394,8 @@ "extsprintf": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "forever-agent": { "version": "0.6.1", @@ -3403,12 +3417,14 @@ "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "fstream": { "version": "1.0.11", "bundled": true, "dev": true, + "optional": true, "requires": { "graceful-fs": "4.1.11", "inherits": "2.0.3", @@ -3464,6 +3480,7 @@ "version": "7.1.2", "bundled": true, "dev": true, + "optional": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -3476,7 +3493,8 @@ "graceful-fs": { "version": "4.1.11", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "har-schema": { "version": "1.0.5", @@ -3504,6 +3522,7 @@ "version": "3.1.3", "bundled": true, "dev": true, + "optional": true, "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -3514,7 +3533,8 @@ "hoek": { "version": "2.16.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "http-signature": { "version": "1.1.1", @@ -3531,6 +3551,7 @@ "version": "1.0.6", "bundled": true, "dev": true, + "optional": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -3539,7 +3560,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.4", @@ -3551,6 +3573,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "1.0.1" } @@ -3564,7 +3587,8 @@ "isarray": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "isstream": { "version": "0.1.2", @@ -3637,12 +3661,14 @@ "mime-db": { "version": "1.27.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "mime-types": { "version": "2.1.15", "bundled": true, "dev": true, + "optional": true, "requires": { "mime-db": "1.27.0" } @@ -3651,6 +3677,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "1.1.7" } @@ -3658,12 +3685,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3718,7 +3747,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "oauth-sign": { "version": "0.8.2", @@ -3736,6 +3766,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1.0.2" } @@ -3765,7 +3796,8 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "performance-now": { "version": "0.2.0", @@ -3776,7 +3808,8 @@ "process-nextick-args": { "version": "1.0.7", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "punycode": { "version": "1.4.1", @@ -3814,6 +3847,7 @@ "version": "2.2.9", "bundled": true, "dev": true, + "optional": true, "requires": { "buffer-shims": "1.0.0", "core-util-is": "1.0.2", @@ -3858,6 +3892,7 @@ "version": "2.6.1", "bundled": true, "dev": true, + "optional": true, "requires": { "glob": "7.1.2" } @@ -3865,7 +3900,8 @@ "safe-buffer": { "version": "5.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "semver": { "version": "5.3.0", @@ -3889,6 +3925,7 @@ "version": "1.0.9", "bundled": true, "dev": true, + "optional": true, "requires": { "hoek": "2.16.3" } @@ -3922,6 +3959,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -3932,6 +3970,7 @@ "version": "1.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "5.0.1" } @@ -3946,6 +3985,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "2.1.1" } @@ -3960,6 +4000,7 @@ "version": "2.2.1", "bundled": true, "dev": true, + "optional": true, "requires": { "block-stream": "0.0.9", "fstream": "1.0.11", @@ -4015,7 +4056,8 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "uuid": { "version": "3.0.1", @@ -4044,7 +4086,8 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4054,10 +4097,10 @@ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "function-bind": { @@ -4078,14 +4121,14 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "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" } }, "gaze": { @@ -4094,7 +4137,7 @@ "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", "dev": true, "requires": { - "globule": "1.2.0" + "globule": "^1.0.0" } }, "get-caller-file": { @@ -4121,7 +4164,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -4130,12 +4173,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -4144,8 +4187,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -4154,7 +4197,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "globals": { @@ -4169,11 +4212,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "globule": { @@ -4182,9 +4225,9 @@ "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.4", - "minimatch": "3.0.4" + "glob": "~7.1.1", + "lodash": "~4.17.4", + "minimatch": "~3.0.2" } }, "graceful-fs": { @@ -4211,8 +4254,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.3.0", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has": { @@ -4221,7 +4264,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -4230,7 +4273,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -4251,7 +4294,7 @@ "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "hash.js": { @@ -4260,8 +4303,8 @@ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "hawk": { @@ -4270,10 +4313,10 @@ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "he": { @@ -4288,9 +4331,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -4305,8 +4348,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "hosted-git-info": { @@ -4321,10 +4364,10 @@ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { - "inherits": "2.0.3", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "wbuf": "1.7.2" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, "html-comment-regex": { @@ -4345,14 +4388,14 @@ "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", "dev": true, "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.9", - "commander": "2.12.1", - "he": "1.1.1", - "ncname": "1.0.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.2.0" + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.12.x", + "he": "1.1.x", + "ncname": "1.0.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.2.x" }, "dependencies": { "source-map": { @@ -4367,8 +4410,8 @@ "integrity": "sha512-L98DlTshoPGnZGF8pr3MoE+CCo6n9joktHNHMPkckeBV8xTVc4CWtC0kGGhQsIvnX2Ug4nXFTAeE7SpTrPX2tg==", "dev": true, "requires": { - "commander": "2.12.1", - "source-map": "0.6.1" + "commander": "~2.12.1", + "source-map": "~0.6.1" } } } @@ -4379,12 +4422,12 @@ "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", "dev": true, "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.7", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "pretty-error": "2.1.1", - "toposort": "1.0.6" + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" }, "dependencies": { "loader-utils": { @@ -4393,10 +4436,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } @@ -4407,10 +4450,10 @@ "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" }, "dependencies": { "domutils": { @@ -4419,7 +4462,7 @@ "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "isarray": { @@ -4434,10 +4477,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -4463,7 +4506,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.3.1" + "statuses": ">= 1.3.1 < 2" }, "dependencies": { "setprototypeof": { @@ -4486,8 +4529,8 @@ "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", "dev": true, "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" } }, "http-proxy-middleware": { @@ -4496,10 +4539,10 @@ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "dev": true, "requires": { - "http-proxy": "1.16.2", - "is-glob": "3.1.0", - "lodash": "4.17.4", - "micromatch": "2.3.11" + "http-proxy": "^1.16.2", + "is-glob": "^3.1.0", + "lodash": "^4.17.2", + "micromatch": "^2.3.11" }, "dependencies": { "is-extglob": { @@ -4514,7 +4557,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -4525,9 +4568,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -4553,7 +4596,7 @@ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "dev": true, "requires": { - "postcss": "6.0.14" + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -4562,7 +4605,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4571,9 +4614,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "postcss": { @@ -4582,9 +4625,9 @@ "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "4.5.0" + "chalk": "^2.3.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" } }, "source-map": { @@ -4599,7 +4642,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -4622,8 +4665,8 @@ "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", "dev": true, "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" } }, "imurmurhash": { @@ -4644,7 +4687,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexes-of": { @@ -4665,8 +4708,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -4681,20 +4724,20 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -4709,7 +4752,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4718,9 +4761,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "is-fullwidth-code-point": { @@ -4735,8 +4778,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -4745,7 +4788,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -4754,7 +4797,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -4765,7 +4808,7 @@ "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "dev": true, "requires": { - "meow": "3.7.0" + "meow": "^3.3.0" } }, "interpret": { @@ -4780,7 +4823,7 @@ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -4819,7 +4862,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.10.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -4834,7 +4877,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { @@ -4861,7 +4904,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -4882,7 +4925,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -4891,7 +4934,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -4900,7 +4943,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-number": { @@ -4909,7 +4952,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-path-cwd": { @@ -4924,7 +4967,7 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "1.0.0" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -4933,7 +4976,7 @@ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-obj": { @@ -4948,7 +4991,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -4983,7 +5026,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-resolvable": { @@ -4992,7 +5035,7 @@ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "tryit": "1.0.3" + "tryit": "^1.0.1" } }, "is-stream": { @@ -5006,7 +5049,7 @@ "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "dev": true, "requires": { - "html-comment-regex": "1.1.1" + "html-comment-regex": "^1.1.0" } }, "is-symbol": { @@ -5059,8 +5102,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" } }, "isstream": { @@ -5086,8 +5129,8 @@ "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, "jsbn": { @@ -5163,7 +5206,7 @@ "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "dev": true, "requires": { - "array-includes": "3.0.3" + "array-includes": "^3.0.3" } }, "killable": { @@ -5178,7 +5221,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "lazy-cache": { @@ -5193,7 +5236,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "levn": { @@ -5202,8 +5245,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "load-json-file": { @@ -5212,11 +5255,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "loader-runner": { @@ -5231,9 +5274,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "locate-path": { @@ -5242,8 +5285,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -5319,7 +5362,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "loud-rejection": { @@ -5328,8 +5371,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lower-case": { @@ -5344,8 +5387,8 @@ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "macaddress": { @@ -5360,7 +5403,7 @@ "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -5389,8 +5432,8 @@ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" }, "dependencies": { "hash-base": { @@ -5399,8 +5442,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } } } @@ -5417,7 +5460,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "memory-fs": { @@ -5426,8 +5469,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "meow": { @@ -5436,16 +5479,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" } }, "merge-descriptors": { @@ -5466,19 +5509,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "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" } }, "miller-rabin": { @@ -5487,8 +5530,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { @@ -5509,7 +5552,7 @@ "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "dev": true, "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.30.0" } }, "mimic-fn": { @@ -5536,7 +5579,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -5551,8 +5594,8 @@ "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", "dev": true, "requires": { - "for-in": "0.1.8", - "is-extendable": "0.1.1" + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" }, "dependencies": { "for-in": { @@ -5592,8 +5635,8 @@ "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", "dev": true, "requires": { - "dns-packet": "1.2.2", - "thunky": "0.1.0" + "dns-packet": "^1.0.1", + "thunky": "^0.1.0" } }, "multicast-dns-service-types": { @@ -5626,7 +5669,7 @@ "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", "dev": true, "requires": { - "xml-char-classes": "1.0.0" + "xml-char-classes": "^1.0.0" } }, "negotiator": { @@ -5641,7 +5684,7 @@ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "node-fetch": { @@ -5649,8 +5692,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "node-forge": { @@ -5665,19 +5708,19 @@ "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", "dev": true, "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.4", - "request": "2.83.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.0" + "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 || 4", + "osenv": "0", + "request": "2", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" }, "dependencies": { "semver": { @@ -5694,28 +5737,28 @@ "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", - "events": "1.1.1", + "assert": "^1.1.1", + "browserify-zlib": "^0.1.4", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", "https-browserify": "0.0.1", - "os-browserify": "0.2.1", + "os-browserify": "^0.2.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.4", + "process": "^0.11.0", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.0.5", + "stream-browserify": "^2.0.1", + "stream-http": "^2.3.1", + "string_decoder": "^0.10.25", + "timers-browserify": "^2.0.2", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -5733,24 +5776,24 @@ "integrity": "sha512-0zQQ7tjEK5W8RfW9LiQrkzfo7uLZ0QtZGV69rdKn5cFzdweHLJ14lR6xLPvI6UimkXMO8m0qDsXwUCNdnqV3sA==", "dev": true, "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.2", - "get-stdin": "4.0.1", - "glob": "7.1.2", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.0", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.7.0", - "node-gyp": "3.6.2", - "npmlog": "4.1.2", - "request": "2.83.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.0" + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.3.2", + "node-gyp": "^3.3.1", + "npmlog": "^4.0.0", + "request": "^2.79.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0" } }, "nopt": { @@ -5759,7 +5802,7 @@ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "normalize-package-data": { @@ -5768,10 +5811,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "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": { @@ -5780,7 +5823,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { @@ -5795,10 +5838,10 @@ "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } }, "npm-run-path": { @@ -5807,7 +5850,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npmlog": { @@ -5816,10 +5859,10 @@ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "nth-check": { @@ -5828,7 +5871,7 @@ "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "dev": true, "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "num2fraction": { @@ -5866,8 +5909,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "obuf": { @@ -5897,7 +5940,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -5906,7 +5949,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "opn": { @@ -5915,7 +5958,7 @@ "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", "dev": true, "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "optionator": { @@ -5924,12 +5967,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "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" }, "dependencies": { "wordwrap": { @@ -5946,7 +5989,7 @@ "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", "dev": true, "requires": { - "url-parse": "1.0.5" + "url-parse": "1.0.x" }, "dependencies": { "url-parse": { @@ -5955,8 +5998,8 @@ "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", "dev": true, "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" + "querystringify": "0.0.x", + "requires-port": "1.0.x" } } } @@ -5979,7 +6022,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -5994,8 +6037,8 @@ "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "p-finally": { @@ -6016,7 +6059,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -6037,7 +6080,7 @@ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parse-asn1": { @@ -6046,11 +6089,11 @@ "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", "dev": true, "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-glob": { @@ -6059,10 +6102,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -6071,7 +6114,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parseurl": { @@ -6092,7 +6135,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -6125,9 +6168,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pbkdf2": { @@ -6136,11 +6179,11 @@ "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "dev": true, "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "performance-now": { @@ -6167,7 +6210,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -6176,7 +6219,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" }, "dependencies": { "find-up": { @@ -6185,7 +6228,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -6202,9 +6245,9 @@ "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "dev": true, "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "async": { @@ -6221,10 +6264,10 @@ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" }, "dependencies": { "has-flag": { @@ -6245,7 +6288,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -6256,9 +6299,9 @@ "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" } }, "postcss-colormin": { @@ -6267,9 +6310,9 @@ "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "dev": true, "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" } }, "postcss-convert-values": { @@ -6278,8 +6321,8 @@ "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" } }, "postcss-discard-comments": { @@ -6288,7 +6331,7 @@ "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" } }, "postcss-discard-duplicates": { @@ -6297,7 +6340,7 @@ "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-discard-empty": { @@ -6306,7 +6349,7 @@ "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" } }, "postcss-discard-overridden": { @@ -6315,7 +6358,7 @@ "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.16" } }, "postcss-discard-unused": { @@ -6324,8 +6367,8 @@ "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "dev": true, "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" + "postcss": "^5.0.14", + "uniqs": "^2.0.0" } }, "postcss-filter-plugins": { @@ -6334,8 +6377,8 @@ "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "dev": true, "requires": { - "postcss": "5.2.18", - "uniqid": "4.1.1" + "postcss": "^5.0.4", + "uniqid": "^4.0.0" } }, "postcss-merge-idents": { @@ -6344,9 +6387,9 @@ "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "dev": true, "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" } }, "postcss-merge-longhand": { @@ -6355,7 +6398,7 @@ "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-merge-rules": { @@ -6364,11 +6407,11 @@ "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.1" + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" }, "dependencies": { "browserslist": { @@ -6377,8 +6420,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000764", - "electron-to-chromium": "1.3.27" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } } } @@ -6395,9 +6438,9 @@ "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "dev": true, "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" } }, "postcss-minify-gradients": { @@ -6406,8 +6449,8 @@ "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" } }, "postcss-minify-params": { @@ -6416,10 +6459,10 @@ "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" } }, "postcss-minify-selectors": { @@ -6428,10 +6471,10 @@ "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" } }, "postcss-modules-extract-imports": { @@ -6440,7 +6483,7 @@ "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "dev": true, "requires": { - "postcss": "6.0.14" + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -6449,7 +6492,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -6458,9 +6501,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "postcss": { @@ -6469,9 +6512,9 @@ "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "4.5.0" + "chalk": "^2.3.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" } }, "source-map": { @@ -6486,7 +6529,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -6497,8 +6540,8 @@ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.14" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -6507,7 +6550,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -6516,9 +6559,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "postcss": { @@ -6527,9 +6570,9 @@ "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "4.5.0" + "chalk": "^2.3.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" } }, "source-map": { @@ -6544,7 +6587,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -6555,8 +6598,8 @@ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.14" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -6565,7 +6608,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -6574,9 +6617,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "postcss": { @@ -6585,9 +6628,9 @@ "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "4.5.0" + "chalk": "^2.3.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" } }, "source-map": { @@ -6602,7 +6645,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -6613,8 +6656,8 @@ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "dev": true, "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.14" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -6623,7 +6666,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -6632,9 +6675,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "postcss": { @@ -6643,9 +6686,9 @@ "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "4.5.0" + "chalk": "^2.3.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" } }, "source-map": { @@ -6660,7 +6703,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -6671,7 +6714,7 @@ "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.5" } }, "postcss-normalize-url": { @@ -6680,10 +6723,10 @@ "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "dev": true, "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" } }, "postcss-ordered-values": { @@ -6692,8 +6735,8 @@ "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" } }, "postcss-reduce-idents": { @@ -6702,8 +6745,8 @@ "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" } }, "postcss-reduce-initial": { @@ -6712,7 +6755,7 @@ "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-reduce-transforms": { @@ -6721,9 +6764,9 @@ "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "dev": true, "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" } }, "postcss-safe-parser": { @@ -6732,7 +6775,7 @@ "integrity": "sha1-Q70MjITV99hHTeglxpnk2ryscqg=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.18" } }, "postcss-selector-parser": { @@ -6741,9 +6784,9 @@ "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "dev": true, "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { @@ -6752,10 +6795,10 @@ "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "dev": true, "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" } }, "postcss-unique-selectors": { @@ -6764,9 +6807,9 @@ "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" } }, "postcss-value-parser": { @@ -6781,9 +6824,9 @@ "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "dev": true, "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" } }, "prelude-ls": { @@ -6810,8 +6853,8 @@ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" + "renderkid": "^2.0.1", + "utila": "~0.4" } }, "private": { @@ -6843,7 +6886,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "prop-types": { @@ -6851,9 +6894,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "proxy-addr": { @@ -6862,7 +6905,7 @@ "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", "dev": true, "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.5.2" } }, @@ -6884,11 +6927,11 @@ "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { @@ -6915,8 +6958,8 @@ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -6943,8 +6986,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -6953,7 +6996,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -6962,7 +7005,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6973,7 +7016,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6984,7 +7027,7 @@ "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -6993,8 +7036,8 @@ "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", "dev": true, "requires": { - "randombytes": "2.0.5", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { @@ -7020,10 +7063,10 @@ "resolved": "https://registry.npmjs.org/react/-/react-16.1.1.tgz", "integrity": "sha512-FQfiFfk2z2Fk87OngNJHT05KyC9DOVn8LPeB7ZX+9u5+yU1JK6o5ozRlU3PeOMr0IFkWNvgn9jU8/IhRxR1F0g==", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" } }, "react-dom": { @@ -7031,10 +7074,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.1.1.tgz", "integrity": "sha512-q06jiwST8SEPAMIEkAsu7BgynEZtqF87VrTc70XsW7nxVhWEu2Y4MF5UfxxHQO/mNtQHQWP0YcFxmwm9oMrMaQ==", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" } }, "read-pkg": { @@ -7043,9 +7086,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -7054,8 +7097,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -7064,13 +7107,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -7079,10 +7122,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "redent": { @@ -7091,8 +7134,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "reduce-css-calc": { @@ -7101,9 +7144,9 @@ "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "dev": true, "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" }, "dependencies": { "balanced-match": { @@ -7120,7 +7163,7 @@ "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "dev": true, "requires": { - "balanced-match": "0.4.2" + "balanced-match": "^0.4.2" }, "dependencies": { "balanced-match": { @@ -7149,9 +7192,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -7160,7 +7203,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regexpu-core": { @@ -7169,9 +7212,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -7186,7 +7229,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } }, "relateurl": { @@ -7207,11 +7250,11 @@ "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "dev": true, "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" }, "dependencies": { "utila": { @@ -7240,7 +7283,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -7249,28 +7292,28 @@ "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "require-directory": { @@ -7291,8 +7334,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" }, "dependencies": { "resolve-from": { @@ -7315,7 +7358,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "resolve-from": { @@ -7330,8 +7373,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "right-align": { @@ -7340,7 +7383,7 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -7349,7 +7392,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "ripemd160": { @@ -7358,8 +7401,8 @@ "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "dev": true, "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "hash-base": "^2.0.0", + "inherits": "^2.0.1" } }, "run-async": { @@ -7368,7 +7411,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rx-lite": { @@ -7383,7 +7426,7 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { @@ -7398,10 +7441,10 @@ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.4", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" } }, "sass-loader": { @@ -7410,11 +7453,11 @@ "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", "dev": true, "requires": { - "async": "2.6.0", - "clone-deep": "0.3.0", - "loader-utils": "1.1.0", - "lodash.tail": "4.1.1", - "pify": "3.0.0" + "async": "^2.1.5", + "clone-deep": "^0.3.0", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -7437,7 +7480,7 @@ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "5.3.0" + "ajv": "^5.0.0" } }, "scss-tokenizer": { @@ -7446,8 +7489,8 @@ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { - "js-base64": "2.3.2", - "source-map": "0.4.4" + "js-base64": "^2.1.8", + "source-map": "^0.4.2" } }, "select-hose": { @@ -7478,18 +7521,18 @@ "dev": true, "requires": { "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.1", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.2", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" } }, "serve-index": { @@ -7498,13 +7541,13 @@ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, "requires": { - "accepts": "1.3.4", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.2", - "mime-types": "2.1.17", - "parseurl": "1.3.2" + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" } }, "serve-static": { @@ -7513,9 +7556,9 @@ "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", "dev": true, "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.1" } }, @@ -7548,8 +7591,8 @@ "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shallow-clone": { @@ -7558,10 +7601,10 @@ "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", "dev": true, "requires": { - "is-extendable": "0.1.1", - "kind-of": "2.0.1", - "lazy-cache": "0.2.7", - "mixin-object": "2.0.1" + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" }, "dependencies": { "kind-of": { @@ -7570,7 +7613,7 @@ "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.0.2" } }, "lazy-cache": { @@ -7587,7 +7630,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -7614,7 +7657,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -7631,7 +7674,7 @@ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "sockjs": { @@ -7640,8 +7683,8 @@ "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", "dev": true, "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" + "faye-websocket": "^0.10.0", + "uuid": "^2.0.2" }, "dependencies": { "uuid": { @@ -7658,12 +7701,12 @@ "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "dev": true, "requires": { - "debug": "2.6.9", + "debug": "^2.6.6", "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.2.0" + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" }, "dependencies": { "faye-websocket": { @@ -7672,7 +7715,7 @@ "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "dev": true, "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } } } @@ -7683,7 +7726,7 @@ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -7698,7 +7741,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } }, "source-map-support": { @@ -7707,7 +7750,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" }, "dependencies": { "source-map": { @@ -7724,7 +7767,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -7745,12 +7788,12 @@ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "dev": true, "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", - "select-hose": "2.0.0", - "spdy-transport": "2.0.20" + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" } }, "spdy-transport": { @@ -7759,13 +7802,13 @@ "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", "dev": true, "requires": { - "debug": "2.6.9", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "safe-buffer": "5.1.1", - "wbuf": "1.7.2" + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" } }, "sprintf-js": { @@ -7780,14 +7823,14 @@ "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "statuses": { @@ -7802,7 +7845,7 @@ "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", "dev": true, "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.1" } }, "stream-browserify": { @@ -7811,8 +7854,8 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { @@ -7821,11 +7864,11 @@ "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "strict-uri-encode": { @@ -7840,9 +7883,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -7851,7 +7894,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -7866,7 +7909,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -7875,7 +7918,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -7890,7 +7933,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -7905,8 +7948,8 @@ "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" } }, "supports-color": { @@ -7921,13 +7964,13 @@ "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "dev": true, "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" } }, "table": { @@ -7936,12 +7979,12 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "5.3.0", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ansi-regex": { @@ -7956,7 +7999,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -7965,9 +8008,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "is-fullwidth-code-point": { @@ -7982,8 +8025,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -7992,7 +8035,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -8001,7 +8044,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -8018,9 +8061,9 @@ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "text-table": { @@ -8053,7 +8096,7 @@ "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmp": { @@ -8062,7 +8105,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-arraybuffer": { @@ -8089,7 +8132,7 @@ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "trim-newlines": { @@ -8122,7 +8165,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -8138,7 +8181,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-is": { @@ -8148,7 +8191,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.17" + "mime-types": "~2.1.15" } }, "typedarray": { @@ -8168,9 +8211,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "camelcase": { @@ -8185,8 +8228,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" } }, @@ -8202,9 +8245,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -8223,9 +8266,9 @@ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.0.2" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" }, "dependencies": { "source-map": { @@ -8248,7 +8291,7 @@ "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", "dev": true, "requires": { - "macaddress": "0.2.8" + "macaddress": "^0.2.8" } }, "uniqs": { @@ -8293,8 +8336,8 @@ "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", "dev": true, "requires": { - "querystringify": "1.0.0", - "requires-port": "1.0.0" + "querystringify": "~1.0.0", + "requires-port": "~1.0.0" }, "dependencies": { "querystringify": { @@ -8352,8 +8395,8 @@ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "vary": { @@ -8374,9 +8417,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "vm-browserify": { @@ -8394,9 +8437,9 @@ "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", "dev": true, "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" + "async": "^2.1.2", + "chokidar": "^1.7.0", + "graceful-fs": "^4.1.2" } }, "wbuf": { @@ -8405,7 +8448,7 @@ "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", "dev": true, "requires": { - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "^1.0.0" } }, "webpack": { @@ -8414,28 +8457,28 @@ "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.3.0", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.0.4", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.0.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.0.2", - "yargs": "8.0.2" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^5.1.5", + "ajv-keywords": "^2.0.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" }, "dependencies": { "ansi-regex": { @@ -8456,7 +8499,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "is-fullwidth-code-point": { @@ -8471,10 +8514,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "os-locale": { @@ -8483,9 +8526,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "path-type": { @@ -8494,7 +8537,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "read-pkg": { @@ -8503,9 +8546,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -8514,8 +8557,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "source-map": { @@ -8530,8 +8573,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -8540,7 +8583,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -8555,7 +8598,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "which-module": { @@ -8570,19 +8613,19 @@ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" } }, "yargs-parser": { @@ -8591,7 +8634,7 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -8602,11 +8645,11 @@ "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", "dev": true, "requires": { - "memory-fs": "0.4.1", - "mime": "1.4.1", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" + "memory-fs": "~0.4.1", + "mime": "^1.3.4", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" } }, "webpack-dev-server": { @@ -8616,32 +8659,32 @@ "dev": true, "requires": { "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "1.7.0", - "compression": "1.7.1", - "connect-history-api-fallback": "1.5.0", - "debug": "3.1.0", - "del": "3.0.0", - "express": "4.16.2", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "import-local": "0.1.1", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^1.6.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.13.3", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.17.4", + "import-local": "^0.1.1", "internal-ip": "1.2.0", - "ip": "1.1.5", - "killable": "1.0.0", - "loglevel": "1.6.0", - "opn": "5.1.0", - "portfinder": "1.0.13", - "selfsigned": "1.10.1", - "serve-index": "1.9.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", "sockjs": "0.3.18", "sockjs-client": "1.1.4", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "4.5.0", - "webpack-dev-middleware": "1.12.0", - "yargs": "6.6.0" + "spdy": "^3.4.1", + "strip-ansi": "^3.0.1", + "supports-color": "^4.2.1", + "webpack-dev-middleware": "^1.11.0", + "yargs": "^6.6.0" }, "dependencies": { "camelcase": { @@ -8665,7 +8708,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "yargs": { @@ -8674,19 +8717,19 @@ "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "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.1" + "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-parser": { @@ -8695,7 +8738,7 @@ "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" } } } @@ -8706,8 +8749,8 @@ "integrity": "sha512-Y7UddMCv6dGjy81nBv6nuQeFFIt5aalHm7uyDsAsW86nZwfOVPGRr3XMjEQLaT+WKo8rlzhC9qtbJvYKLtAwaw==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -8724,8 +8767,8 @@ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "http-parser-js": "0.4.9", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { @@ -8751,7 +8794,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -8766,7 +8809,7 @@ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "window-size": { @@ -8787,8 +8830,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -8803,7 +8846,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "xml-char-classes": { @@ -8836,19 +8879,19 @@ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "dev": true, "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "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": "5.0.0" + "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": "^5.0.0" }, "dependencies": { "camelcase": { @@ -8865,7 +8908,7 @@ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { From 64af19571c711ca5a0f9730cb45b789f4e5e2996 Mon Sep 17 00:00:00 2001 From: Lod Date: Mon, 4 Apr 2022 09:33:10 +0200 Subject: [PATCH 2/2] Dockerfile --- .manala.yaml | 7 +- .manala/Makefile | 4 +- .manala/README.md | 114 ++++++++++++++++-- .../inventories/system.development.yaml | 2 - .manala/ansible/inventories/system.yaml | 8 +- .manala/ansible/roles/release/tasks/main.yml | 2 +- .manala/ansible/system.yaml | 26 +--- .manala/ansible/templates/php/xdebug.ini.j2 | 2 +- .manala/docker/Dockerfile | 29 ++--- .manala/docker/compose.yaml | 7 +- .manala/docker/compose/development.yaml | 4 +- .manala/docker/compose/integration.yaml | 2 +- .manala/docker/compose/mutagen.yaml | 2 - .manala/docker/compose/symfony.yaml | 15 +++ .manala/docker/make.mk | 10 +- .manala/github/system/action.yaml | 11 +- .manala/make/help.mk | 2 +- Dockerfile | 105 ++++++++++++++++ Makefile | 3 + README.md | 4 + 20 files changed, 274 insertions(+), 85 deletions(-) create mode 100644 .manala/docker/compose/symfony.yaml create mode 100644 Dockerfile diff --git a/.manala.yaml b/.manala.yaml index 3458539..0d9f8d8 100644 --- a/.manala.yaml +++ b/.manala.yaml @@ -19,7 +19,7 @@ project: ########## system: - version: 10 + version: 11 nginx: configs: - template: nginx/gzip.j2 @@ -37,6 +37,11 @@ system: version: 8 php: version: 8.1 + docker: + services: + app: + ports: + - 12600:8000 # ssh: # client: diff --git a/.manala/Makefile b/.manala/Makefile index 206c05b..afdce18 100644 --- a/.manala/Makefile +++ b/.manala/Makefile @@ -9,10 +9,8 @@ _CURRENT_DIR = $(patsubst ./%,%,.$(patsubst $(realpath $(CURDIR)/$(_DIR))%,%,$(C # Project # ########### -PROJECT_NAME = elao-tricot - define project_host -$(PROJECT_NAME).ela.ooo$(if $(1),:126$(shell printf "%02d" $(1))) +elao-tricot.ela.ooo$(if $(1),:126$(shell printf "%02d" $(1))) endef -include $(_DIR)/.manala/make/text.mk diff --git a/.manala/README.md b/.manala/README.md index c889534..62d0d41 100644 --- a/.manala/README.md +++ b/.manala/README.md @@ -10,9 +10,14 @@ tableOfContent: 3 MacOS * Docker Desktop 4.3.2+ -`brew install docker` +(`brew install docker`) * Mutagen Compose 0.13.0+ -`brew install mutagen-io/mutagen/mutagen-compose` +(`brew install mutagen-io/mutagen/mutagen-compose`) + +Linux + +* Docker 20.10.14+ +(see [documentation](https://docs.docker.com/engine/install/)) ## Overview @@ -96,7 +101,7 @@ Custom docker compose command: make docker [COMMAND] ``` -:warning: separate hyphen based arguments or flags with `--` to avoid shell miss-interpretation: +⚠︎ separate hyphen based arguments or flags with `--` to avoid shell miss-interpretation: ```shell make docker logs -- --follow ``` @@ -372,12 +377,48 @@ integration: ### Github Actions -The recipes generates a `Dockerfile` and a `docker-compose.yaml` file that can -be used to provide a fully-fledged environnement according to your project needs. +The recipes can generate Github actions files you can use in your workflows. +Complete the `integration.github.jobs` according to your need, and consult the `.manala/github/integration/README.md` to +learn how you can write your own workflows using these actions. -The [Elao/manala-ci-action](https://github.com/Elao/manala-ci-action) rely on -this to allow you running any CLI command in this environnement, -using Github Action workflows. +```yaml +############### +# Integration # +############### + +integration: + github: + jobs: + # Lint + lint: + tasks: + - shell: make install@integration + - shell: make build@integration + - shell: make lint.twig@integration + - shell: make lint.yaml@integration + - shell: make lint.phpstan@integration + - shell: make lint.php-cs-fixer@integration + - shell: make lint.eslint@integration + # Security + security: + tasks: + - shell: make security.symfony@integration + - shell: make security.npm@integration + # Test + test: + tasks: + - label: Install + shell: |- + make install.php@integration + # Fake manifest.json + mkdir -p public/build/ + echo {} > public/build/manifest.json + # Install phpunit + vendor/bin/simple-phpunit install + - shell: make test.phpunit@integration + artifacts: + - var/log/test.log +``` ### Common integration tasks @@ -550,6 +591,8 @@ deliveries: deploy_post_tasks: - shell: sudo /bin/systemctl reload php8.1-fpm #- shell: sudo /bin/systemctl restart supervisor + # GitHub + github_ssh_key_secret: SSH_DEPLOY_KEY_PRODUCTION - << : *delivery tier: staging @@ -561,8 +604,28 @@ deliveries: - ssh_host: foo.bar.elao.ninja.local deploy_tasks: - shell: make warmup@staging + # GitHub + github_ssh_key_secret: SSH_DEPLOY_KEY_STAGING +``` + +### Github Actions + +Deliveries can be triggered through Github Actions as well. +Consult the `.manala/github/deliveries/README.md` to learn how to write your own release & deploy workflows. + +!!! Note + The `github_ssh_key_secret` key must be set on each delivery, with the Github Secret key that holds the + SSH private key used to access the release repository and the deployment server. + +Additionally, some `trigger.*` Make targets are generated to trigger Github workflows from your terminal. +It uses the [Github CLI tool](https://github.com/cli/cli) to make API calls, so be sure to execute: + +```shell +gh login auth ``` +at least once on your machine, if not already. + ## Makefile Makefile targets that are supposed to be runned via docker must be prefixed. @@ -638,7 +701,7 @@ lint.php-cs-fixer: This recipe contains some try helpers such as the [`try_finally`](./.manala/make/try.mk) function. -This function is useful for example to run `phpunit` tests needing a started symfony server, and to stop this server regardless of the tests retur code. +This function is useful for example to run `phpunit` tests needing a started symfony server, and to stop this server regardless of the tests return code. Usage (in your `Makefile`): @@ -743,6 +806,39 @@ In order for https to work properly, you must: 3. For firefox only, browse to `about:config` and ensure `security.enterprise_roots.enabled` value is set to true +## Extras + +Check the following sections for extra gems included with this recipe. + +### Symfony + +#### IDE configuration + +As of [Symfony >= 6.1](https://symfony.com/blog/new-in-symfony-6-1-profiler-improvements-part-2#better-code-editor-selection), +a `SYMFONY_IDE` env var allows you to [configure your IDE](https://symfony.com/doc/current/reference/configuration/framework.html#ide) +once on your machine: + +PhpStorm: +```shell +printf "SYMFONY_IDE=\"phpstorm://open?file=%%f&line=%%l\"" >> ~/.zshrc +``` + +Sublime: +```shell +printf "SYMFONY_IDE=\"subl://open?url=file://%%f&line=%%l\"" >> ~/.zshrc +``` + +However, since the paths in the container differs from the ones on your machine, you need an extra mapping per project. +Hopefully, the Manala recipe will detect your host `SYMFONY_IDE` env var and forwards it to the container automatically +with the proper paths mapping. + +As of Symfony < 6.1, you can configure the same behavior with: + +```yaml +framework: + ide: '%env(string:default::SYMFONY_IDE)%' +``` + ## Caveats - MySQL 5.7 docker images are not available on arm64, that's why amd64 architecture is forced. Expect rare speed and stability issues. diff --git a/.manala/ansible/inventories/system.development.yaml b/.manala/ansible/inventories/system.development.yaml index 72124d8..fb72178 100644 --- a/.manala/ansible/inventories/system.development.yaml +++ b/.manala/ansible/inventories/system.development.yaml @@ -21,8 +21,6 @@ system: system_cron: false # Elasticsearch system_elasticsearch: false - # Environment - system_environment: true # Files system_files: true # Git diff --git a/.manala/ansible/inventories/system.yaml b/.manala/ansible/inventories/system.yaml index 592d11d..12681b6 100644 --- a/.manala/ansible/inventories/system.yaml +++ b/.manala/ansible/inventories/system.yaml @@ -4,7 +4,6 @@ system: # Ansible ansible_connection: local - ansible_python_interpreter: /usr/bin/python3 # Variables apt_architecture: "{{ ansible_architecture | manala.roles.apt_architecture }}" @@ -34,9 +33,6 @@ system: system_elasticsearch: false system_elasticsearch_version: null system_elasticsearch_plugins: [] - # Environment - system_environment: false - system_env: {} # Files system_files: false system_files_attributes: [] @@ -63,7 +59,6 @@ system: system_mysql_version: null system_mysql_install_packages: - default-mysql-client - - libmariadb3 # Network system_network: false # Nginx @@ -83,7 +78,7 @@ system: system_ngrok: false # NodeJS system_nodejs: false - system_nodejs_version: 8 + system_nodejs_version: 10 system_nodejs_npm: "{{ system_nodejs }}" system_nodejs_packages: [] system_nodejs_yarn: false @@ -99,6 +94,7 @@ system: - fpm system_php_extensions: [] system_php_configs: [] + system_php_env: {} # Redis system_redis: false system_redis_version: null diff --git a/.manala/ansible/roles/release/tasks/main.yml b/.manala/ansible/roles/release/tasks/main.yml index 595a4e6..3ba5cd9 100644 --- a/.manala/ansible/roles/release/tasks/main.yml +++ b/.manala/ansible/roles/release/tasks/main.yml @@ -66,7 +66,7 @@ - name: Remove ansible.builtin.shell: > - rm --recursive --force {{ [release_dir, item]|join('/') }} + rm --recursive --force --verbose {{ [release_dir, item]|join('/') }} args: warn: false tags: log_failed diff --git a/.manala/ansible/system.yaml b/.manala/ansible/system.yaml index ba3631d..6f9e9e9 100644 --- a/.manala/ansible/system.yaml +++ b/.manala/ansible/system.yaml @@ -111,21 +111,6 @@ user: "{{ system_app_user }}" manala_cron_files: "{{ system_cron_files }}" - ############### - # Environment # - ############### - - manala_environment_files: - - zsh - - manala_environment_variables: "{{ {}|combine( - system_env, - system_php_composer|ternary( - {'COMPOSER_MEMORY_LIMIT': -1,}, - {} - ) - ) }}" - ######### # Files # ######### @@ -169,7 +154,7 @@ # Gomplate # ############ - manala_gomplate_version: 3.7.0 + manala_gomplate_version: 3.11.1 ############ # InfluxDB # @@ -271,7 +256,9 @@ group: "{{ system_app_group }}" listen: /run/php-fpm.app.sock pm.max_children: 20 - env: "{{ system_env }}" + env: "{{ system_php_env | combine( + {'SYMFONY_IDE': lookup('env', 'SYMFONY_IDE')} if (lookup('env', 'SYMFONY_IDE')) else {}, + ) }}" php_admin_value: error_log: "{{ system_app_log_dir }}/php.error.log" @@ -347,11 +334,6 @@ when: system_zsh tags: [zsh] - - import_role: - name: environment - when: system_environment - tags: [environment, env] - - import_role: name: apt when: system_apt diff --git a/.manala/ansible/templates/php/xdebug.ini.j2 b/.manala/ansible/templates/php/xdebug.ini.j2 index fe828ff..fb7e214 100644 --- a/.manala/ansible/templates/php/xdebug.ini.j2 +++ b/.manala/ansible/templates/php/xdebug.ini.j2 @@ -1,6 +1,6 @@ {%- set config = item.config|default({}) -%} -{%- set host = ansible_env.MANALA_HOST | default('linux') -%} +{%- set host = ansible_env.MANALA_HOST_OS | default('linux') -%} {% if host == 'linux' %} # Linux xdebug.discover_client_host = 1 diff --git a/.manala/docker/Dockerfile b/.manala/docker/Dockerfile index 227a008..baa6c80 100644 --- a/.manala/docker/Dockerfile +++ b/.manala/docker/Dockerfile @@ -7,17 +7,19 @@ ARG MANALA_PROVISION=none # System # ########## -FROM debian:10-slim AS system +FROM debian:11-slim AS system LABEL maintainer="Elao " -ARG MANALA_HOST=linux +ARG MANALA_HOST_OS=linux +ARG MANALA_HOST_PATH ARG MANALA_USER_ID=1000 ARG MANALA_GROUP_ID=1000 # Used for checking we're running inside a container ENV container="docker" -ENV MANALA_HOST=${MANALA_HOST} +ENV MANALA_HOST_OS=${MANALA_HOST_OS} +ENV MANALA_HOST_PATH=${MANALA_HOST_PATH} RUN \ # Disable irrelevants apt-key warnings @@ -33,15 +35,6 @@ RUN \ curl \ make \ socat \ - # Openssl packages are broken on buster/arm64, install them from bullseye - # See: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=989604 - && if [ $(dpkg --print-architecture) = "arm64" ]; then \ - curl -sSL "http://snapshot.debian.org/archive/debian/20210827T161311Z/pool/main/o/openssl/{openssl,libssl1.1}_1.1.1k-1%2Bdeb11u1_arm64.deb" \ - -o /var/cache/apt/archives/#1.deb \ - && dpkg --install \ - /var/cache/apt/archives/openssl.deb \ - /var/cache/apt/archives/libssl1.1.deb ; \ - fi \ # User && addgroup --gid ${MANALA_GROUP_ID} app \ && adduser --disabled-password --gecos "" app --uid ${MANALA_USER_ID} --ingroup app \ @@ -83,12 +76,13 @@ RUN \ # Shutdown on SIGINT && sed -i "s/^\(ca:.*\)/ca:12345:ctrlaltdel:\/sbin\/shutdown -h now/g" /etc/inittab \ # Don't bring networking down right before halting system - && echo "NETDOWN=no" >> /etc/default/halt \ + && sed -i "/^NETDOWN=/s/yes/no/" /etc/default/halt \ # Useless services && insserv --remove \ # rcS / rc2 - mountall-bootclean.sh mountall.sh checkroot-bootclean.sh checkfs.sh checkroot.sh bootlogs hostname.sh \ - hwclock.sh mountdevsubfs.sh mountkernfs.sh \ + bootlogs mountall-bootclean.sh mountall.sh checkfs.sh checkroot-bootclean.sh checkroot.sh hostname.sh \ + hwclock.sh \ + mount-configfs mountdevsubfs.sh mountkernfs.sh \ brightness \ mountnfs-bootclean.sh mountnfs.sh \ urandom \ @@ -174,8 +168,9 @@ FROM init-${MANALA_INIT} AS provision-none # Ansible FROM init-${MANALA_INIT} AS provision-ansible -ARG ANSIBLE_CORE_VERSION=2.11.8 +ARG ANSIBLE_CORE_VERSION=2.11.12 ARG MANALA_PROVISION_LIMIT +ARG SYMFONY_IDE # Locale ENV LANG=C.UTF-8 @@ -187,7 +182,6 @@ RUN \ && export DEBIAN_FRONTEND="noninteractive" \ && apt-get --quiet --yes -o=Dpkg::Use-Pty=0 --no-install-recommends --verbose-versions install \ python3 python3-pip \ - python3-setuptools python3-wheel python3-cryptography \ python3-apt \ && pip3 install ansible-core==${ANSIBLE_CORE_VERSION} \ && mkdir -p /etc/ansible/ \ @@ -196,7 +190,6 @@ RUN \ force_color = True\n\ gather_subset = all,!hardware\n\ display_skipped_hosts = False\n\ -deprecation_warnings = False\n\ retry_files_enabled = False\n\ stdout_callback = yaml\n\ [ssh_connection]\n\ diff --git a/.manala/docker/compose.yaml b/.manala/docker/compose.yaml index 481f617..39bee22 100644 --- a/.manala/docker/compose.yaml +++ b/.manala/docker/compose.yaml @@ -1,4 +1,4 @@ -version: "3.8" +name: elao-tricot services: @@ -13,8 +13,11 @@ services: dockerfile: docker/Dockerfile target: app args: - MANALA_HOST: ${MANALA_HOST:-linux} + MANALA_HOST_OS: ${MANALA_HOST_OS:-linux} + MANALA_HOST_PATH: ${MANALA_HOST_PATH:-} MANALA_USER_ID: ${MANALA_USER_ID:-1000} MANALA_GROUP_ID: ${MANALA_GROUP_ID:-1000} + environment: + COMPOSER_MEMORY_LIMIT: -1 volumes: - ../..:/srv/app diff --git a/.manala/docker/compose/development.yaml b/.manala/docker/compose/development.yaml index 68b8fb3..e684d02 100644 --- a/.manala/docker/compose/development.yaml +++ b/.manala/docker/compose/development.yaml @@ -1,5 +1,3 @@ -version: "3.8" - services: ########### @@ -31,3 +29,5 @@ services: # Nginx - 12680:80 - 12643:443 + # App + - '12600:8000' diff --git a/.manala/docker/compose/integration.yaml b/.manala/docker/compose/integration.yaml index 8d1d85a..4a14cf4 100644 --- a/.manala/docker/compose/integration.yaml +++ b/.manala/docker/compose/integration.yaml @@ -1,4 +1,4 @@ -version: "3.8" +name: app services: diff --git a/.manala/docker/compose/mutagen.yaml b/.manala/docker/compose/mutagen.yaml index 2e83369..f55b819 100644 --- a/.manala/docker/compose/mutagen.yaml +++ b/.manala/docker/compose/mutagen.yaml @@ -1,5 +1,3 @@ -version: "3.8" - volumes: app: diff --git a/.manala/docker/compose/symfony.yaml b/.manala/docker/compose/symfony.yaml new file mode 100644 index 0000000..bbde396 --- /dev/null +++ b/.manala/docker/compose/symfony.yaml @@ -0,0 +1,15 @@ +services: + + ####### + # App # + ####### + + # Forwards the SYMFONY_IDE env var from the host to the container if set + # https://symfony.com/blog/new-in-symfony-6-1-profiler-improvements-part-2#better-code-editor-selection + # https://symfony.com/doc/current/reference/configuration/framework.html#ide + app: + build: + args: + SYMFONY_IDE: ${SYMFONY_IDE}&/srv/app/>${MANALA_HOST_PATH}/ + environment: + SYMFONY_IDE: ${SYMFONY_IDE}&/srv/app/>${MANALA_HOST_PATH}/ diff --git a/.manala/docker/make.mk b/.manala/docker/make.mk index 4d82fc9..ba019eb 100644 --- a/.manala/docker/make.mk +++ b/.manala/docker/make.mk @@ -34,7 +34,8 @@ _DOCKER_COMPOSE = $(if $(_MUTAGEN_COMPOSE), \ ) _DOCKER_COMPOSE_ENV = \ DOCKER_BUILDKIT=1 \ - MANALA_HOST=$(OS) \ + MANALA_HOST_OS=$(OS) \ + MANALA_HOST_PATH=$(abspath $(_DIR)) \ $(if $(_GIT_CONFIG),MANALA_GIT_CONFIG=$(_GIT_CONFIG)) \ $(if $(_GITHUB_CONFIG),MANALA_GITHUB_CONFIG=$(_GITHUB_CONFIG)) _DOCKER_COMPOSE_FILE = \ @@ -43,9 +44,8 @@ _DOCKER_COMPOSE_FILE = \ $(_DIR)/.manala/docker/compose/development.yaml \ $(if $(_MUTAGEN_COMPOSE),$(_DIR)/.manala/docker/compose/mutagen.yaml) \ $(if $(_GIT_CONFIG),$(_DIR)/.manala/docker/compose/git.yaml) \ - $(if $(_GITHUB_CONFIG),$(_DIR)/.manala/docker/compose/github.yaml) -_DOCKER_COMPOSE_PROJECT_NAME = $(PROJECT_NAME) -_DOCKER_COMPOSE_PROJECT_DIRECTORY = $(_DIR)/.manala/docker + $(if $(_GITHUB_CONFIG),$(_DIR)/.manala/docker/compose/github.yaml) \ + $(if $(SYMFONY_IDE),$(_DIR)/.manala/docker/compose/symfony.yaml) _DOCKER_COMPOSE_PROFILE = development _DOCKER_COMPOSE_EXEC_SERVICE = app _DOCKER_COMPOSE_EXEC_USER = app @@ -72,9 +72,7 @@ endif ifndef DOCKER define _docker_compose $(_DOCKER_COMPOSE_ENV) \ - $(if $(_DOCKER_COMPOSE_PROJECT_NAME),COMPOSE_PROJECT_NAME=$(_DOCKER_COMPOSE_PROJECT_NAME)) \ $(_DOCKER_COMPOSE) \ - $(if $(_DOCKER_COMPOSE_PROJECT_DIRECTORY),--project-directory $(_DOCKER_COMPOSE_PROJECT_DIRECTORY)) \ $(if $(_DOCKER_COMPOSE_PROFILE),--profile $(_DOCKER_COMPOSE_PROFILE)) \ $(foreach FILE, $(_DOCKER_COMPOSE_FILE), \ --file $(FILE) \ diff --git a/.manala/github/system/action.yaml b/.manala/github/system/action.yaml index 08f8da9..87f38fc 100644 --- a/.manala/github/system/action.yaml +++ b/.manala/github/system/action.yaml @@ -42,8 +42,7 @@ runs: BUILDKIT_PROGRESS: plain run: | echo "::group::🐳 Docker pull" - docker-compose \ - --project-directory ./.manala/docker \ + docker compose \ --profile integration \ --file ./.manala/docker/compose.yaml \ --file ./.manala/docker/compose/integration.yaml \ @@ -81,9 +80,7 @@ runs: echo "::group::${{ inputs.setup_group }}" MANALA_USER_ID=$(id -u) \ MANALA_GROUP_ID=$(id -g) \ - docker-compose \ - --project-directory ./.manala/docker \ - --project-name app \ + docker compose \ --profile integration \ --file ./.manala/docker/compose.yaml \ --file ./.manala/docker/compose/integration.yaml \ @@ -102,9 +99,7 @@ runs: shell: bash run: | echo "::group::${{ inputs.shell_group }}" - docker-compose \ - --project-directory ./.manala/docker \ - --project-name app \ + docker compose \ --profile integration \ --file ./.manala/docker/compose.yaml \ --file ./.manala/docker/compose/integration.yaml \ diff --git a/.manala/make/help.mk b/.manala/make/help.mk index d9b2e32..dabb65c 100644 --- a/.manala/make/help.mk +++ b/.manala/make/help.mk @@ -24,7 +24,7 @@ help: sectionsName[1] = "Commands" ; \ sectionsCount = 1 ; \ } \ - /^[-a-zA-Z0-9_.@%\/]+:/ { \ + /^[-a-zA-Z0-9_.@%\/+]+:/ { \ if (match(lastLine, /^## (.*)/)) { \ command = substr($$1, 1, index($$1, ":") - 1) ; \ section = substr(lastLine, RSTART + 3, index(lastLine, " - ") - 4) ; \ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b772276 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,105 @@ +ARG DEBIAN=bullseye + +FROM debian:${DEBIAN}-slim + +ARG DEBIAN +ARG USER_ID=1000 +ARG GROUP_ID=1000 +ARG GOSU_VERSION=1.12 +ARG GOMPLATE_VERSION=3.9.0 +ARG NODE_VERSION=8 +ARG NGINX_VERSION=1.22 +ARG PHP_VERSION=8.1 +ARG COMPOSER_VERSION=2 + +COPY . /srv/app +WORKDIR /srv/app + +# Expose some environment variables +ENV \ + PHP_VERSION=${PHP_VERSION} + +RUN \ + apt-get update \ + && apt-get install -y --no-install-recommends \ + apt-transport-https \ + sudo \ + curl \ + ca-certificates \ + gnupg \ + unzip \ + # Sudo + && echo "Defaults !env_reset" > /etc/sudoers.d/env \ + # User + && addgroup --gid ${GROUP_ID} app \ + && adduser --home /home/app --shell /bin/bash --uid ${USER_ID} --gecos app --ingroup app --disabled-password app \ + && echo "app ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/app \ + # App dir + && mkdir --parents /srv/app && chown app:app /srv/app \ + # App entrypoint dir + && mkdir --parents /srv/entrypoint.d && chown app:app /srv/entrypoint.d \ + # Gosu + && curl -sSL https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-amd64 \ + -o /usr/local/bin/gosu \ + && chmod +x /usr/local/bin/gosu \ + # Gomplate + && curl -sSL https://github.com/hairyhenderson/gomplate/releases/download/v${GOMPLATE_VERSION}/gomplate_linux-amd64 \ + -o /usr/local/bin/gomplate \ + && chmod +x /usr/local/bin/gomplate \ + \ + ######### + # Nginx # + ######### + \ + && echo "deb http://nginx.org/packages/debian/ ${DEBIAN} nginx" > /etc/apt/sources.list.d/nginx.list \ + && curl -sSL http://nginx.org/keys/nginx_signing.key \ + | apt-key add - \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + nginx=${NGINX_VERSION}.* \ + \ + ######## + # Node # + ######## + \ + && echo "deb https://deb.nodesource.com/node_${NODE_VERSION}.x ${DEBIAN} main" > /etc/apt/sources.list.d/node.list \ + && curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key \ + | apt-key add - \ + && echo "Package: nodejs*\n\ +Pin: origin deb.nodesource.com\n\ +Pin-Priority: 900" > /etc/apt/preferences.d/node \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + nodejs \ + \ + ####### + # Php # + ####### + \ + && echo "deb https://packages.sury.org/php/ ${DEBIAN} main" > /etc/apt/sources.list.d/php.list \ + && curl -sSL https://packages.sury.org/php/apt.gpg --output /etc/apt/trusted.gpg.d/php.gpg \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + php${PHP_VERSION}-cli \ + php${PHP_VERSION}-fpm \ + php${PHP_VERSION}-opcache \ + php${PHP_VERSION}-readline \ + # Modules + && phpdismod \ + xdebug \ + # Composer + && curl -sSL https://getcomposer.org/installer \ + | php -- --install-dir /usr/local/bin --filename composer --${COMPOSER_VERSION} \ + \ + ######### + # Clean # + ######### + \ + && rm -rf \ + /var/lib/apt/lists/* \ + /var/cache/debconf/*-old \ + /var/lib/dpkg/*-old \ + && truncate -s 0 /var/log/*.log + +RUN npm install +RUN /srv/app/node_modules/.bin/webpack diff --git a/Makefile b/Makefile index ef984ca..8b7e8df 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,9 @@ build: ## Start a local server serve: + echo "" + echo "Server can be reach here -> http://elao-tricot.ela.ooo:12600" + echo "" php -S 0.0.0.0:8000 -t ./dist ########## diff --git a/README.md b/README.md index c2ce8be..c368b38 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,7 @@ Simple watcher: ## Build make build + +## Serve + + make serve