diff --git a/.manala.yaml b/.manala.yaml new file mode 100644 index 0000000..0d9f8d8 --- /dev/null +++ b/.manala.yaml @@ -0,0 +1,51 @@ +#################################################################### +# !!! 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: 11 + 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 + docker: + services: + app: + ports: + - 12600:8000 + + # 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..afdce18 --- /dev/null +++ b/.manala/Makefile @@ -0,0 +1,118 @@ +# 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 # +########### + +define project_host +elao-tricot.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..62d0d41 --- /dev/null +++ b/.manala/README.md @@ -0,0 +1,847 @@ +--- +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`) + +Linux + +* Docker 20.10.14+ +(see [documentation](https://docs.docker.com/engine/install/)) + +## 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] +``` + +⚠︎ 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 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. + +```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 + +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 + # GitHub + github_ssh_key_secret: SSH_DEPLOY_KEY_PRODUCTION + + - << : *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 + # 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. + +```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 return 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 + +## 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. +- 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..fb72178 --- /dev/null +++ b/.manala/ansible/inventories/system.development.yaml @@ -0,0 +1,59 @@ +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 + # 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..12681b6 --- /dev/null +++ b/.manala/ansible/inventories/system.yaml @@ -0,0 +1,116 @@ +system: + + vars: + + # Ansible + ansible_connection: local + + # 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: [] + # 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 + # 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: 10 + 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: [] + system_php_env: {} + # 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..3ba5cd9 --- /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 --verbose {{ [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..6f9e9e9 --- /dev/null +++ b/.manala/ansible/system.yaml @@ -0,0 +1,455 @@ +--- + +- 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 }}" + + ######### + # 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.11.1 + + ############ + # 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_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" + + 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: 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..fb7e214 --- /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_OS | 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..baa6c80 --- /dev/null +++ b/.manala/docker/Dockerfile @@ -0,0 +1,220 @@ +# Init system (none|sysv|openrc|systemd) +ARG MANALA_INIT=none +# Provision system (none|ansible) +ARG MANALA_PROVISION=none + +########## +# System # +########## + +FROM debian:11-slim AS system + +LABEL maintainer="Elao " + +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_OS=${MANALA_HOST_OS} +ENV MANALA_HOST_PATH=${MANALA_HOST_PATH} + +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 \ + # 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 + && sed -i "/^NETDOWN=/s/yes/no/" /etc/default/halt \ + # Useless services + && insserv --remove \ + # rcS / rc2 + 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 \ + 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.12 +ARG MANALA_PROVISION_LIMIT +ARG SYMFONY_IDE + +# 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-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\ +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..39bee22 --- /dev/null +++ b/.manala/docker/compose.yaml @@ -0,0 +1,23 @@ +name: elao-tricot + +services: + + ####### + # App # + ####### + + app: + hostname: elao-tricot + build: + context: .. + dockerfile: docker/Dockerfile + target: app + args: + 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/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..e684d02 --- /dev/null +++ b/.manala/docker/compose/development.yaml @@ -0,0 +1,33 @@ +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 + # App + - '12600:8000' 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..4a14cf4 --- /dev/null +++ b/.manala/docker/compose/integration.yaml @@ -0,0 +1,13 @@ +name: app + +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..f55b819 --- /dev/null +++ b/.manala/docker/compose/mutagen.yaml @@ -0,0 +1,28 @@ +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/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/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..ba019eb --- /dev/null +++ b/.manala/docker/make.mk @@ -0,0 +1,96 @@ +########## +# 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=$(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 = \ + $(_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) \ + $(if $(SYMFONY_IDE),$(_DIR)/.manala/docker/compose/symfony.yaml) +_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) \ + $(_DOCKER_COMPOSE) \ + $(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..87f38fc --- /dev/null +++ b/.manala/github/system/action.yaml @@ -0,0 +1,124 @@ +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 \ + --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 \ + --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 \ + --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..dabb65c --- /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/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 1bdfe6e..8b7e8df 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 # ########### @@ -56,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 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": {