From 3b116a689e86c0080daaa4e0687fe97b34d646ea Mon Sep 17 00:00:00 2001 From: nicolas-grevin Date: Wed, 27 Dec 2017 07:56:43 +0100 Subject: [PATCH 1/9] feat(symfony4-php72) Refacto docker and docker-composee --- .env.dist | 4 +- app/config/parameters.yml | 4 +- composer.json | 2 +- docker-compose.yml | 79 ++++++++++----------- docker/elk/logstash/logstash.conf | 39 ----------- docker/elk/logstash/patterns/default.conf | 85 ----------------------- docker/elk/logstash/patterns/nginx.conf | 1 - docker/elk/logstash/patterns/symfony.conf | 34 --------- docker/nginx/Dockerfile | 24 ++----- docker/nginx/symfony.conf | 17 ++--- docker/nginx/upstream.conf | 3 + docker/node/Dockerfile | 2 +- docker/php/Dockerfile | 24 +++++++ docker/php7-fpm/Dockerfile | 41 ----------- 14 files changed, 80 insertions(+), 279 deletions(-) delete mode 100644 docker/elk/logstash/logstash.conf delete mode 100644 docker/elk/logstash/patterns/default.conf delete mode 100644 docker/elk/logstash/patterns/nginx.conf delete mode 100644 docker/elk/logstash/patterns/symfony.conf create mode 100644 docker/nginx/upstream.conf create mode 100644 docker/php/Dockerfile delete mode 100644 docker/php7-fpm/Dockerfile diff --git a/.env.dist b/.env.dist index bc2c9a8f..1cda1ecc 100644 --- a/.env.dist +++ b/.env.dist @@ -1,5 +1,6 @@ # APP -SYMFONY_APP_PATH=/ +APP_DIR=/var/www/symfony +SYMFONY_ENV=dev # DOCKER LOGS_DIR=/docker/logs @@ -12,7 +13,6 @@ POSTGRES_PORT= # PORT WEB WEB_PORT= -ELK_PORT= # SYMFONY SECRET= diff --git a/app/config/parameters.yml b/app/config/parameters.yml index dd2b9557..77815390 100644 --- a/app/config/parameters.yml +++ b/app/config/parameters.yml @@ -7,7 +7,7 @@ parameters: database_password: '%env(POSTGRES_PASSWORD)%' # Mailer parameters - mailer_transport: %env(SMTP_TRANSPORT)% + mailer_transport: '%env(SMTP_TRANSPORT)%' mailer_host: '%env(SMTP_HOST)%' mailer_user: '%env(SMTP_USER)%' mailer_password: '%env(SMTP_PASSWORD)%' @@ -16,6 +16,6 @@ parameters: secret: '%env(SECRET)%' # Redis parameters - redis_dsn: '%env(REDIS_DNS)%' + redis_dsn: '%env(REDIS_DSN)%' redis_options: ~ session_ttl: 86400 \ No newline at end of file diff --git a/composer.json b/composer.json index 213016c1..9d1f9cda 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "files": ["vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php"] }, "require": { - "php": ">=7.1", + "php": ">=7.2", "doctrine/doctrine-bundle": "^1.6", "doctrine/orm": "^2.5", "friendsofsymfony/rest-bundle": "^2.2", diff --git a/docker-compose.yml b/docker-compose.yml index f51d8b0a..b0045d17 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,48 +1,43 @@ -version: '2' +version: '3' services: - postgres: - image: postgres:9.6 - ports: - - ${POSTGRES_PORT}:5432 - environment: - POSTGRES_DB: ${POSTGRES_DB} - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + postgres: + image: postgres:10 + env_file: + - .env + ports: + - ${POSTGRES_PORT}:5432 - php: - build: docker/php7-fpm - env_file: ./.env - volumes: - - ${SYMFONY_APP_PATH}:/var/www/symfony - links: - - postgres + php: + build: + context: . + dockerfile: docker/php/Dockerfile + env_file: + - .env + user: www-data + working_dir: ${APP_DIR} + volumes: + - ${PWD}:${APP_DIR} - nginx: - build: docker/nginx - ports: - - ${WEB_PORT}:80 - volumes_from: - - php - volumes: - - ${LOGS_DIR}/nginx/:/var/log/nginx + nginx: + build: + context: . + dockerfile: docker/nginx/Dockerfile + ports: + - ${WEB_PORT}:80 + volumes: + - ${PWD}:${APP_DIR} - elk: - image: willdurand/elk - ports: - - ${ELK_PORT}:80 - volumes: - - ./docker/elk/logstash:/etc/logstash - - ./docker/elk/logstash/patterns:/opt/logstash/patterns - volumes_from: - - php - - nginx + redis: + image: redis:4 - redis: - image: redis:3.2.10 - - node: - build: docker/node - volumes: - - ${SYMFONY_APP_PATH}:/var/www/symfony - command: bash -c "yarn && yarn dev" \ No newline at end of file + node: + build: + context: . + dockerfile: docker/node/Dockerfile + env_file: + - .env + working_dir: ${APP_DIR} + volumes: + - ${PWD}:${APP_DIR} + command: bash -c "yarn && yarn dev" \ No newline at end of file diff --git a/docker/elk/logstash/logstash.conf b/docker/elk/logstash/logstash.conf deleted file mode 100644 index f9e14bd5..00000000 --- a/docker/elk/logstash/logstash.conf +++ /dev/null @@ -1,39 +0,0 @@ -input { - file { - type => "nginx_access" - path => "/var/log/nginx/symfony_access.log" - start_position => beginning - } - file { - type => "symfony_dev" - path => "/var/www/symfony/app/logs/dev.log" - start_position => beginning - } - file { - type => "symfony_prod" - path => "/var/www/symfony/app/logs/prod.log" - start_position => beginning - } -} - -filter { - if [type] == "nginx_access" { - grok { - patterns_dir => "./patterns" - match => { "message" => "%{NGINXACCESS}"} - } - } - else if [type] in ["symfony_dev", "symfony_prod"] { - grok { - patterns_dir => "./patterns" - match => { "message" => "%{SYMFONY}"} - } - } -} - -output { - elasticsearch { - host => "localhost" - cluster => "logstash" - } -} \ No newline at end of file diff --git a/docker/elk/logstash/patterns/default.conf b/docker/elk/logstash/patterns/default.conf deleted file mode 100644 index 70a2900c..00000000 --- a/docker/elk/logstash/patterns/default.conf +++ /dev/null @@ -1,85 +0,0 @@ -USERNAME [a-zA-Z0-9._-]+ -USER %{USERNAME} -INT (?:[+-]?(?:[0-9]+)) -BASE10NUM (?[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+))) -NUMBER (?:%{BASE10NUM}) -BASE16NUM (?(?"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``)) -UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12} -# Networking -MAC (?:%{CISCOMAC}|%{WINDOWSMAC}|%{COMMONMAC}) -CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4}) -WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2}) -COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}) -IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)? -IPV4 (?/(?>[\w_%!$@:.,-]+|\\.)*)+ -TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+)) -WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+ -URIPROTO [A-Za-z]+(\+[A-Za-z+]+)? -URIHOST %{IPORHOST}(?::%{POSINT:port})? -# uripath comes loosely from RFC1738, but mostly from what Firefox -# doesn't turn into %XX -URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+ -#URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)? -URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]* -URIPATHPARAM %{URIPATH}(?:%{URIPARAM})? -URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})? -# Months: January, Feb, 3, 03, 12, December -MONTH \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b -MONTHNUM (?:0?[1-9]|1[0-2]) -MONTHNUM2 (?:0[1-9]|1[0-2]) -MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) -# Days: Monday, Tue, Thu, etc... -DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?) -# Years? -YEAR (?>\d\d){1,2} -HOUR (?:2[0123]|[01]?[0-9]) -MINUTE (?:[0-5][0-9]) -# '60' is a leap second in most time standards and thus is valid. -SECOND (?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?) -TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9]) -# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it) -DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR} -DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR} -ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE})) -ISO8601_SECOND (?:%{SECOND}|60) -TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}? -DATE %{DATE_US}|%{DATE_EU} -DATESTAMP %{DATE}[- ]%{TIME} -TZ (?:[PMCE][SD]T|UTC) -DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ} -DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE} -DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR} -DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND} -# Syslog Dates: Month Day HH:MM:SS -SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME} -PROG (?:[\w._/%-]+) -SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])? -SYSLOGHOST %{IPORHOST} -SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}> -HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT} -# Shortcuts -QS %{QUOTEDSTRING} -# Log formats -SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}: -COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) -COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent} -# Log Levels -LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?) \ No newline at end of file diff --git a/docker/elk/logstash/patterns/nginx.conf b/docker/elk/logstash/patterns/nginx.conf deleted file mode 100644 index 9025e084..00000000 --- a/docker/elk/logstash/patterns/nginx.conf +++ /dev/null @@ -1 +0,0 @@ -NGINXACCESS %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{URIPATHPARAM:request}(?: HTTP/%{NUMBER:httpversion})?|-)" %{NUMBER:response} (?:%{NUMBER:bytes}|-) "(?:%{URI:referrer}|-)" %{QS:agent} %{NUMBER:request_time} %{NUMBER:upstream_response_time} %{NUMBER:gzip_ratio} (?:%{WORD:cache_hit}|-)%{GREEDYDATA} \ No newline at end of file diff --git a/docker/elk/logstash/patterns/symfony.conf b/docker/elk/logstash/patterns/symfony.conf deleted file mode 100644 index d8d59140..00000000 --- a/docker/elk/logstash/patterns/symfony.conf +++ /dev/null @@ -1,34 +0,0 @@ -VERYGREEDYDATA (.|\n)* - -SYMFONY_EXCEPTION [^:]* - -SYMFONY_LOG_TYPE request|security|app|profiler|doctrine|event -SYMFONY_LOG_LEVEL DEBUG|INFO|WARNING|ERROR|CRITICAL|ALERT -SYMFONY_LOG %{SYMFONY_LOG_TYPE:log_type}\.%{SYMFONY_LOG_LEVEL:log_level} - -SYMFONY_PARAMETER "[^"]*":( )?"[^"]*" -SYMFONY_PARAMETERS (%{SYMFONY_PARAMETER}(, )?)* -SYMFONY_CONTEXT {.*} -SYMFONY_REQUEST_METHOD GET|POST|PUT|DELETE|HEAD|OPTIONS|CONNECT -SYMFONY_REQUEST_PARAMETERS {"url":"%{GREEDYDATA:request_url}","ip":"%{IP:request_ip}","http_method":"%{SYMFONY_REQUEST_METHOD:request_method}"} - -SYMFONY_REQUEST_INFO Matched route "%{GREEDYDATA:route}" \(parameters: %{SYMFONY_PARAMETERS:parameters}\) -SYMFONY_REQUEST_UNCAUGHT_EXCEPTION %{SYMFONY_EXCEPTION:exception}: %{VERYGREEDYDATA:exception_message} \(uncaught exception\) at %{VERYGREEDYDATA:exception_file} line %{NUMBER:exception_file_line} -SYMFONY_REQUEST_CRITICAL Exception thrown when handling an exception \(ErrorException: %{GREEDYDATA:exception_message} in %{GREEDYDATA:exception_file} line %{NUMBER:exception_file_line}\) -SYMFONY_SECURITY_WARNING_USER_MISSING Username "%{GREEDYDATA:user}" could not be found. -SYMFONY_SECURITY_INFO_USER_AUTHENTICATED User "%{GREEDYDATA:user}" has been authenticated successfully -SYMFONY_SECURITY_INFO_AUTHENTICATION_FAILED Authentication request failed: %{GREEDYDATA:authentication_fail_reason} -SYMFONY_SECURITY_DEBUG Username "%{GREEDYDATA:user}" was reloaded from user provider. -SYMFONY_EVENT_DEBUG_NOTIFICATION Notified event "%{GREEDYDATA:event}" to listener "%{GREEDYDATA:listener}". -SYMFONY_EVENT_DEBUG_PROPAGATION_STOP Listener "%{GREEDYDATA:listener}" stopped propagation of the event "%{GREEDYDATA:event}". -SYMFONY_DOCTRINE_DEBUG (?<=doctrine.DEBUG: ).* - -SYMFONY_REQUEST %{SYMFONY_REQUEST_INFO}|%{SYMFONY_REQUEST_UNCAUGHT_EXCEPTION}|%{SYMFONY_REQUEST_CRITICAL} -SYMFONY_SECURITY %{SYMFONY_SECURITY_WARNING_USER_MISSING}|%{SYMFONY_SECURITY_INFO_USER_AUTHENTICATED}|%{SYMFONY_SECURITY_DEBUG}|%{SYMFONY_SECURITY_INFO_AUTHENTICATION_FAILED} -SYMFONY_EVENT %{SYMFONY_EVENT_DEBUG_NOTIFICATION}|%{SYMFONY_EVENT_DEBUG_PROPAGATION_STOP} -SYMFONY_DOCTRINE %{SYMFONY_DOCTRINE_DEBUG:doctrine_sql_query} -SYMFONY_VARIOUS_INFO Write SecurityContext in the session|Reloading user from user provider.|Read SecurityContext from the session|Populated SecurityContext with an anonymous Token|Access is denied (and user is neither anonymous, nor remember-me)|Unable to store the profiler information.|Remember-me cookie accepted. - -SYMFONY_LOG_MESSAGE %{SYMFONY_REQUEST}|%{SYMFONY_SECURITY}|%{SYMFONY_EVENT}|%{SYMFONY_DOCTRINE}|%{SYMFONY_VARIOUS_INFO:log_various_info}|%{VERYGREEDYDATA:log_unparsed_message} - -SYMFONY ^\[%{TIMESTAMP_ISO8601:date}\] %{SYMFONY_LOG}: %{SYMFONY_LOG_MESSAGE:log_message} (\[\]|%{SYMFONY_CONTEXT:log_context}) (\[\]|%{SYMFONY_REQUEST_PARAMETERS:log_request}) \ No newline at end of file diff --git a/docker/nginx/Dockerfile b/docker/nginx/Dockerfile index 8011b3ab..ea1c1c5e 100644 --- a/docker/nginx/Dockerfile +++ b/docker/nginx/Dockerfile @@ -1,21 +1,7 @@ -FROM debian:jessie +FROM nginx:1.13 -MAINTAINER Maxence POUTORD +RUN rm -f /etc/nginx/nginx.conf /etc/nginx/conf.d/* -RUN apt-get update && apt-get install -y \ - nginx - -ADD nginx.conf /etc/nginx/ -ADD symfony.conf /etc/nginx/sites-available/ - -RUN ln -s /etc/nginx/sites-available/symfony.conf /etc/nginx/sites-enabled/symfony -RUN rm /etc/nginx/sites-enabled/default - -RUN echo "upstream php-upstream { server php:9000; }" > /etc/nginx/conf.d/upstream.conf - -RUN usermod -u 1000 www-data - -CMD ["nginx"] - -EXPOSE 80 -EXPOSE 443 +ADD ./docker/nginx/nginx.conf /etc/nginx/nginx.conf +ADD ./docker/nginx/upstream.conf /etc/nginx/conf.d/upstream.conf +ADD ./docker/nginx/symfony.conf /etc/nginx/conf.d/symfony.conf \ No newline at end of file diff --git a/docker/nginx/symfony.conf b/docker/nginx/symfony.conf index 3965ffa6..6cf337af 100644 --- a/docker/nginx/symfony.conf +++ b/docker/nginx/symfony.conf @@ -1,16 +1,9 @@ server { server_name _; - root /var/www/symfony/web; + root /var/www/symfony/public; + index index.php; - location / { - try_files $uri @rewriteapp; - } - - location @rewriteapp { - rewrite ^(.*)$ /app.php/$1 last; - } - - location ~ ^/(app|app_dev|config)\.php(/|$) { + location ~ \.php(/|$) { fastcgi_pass php-upstream; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; @@ -18,6 +11,6 @@ server { fastcgi_param HTTPS off; } - error_log /var/log/nginx/symfony_error.log; - access_log /var/log/nginx/symfony_access.log; + error_log /var/www/symfony/var/log/nginx.error.log; + access_log /var/www/symfony/var/log/nginx.access.log; } diff --git a/docker/nginx/upstream.conf b/docker/nginx/upstream.conf new file mode 100644 index 00000000..553791cd --- /dev/null +++ b/docker/nginx/upstream.conf @@ -0,0 +1,3 @@ +upstream php-upstream { + server php:9000; +} \ No newline at end of file diff --git a/docker/node/Dockerfile b/docker/node/Dockerfile index a3f56b8a..9e8fcdd9 100644 --- a/docker/node/Dockerfile +++ b/docker/node/Dockerfile @@ -1,4 +1,4 @@ -FROM node:8 +FROM node:9 RUN apt-get update && \ apt-get install -y \ diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile new file mode 100644 index 00000000..f26f71fd --- /dev/null +++ b/docker/php/Dockerfile @@ -0,0 +1,24 @@ +FROM php:7.2-fpm + +RUN apt-get update && \ + apt-get install -y \ + git \ + unzip \ + libpq-dev + +# Install Composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer +RUN composer --version +RUN mkdir /var/www/.composer && chown -R www-data /var/www/.composer + +# Set timezone +RUN rm /etc/localtime +RUN ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime +RUN "date" + +# Type docker-php-ext-install to see available extensions +RUN docker-php-ext-install pdo_pgsql + +RUN usermod -u 1000 www-data + +WORKDIR /var/www/symfony diff --git a/docker/php7-fpm/Dockerfile b/docker/php7-fpm/Dockerfile deleted file mode 100644 index 47d0b00a..00000000 --- a/docker/php7-fpm/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -# See https://github.com/docker-library/php/blob/4677ca134fe48d20c820a19becb99198824d78e3/7.0/fpm/Dockerfile -FROM php:7.1-fpm - -MAINTAINER Maxence POUTORD - -RUN apt-get update && \ - apt-get install -y \ - git \ - unzip \ - libpq-dev - -# Install Composer -RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer -RUN composer --version -RUN mkdir /var/www/.composer && chown -R www-data /var/www/.composer - -# Set timezone -RUN rm /etc/localtime -RUN ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime -RUN "date" - -# Type docker-php-ext-install to see available extensions -RUN docker-php-ext-install pdo pdo_pgsql - -# install xdebug -RUN pecl install xdebug -RUN docker-php-ext-enable xdebug - -RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -RUN echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -RUN echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -RUN echo "xdebug.remote_connect_back=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -RUN echo "xdebug.idekey=\"PHPSTORM\"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini -RUN echo "xdebug.remote_port=9001" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini - -RUN echo 'alias sf3="php bin/console"' >> ~/.bashrc - -RUN usermod -u 1000 www-data - -WORKDIR /var/www/symfony From 268a536b40caa8fd20f70e4c3750935f72840c76 Mon Sep 17 00:00:00 2001 From: nicolas Date: Fri, 29 Dec 2017 14:10:33 +0100 Subject: [PATCH 2/9] feat(symfony4-php72) WIP: upgrade symfony 3.3 to 4.x Author: nicolas-grevin --- .env.dist | 15 +- .gitignore | 20 +- app/.htaccess | 7 - app/AppCache.php | 7 - app/AppKernel.php | 57 - app/Resources/views/app.html.twig | 2 +- app/config/config.yml | 4 +- app/config/config_dev.yml | 28 - app/config/config_prod.yml | 16 - app/config/config_test.yml | 18 - app/config/parameters.yml | 2 +- app/config/routing.yml | 4 +- app/config/routing_dev.yml | 14 - app/config/security.yml | 24 - app/config/services.yml | 35 - bin/console | 33 +- bin/phpunit | 18 + bin/symfony_requirements | 146 - composer.json | 87 +- composer.lock | 1956 ++-- config/bundles.php | 11 + config/packages/dev/jms_serializer.yaml | 7 + config/packages/dev/routing.yaml | 3 + config/packages/doctrine.yaml | 20 + config/packages/fos_rest.yaml | 18 + config/packages/framework.yaml | 6 + config/packages/jms_serializer.yaml | 6 + config/packages/prod/doctrine.yaml | 31 + config/packages/prod/jms_serializer.yaml | 6 + config/packages/routing.yaml | 3 + config/packages/snc_redis.yaml | 12 + config/packages/test/framework.yaml | 5 + config/routes.yaml | 3 + config/routes/annotations.yaml | 3 + config/services.yaml | 27 + config/services_test.yaml | 9 + config/webpack.conf.js | 77 + docker/nginx/nginx.conf | 2 - docker/nginx/upstream.conf | 2 +- docker/php/Dockerfile | 6 +- package.json | 6 +- phpunit.xml.dist | 12 + public/index.php | 39 + src/.htaccess | 7 - src/AppBundle/AppBundle.php | 13 - .../Controller/ApiController.php | 2 +- .../Controller/AppController.php | 3 +- var/logs/.gitkeep => src/Entity/.gitignore | 0 src/Kernel.php | 61 + src/Repository/.gitignore | 0 .../Resources/js/components/message/index.vue | 0 .../Resources/js/page1/entrypoint.js | 0 .../Resources/js/page1/index.vue | 0 .../Resources/js/page1/playground.spec.js | 0 .../Resources/js/page2/entrypoint.js | 0 .../Resources/js/page2/index.vue | 0 .../Resources/js/page2/playground.spec.js | 0 src/Resources/public/js/page1.js | 8250 +++++++++++++++++ src/Resources/public/js/page1.js.map | 1 + src/Resources/public/js/page2.js | 7753 ++++++++++++++++ src/Resources/public/js/page2.js.map | 1 + .../Resources/public/scss/app.scss | 0 .../Resources/views/App/index.html.twig | 0 .../Resources/views/App/layout.html.twig | 0 .../Resources/views/App/page2.html.twig | 0 symfony.lock | 215 + tests/.gitignore | 0 .../Controller/AppControllerTest.php | 28 - var/SymfonyRequirements.php | 817 -- web/.htaccess | 68 - web/app.php | 28 - web/app_dev.php | 23 - web/apple-touch-icon.png | Bin 2092 -> 0 bytes web/favicon.ico | Bin 6518 -> 0 bytes web/robots.txt | 5 - 75 files changed, 17761 insertions(+), 2321 deletions(-) delete mode 100644 app/.htaccess delete mode 100644 app/AppCache.php delete mode 100644 app/AppKernel.php delete mode 100644 app/config/config_dev.yml delete mode 100644 app/config/config_prod.yml delete mode 100644 app/config/config_test.yml delete mode 100644 app/config/routing_dev.yml delete mode 100644 app/config/security.yml delete mode 100644 app/config/services.yml create mode 100755 bin/phpunit delete mode 100755 bin/symfony_requirements create mode 100644 config/bundles.php create mode 100644 config/packages/dev/jms_serializer.yaml create mode 100644 config/packages/dev/routing.yaml create mode 100644 config/packages/doctrine.yaml create mode 100644 config/packages/fos_rest.yaml create mode 100644 config/packages/framework.yaml create mode 100644 config/packages/jms_serializer.yaml create mode 100644 config/packages/prod/doctrine.yaml create mode 100644 config/packages/prod/jms_serializer.yaml create mode 100644 config/packages/routing.yaml create mode 100644 config/packages/snc_redis.yaml create mode 100644 config/packages/test/framework.yaml create mode 100644 config/routes.yaml create mode 100644 config/routes/annotations.yaml create mode 100644 config/services.yaml create mode 100644 config/services_test.yaml create mode 100644 config/webpack.conf.js create mode 100644 public/index.php delete mode 100644 src/.htaccess delete mode 100644 src/AppBundle/AppBundle.php rename src/{AppBundle => }/Controller/ApiController.php (94%) rename src/{AppBundle => }/Controller/AppController.php (92%) rename var/logs/.gitkeep => src/Entity/.gitignore (100%) mode change 100755 => 100644 create mode 100644 src/Kernel.php create mode 100644 src/Repository/.gitignore rename src/{AppBundle => }/Resources/js/components/message/index.vue (100%) rename src/{AppBundle => }/Resources/js/page1/entrypoint.js (100%) rename src/{AppBundle => }/Resources/js/page1/index.vue (100%) rename src/{AppBundle => }/Resources/js/page1/playground.spec.js (100%) rename src/{AppBundle => }/Resources/js/page2/entrypoint.js (100%) rename src/{AppBundle => }/Resources/js/page2/index.vue (100%) rename src/{AppBundle => }/Resources/js/page2/playground.spec.js (100%) create mode 100644 src/Resources/public/js/page1.js create mode 100644 src/Resources/public/js/page1.js.map create mode 100644 src/Resources/public/js/page2.js create mode 100644 src/Resources/public/js/page2.js.map rename src/{AppBundle => }/Resources/public/scss/app.scss (100%) rename src/{AppBundle => }/Resources/views/App/index.html.twig (100%) rename src/{AppBundle => }/Resources/views/App/layout.html.twig (100%) rename src/{AppBundle => }/Resources/views/App/page2.html.twig (100%) create mode 100644 symfony.lock create mode 100644 tests/.gitignore delete mode 100644 tests/AppBundle/Controller/AppControllerTest.php delete mode 100755 var/SymfonyRequirements.php delete mode 100644 web/.htaccess delete mode 100644 web/app.php delete mode 100644 web/app_dev.php delete mode 100644 web/apple-touch-icon.png delete mode 100644 web/favicon.ico delete mode 100644 web/robots.txt diff --git a/.env.dist b/.env.dist index 1cda1ecc..7d1127ea 100644 --- a/.env.dist +++ b/.env.dist @@ -1,6 +1,7 @@ # APP APP_DIR=/var/www/symfony -SYMFONY_ENV=dev +APP_ENV=dev +APP_SECRET=93174013057b1e458ff58ae5f158a0f1 # DOCKER LOGS_DIR=/docker/logs @@ -25,3 +26,15 @@ SMTP_TRANSPORT= #REDIS REDIS_DSN= + +###> snc/redis-bundle ### +# passwords that contain special characters (@, %, :, +) must be urlencoded +REDIS_URL=redis://localhost +###< snc/redis-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" +# Configure your db driver and server_version in config/packages/doctrine.yaml +DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name +###< doctrine/doctrine-bundle ### diff --git a/.gitignore b/.gitignore index dc20ef30..721cebdd 100644 --- a/.gitignore +++ b/.gitignore @@ -4,16 +4,15 @@ ### Environement .env -### Cache, session files and logs (Symfony3) -/var/cache/* -/var/logs/* -!var/cache/.gitkeep -!var/logs/.gitkeep +### Cache, session files and logs (Symfony4) +/var/ ### Managed by Composer -/var/bootstrap.php.cache /vendor/ +### Symfony +/public/bundles/ + ### Assets and user uploads /web/bundles/ /web/uploads/ @@ -21,9 +20,6 @@ ### PHPUnit /phpunit.xml -### Docker -docker/logs/ - ### NodeJS - NPM - YARN node_modules/ npm-debug.log* @@ -36,4 +32,8 @@ src/AppBundle/Resources/public/js/ src/AppBundle/Resources/public/css/ ### Build data -/build/ \ No newline at end of file +/build/ +###> symfony/phpunit-bridge ### +.phpunit +/phpunit.xml +###< symfony/phpunit-bridge ### diff --git a/app/.htaccess b/app/.htaccess deleted file mode 100644 index fb1de45b..00000000 --- a/app/.htaccess +++ /dev/null @@ -1,7 +0,0 @@ - - Require all denied - - - Order deny,allow - Deny from all - diff --git a/app/AppCache.php b/app/AppCache.php deleted file mode 100644 index 639ec2cd..00000000 --- a/app/AppCache.php +++ /dev/null @@ -1,7 +0,0 @@ -getEnvironment(), ['dev', 'test'], true)) { - $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle(); - $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); - $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); - $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(); - - if ('dev' === $this->getEnvironment()) { - $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); - } - } - - return $bundles; - } - - public function getRootDir() - { - return __DIR__; - } - - public function getCacheDir() - { - return dirname(__DIR__).'/var/cache/'.$this->getEnvironment(); - } - - public function getLogDir() - { - return dirname(__DIR__).'/var/logs'; - } - - public function registerContainerConfiguration(LoaderInterface $loader) - { - $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml'); - } -} diff --git a/app/Resources/views/app.html.twig b/app/Resources/views/app.html.twig index b044e2f3..bf408ea1 100644 --- a/app/Resources/views/app.html.twig +++ b/app/Resources/views/app.html.twig @@ -13,7 +13,7 @@ {% block data_layout %} {% endblock %} {% block body %}{% endblock %} diff --git a/app/config/config.yml b/app/config/config.yml index 5dd8c46c..01054474 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -86,8 +86,8 @@ snc_redis: type: predis logging: false alias: session_client - dsn: %redis_dsn% - options: %redis_options% + dsn: '%redis_dsn%' + options: '%redis_options%' session: client: session_client prefix: app_session_ diff --git a/app/config/config_dev.yml b/app/config/config_dev.yml deleted file mode 100644 index 6dbb854e..00000000 --- a/app/config/config_dev.yml +++ /dev/null @@ -1,28 +0,0 @@ -imports: - - { resource: config.yml } - -framework: - router: - resource: '%kernel.project_dir%/app/config/routing_dev.yml' - strict_requirements: true - profiler: { only_exceptions: false } - -web_profiler: - toolbar: true - intercept_redirects: false - -monolog: - handlers: - main: - type: stream - path: '%kernel.logs_dir%/%kernel.environment%.log' - level: debug - channels: ['!event'] - console: - type: console - process_psr_3_messages: false - channels: ['!event', '!doctrine', '!console'] - server_log: - type: server_log - process_psr_3_messages: false - host: 127.0.0.1:9911 \ No newline at end of file diff --git a/app/config/config_prod.yml b/app/config/config_prod.yml deleted file mode 100644 index 8a9c593d..00000000 --- a/app/config/config_prod.yml +++ /dev/null @@ -1,16 +0,0 @@ -imports: - - { resource: config.yml } - -monolog: - handlers: - main: - type: fingers_crossed - action_level: error - handler: nested - nested: - type: stream - path: '%kernel.logs_dir%/%kernel.environment%.log' - level: debug - console: - type: console - process_psr_3_messages: false \ No newline at end of file diff --git a/app/config/config_test.yml b/app/config/config_test.yml deleted file mode 100644 index 11744bc9..00000000 --- a/app/config/config_test.yml +++ /dev/null @@ -1,18 +0,0 @@ -imports: - - { resource: config_dev.yml } - -framework: - test: ~ - session: - handler_id: session.handler.native_file - storage_id: session.storage.mock_file - profiler: - collect: false - cache: ~ - -web_profiler: - toolbar: false - intercept_redirects: false - -swiftmailer: - disable_delivery: true \ No newline at end of file diff --git a/app/config/parameters.yml b/app/config/parameters.yml index 77815390..2faf064f 100644 --- a/app/config/parameters.yml +++ b/app/config/parameters.yml @@ -16,6 +16,6 @@ parameters: secret: '%env(SECRET)%' # Redis parameters - redis_dsn: '%env(REDIS_DSN)%' + redis_dsn: 'redis://%env(REDIS_DSN)%' redis_options: ~ session_ttl: 86400 \ No newline at end of file diff --git a/app/config/routing.yml b/app/config/routing.yml index 0c13383d..a7dfb4de 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -1,9 +1,9 @@ app: - resource: AppBundle\Controller\AppController + resource: '@AppBundle/Controller/AppController.php' type: annotation prefix: / api: type: rest - resource: AppBundle\Controller\ApiController + resource: '@AppBundle/Controller/ApiController.php' prefix: /api diff --git a/app/config/routing_dev.yml b/app/config/routing_dev.yml deleted file mode 100644 index 20602eb2..00000000 --- a/app/config/routing_dev.yml +++ /dev/null @@ -1,14 +0,0 @@ -_wdt: - resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' - prefix: /_wdt - -_profiler: - resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' - prefix: /_profiler - -_errors: - resource: '@TwigBundle/Resources/config/routing/errors.xml' - prefix: /_error - -_main: - resource: routing.yml diff --git a/app/config/security.yml b/app/config/security.yml deleted file mode 100644 index 0e0b7cb9..00000000 --- a/app/config/security.yml +++ /dev/null @@ -1,24 +0,0 @@ -# To get started with security, check out the documentation: -# https://symfony.com/doc/current/security.html -security: - - # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded - providers: - in_memory: - memory: ~ - - firewalls: - # disables authentication for assets and the profiler, adapt it according to your needs - dev: - pattern: ^/(_(profiler|wdt)|css|images|js)/ - security: false - - main: - anonymous: ~ - # activate different ways to authenticate - - # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate - #http_basic: ~ - - # https://symfony.com/doc/current/security/form_login_setup.html - #form_login: ~ diff --git a/app/config/services.yml b/app/config/services.yml deleted file mode 100644 index cdb1c65a..00000000 --- a/app/config/services.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Learn more about services, parameters and containers at -# https://symfony.com/doc/current/service_container.html -parameters: - #parameter_name: value - -services: - # default configuration for services in *this* file - _defaults: - # automatically injects dependencies in your services - autowire: true - # automatically registers your services as commands, event subscribers, etc. - autoconfigure: true - # this means you cannot fetch services directly from the container via $container->get() - # if you need to do this, you can override this setting on individual services - public: false - - # makes classes in src/AppBundle available to be used as services - # this creates a service per class whose id is the fully-qualified class name - AppBundle\: - resource: '../../src/AppBundle/*' - # you can exclude directories or files - # but if a service is unused, it's removed anyway - exclude: '../../src/AppBundle/{Entity,Repository,Tests}' - - # controllers are imported separately to make sure they're public - # and have a tag that allows actions to type-hint services - AppBundle\Controller\: - resource: '../../src/AppBundle/Controller' - public: true - tags: ['controller.service_arguments'] - - # add more services, or override services that need manual wiring - # AppBundle\Service\ExampleService: - # arguments: - # $someArgument: 'some_value' diff --git a/bin/console b/bin/console index 990d9449..c3d07976 100755 --- a/bin/console +++ b/bin/console @@ -1,28 +1,39 @@ #!/usr/bin/env php load(__DIR__ . '/../.env'); +} $input = new ArgvInput(); -$env = $input->getParameterOption(['--env', '-e'], getenv('SYMFONY_ENV') ?: 'dev'); -$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(['--no-debug', '']) && $env !== 'prod'; +$env = $input->getParameterOption(['--env', '-e'], $_SERVER['APP_ENV'] ?? 'dev'); +$debug = ($_SERVER['APP_DEBUG'] ?? ('prod' !== $env)) && !$input->hasParameterOption(['--no-debug', '']); if ($debug) { - Debug::enable(); + umask(0000); + + if (class_exists(Debug::class)) { + Debug::enable(); + } } -$kernel = new AppKernel($env, $debug); +$kernel = new Kernel($env, $debug); $application = new Application($kernel); $application->run($input); diff --git a/bin/phpunit b/bin/phpunit new file mode 100755 index 00000000..75d5be85 --- /dev/null +++ b/bin/phpunit @@ -0,0 +1,18 @@ +#!/usr/bin/env php +getPhpIniConfigPath(); - -echo_title('Symfony Requirements Checker'); - -echo '> PHP is using the following php.ini file:'.PHP_EOL; -if ($iniPath) { - echo_style('green', ' '.$iniPath); -} else { - echo_style('yellow', ' WARNING: No configuration file (php.ini) used by PHP!'); -} - -echo PHP_EOL.PHP_EOL; - -echo '> Checking Symfony requirements:'.PHP_EOL.' '; - -$messages = array(); -foreach ($symfonyRequirements->getRequirements() as $req) { - if ($helpText = get_error_message($req, $lineSize)) { - echo_style('red', 'E'); - $messages['error'][] = $helpText; - } else { - echo_style('green', '.'); - } -} - -$checkPassed = empty($messages['error']); - -foreach ($symfonyRequirements->getRecommendations() as $req) { - if ($helpText = get_error_message($req, $lineSize)) { - echo_style('yellow', 'W'); - $messages['warning'][] = $helpText; - } else { - echo_style('green', '.'); - } -} - -if ($checkPassed) { - echo_block('success', 'OK', 'Your system is ready to run Symfony projects'); -} else { - echo_block('error', 'ERROR', 'Your system is not ready to run Symfony projects'); - - echo_title('Fix the following mandatory requirements', 'red'); - - foreach ($messages['error'] as $helpText) { - echo ' * '.$helpText.PHP_EOL; - } -} - -if (!empty($messages['warning'])) { - echo_title('Optional recommendations to improve your setup', 'yellow'); - - foreach ($messages['warning'] as $helpText) { - echo ' * '.$helpText.PHP_EOL; - } -} - -echo PHP_EOL; -echo_style('title', 'Note'); -echo ' The command console could use a different php.ini file'.PHP_EOL; -echo_style('title', '~~~~'); -echo ' than the one used with your web server. To be on the'.PHP_EOL; -echo ' safe side, please check the requirements from your web'.PHP_EOL; -echo ' server using the '; -echo_style('yellow', 'web/config.php'); -echo ' script.'.PHP_EOL; -echo PHP_EOL; - -exit($checkPassed ? 0 : 1); - -function get_error_message(Requirement $requirement, $lineSize) -{ - if ($requirement->isFulfilled()) { - return; - } - - $errorMessage = wordwrap($requirement->getTestMessage(), $lineSize - 3, PHP_EOL.' ').PHP_EOL; - $errorMessage .= ' > '.wordwrap($requirement->getHelpText(), $lineSize - 5, PHP_EOL.' > ').PHP_EOL; - - return $errorMessage; -} - -function echo_title($title, $style = null) -{ - $style = $style ?: 'title'; - - echo PHP_EOL; - echo_style($style, $title.PHP_EOL); - echo_style($style, str_repeat('~', strlen($title)).PHP_EOL); - echo PHP_EOL; -} - -function echo_style($style, $message) -{ - // ANSI color codes - $styles = array( - 'reset' => "\033[0m", - 'red' => "\033[31m", - 'green' => "\033[32m", - 'yellow' => "\033[33m", - 'error' => "\033[37;41m", - 'success' => "\033[37;42m", - 'title' => "\033[34m", - ); - $supports = has_color_support(); - - echo($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : ''); -} - -function echo_block($style, $title, $message) -{ - $message = ' '.trim($message).' '; - $width = strlen($message); - - echo PHP_EOL.PHP_EOL; - - echo_style($style, str_repeat(' ', $width)); - echo PHP_EOL; - echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT)); - echo PHP_EOL; - echo_style($style, $message); - echo PHP_EOL; - echo_style($style, str_repeat(' ', $width)); - echo PHP_EOL; -} - -function has_color_support() -{ - static $support; - - if (null === $support) { - if (DIRECTORY_SEPARATOR == '\\') { - $support = false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'); - } else { - $support = function_exists('posix_isatty') && @posix_isatty(STDOUT); - } - } - - return $support; -} diff --git a/composer.json b/composer.json index 9d1f9cda..0a634ffa 100644 --- a/composer.json +++ b/composer.json @@ -23,64 +23,69 @@ "role": "Developer" } ], - "autoload": { - "psr-4": { - "": "src/" - }, - "classmap": ["app/AppKernel.php", "app/AppCache.php"] - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - }, - "files": ["vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php"] - }, "require": { "php": ">=7.2", + "ext-iconv": "*", "doctrine/doctrine-bundle": "^1.6", "doctrine/orm": "^2.5", "friendsofsymfony/rest-bundle": "^2.2", "jms/serializer-bundle": "^2.0", "predis/predis": "^1.1", - "sensio/distribution-bundle": "^5.0.19", - "sensio/framework-extra-bundle": "^3.0.2", "snc/redis-bundle": "^2.0", - "symfony/monolog-bundle": "^3.1.0", - "symfony/polyfill-apcu": "^1.0", - "symfony/swiftmailer-bundle": "^2.3.10", - "symfony/symfony": "3.3.*", + "symfony/console": "^4.0", + "symfony/flex": "^1.0", + "symfony/framework-bundle": "^4.0", + "symfony/lts": "^4@dev", + "symfony/yaml": "^4.0", "twig/twig": "^1.0||^2.0" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^2.3", - "sensio/generator-bundle": "^3.0", - "symfony/phpunit-bridge": "^3.0" + "symfony/dotenv": "^4.0", + "symfony/phpunit-bridge": "^4.0", + "symfony/thanks": "^1.0" + }, + "config": { + "preferred-install": { + "*": "dist" + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php71": "*", + "symfony/polyfill-php70": "*", + "symfony/polyfill-php56": "*" }, "scripts": { - "deploy-scripts": [ - "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", - "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", - "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets" - ], - "symfony-scripts": [ - "@deploy-scripts" + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install --symlink --relative %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" ], - "post-install-cmd": ["@symfony-scripts"], - "post-update-cmd": ["@symfony-scripts"] + "post-update-cmd": [ + "@auto-scripts" + ] }, - "config": { - "sort-packages": true + "conflict": { + "symfony/symfony": "*" }, "extra": { - "symfony-app-dir": "app", - "symfony-bin-dir": "bin", - "symfony-var-dir": "var", - "symfony-web-dir": "web", - "symfony-tests-dir": "tests", - "symfony-assets-install": "relative", - "incenteev-parameters": { - "file": "app/config/parameters.yml" - }, - "branch-alias": null + "symfony": { + "id": "01C2H4651MF8SEQE3YC5GM892D", + "allow-contrib": false + } } } diff --git a/composer.lock b/composer.lock index 0755e541..df1f1e96 100644 --- a/composer.lock +++ b/composer.lock @@ -4,79 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "e6a1ec7d4bf2ea886e75503bd58bf875", + "content-hash": "e86e6b76d51c6d6b2dbcbf4c586fbf47", "packages": [ - { - "name": "composer/ca-bundle", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "9dd73a03951357922d8aee6cc084500de93e2343" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/9dd73a03951357922d8aee6cc084500de93e2343", - "reference": "9dd73a03951357922d8aee6cc084500de93e2343", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5", - "psr/log": "^1.0", - "symfony/process": "^2.5 || ^3.0" - }, - "suggest": { - "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "time": "2017-09-11T07:24:36+00:00" - }, { "name": "doctrine/annotations", - "version": "v1.5.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "5beebb01b025c94e93686b7a0ed3edae81fe3e7f" + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5beebb01b025c94e93686b7a0ed3edae81fe3e7f", - "reference": "5beebb01b025c94e93686b7a0ed3edae81fe3e7f", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", "shasum": "" }, "require": { @@ -85,12 +26,12 @@ }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^5.7" + "phpunit/phpunit": "^6.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { @@ -131,7 +72,7 @@ "docblock", "parser" ], - "time": "2017-07-22T10:58:02+00:00" + "time": "2017-12-06T07:11:42+00:00" }, { "name": "doctrine/cache", @@ -349,16 +290,16 @@ }, { "name": "doctrine/dbal", - "version": "v2.6.2", + "version": "v2.6.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "1a4ee83a5a709555f2c6f9057a3aacf892451c7e" + "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/1a4ee83a5a709555f2c6f9057a3aacf892451c7e", - "reference": "1a4ee83a5a709555f2c6f9057a3aacf892451c7e", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/e3eed9b1facbb0ced3a0995244843a189e7d1b13", + "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13", "shasum": "" }, "require": { @@ -418,41 +359,45 @@ "persistence", "queryobject" ], - "time": "2017-08-28T11:02:56+00:00" + "time": "2017-11-19T13:38:54+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "1.7.2", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "41d6b7c9a1a37e08ab1c321193446c12d6afb5ed" + "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/41d6b7c9a1a37e08ab1c321193446c12d6afb5ed", - "reference": "41d6b7c9a1a37e08ab1c321193446c12d6afb5ed", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87", + "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87", "shasum": "" }, "require": { "doctrine/dbal": "^2.5.12", "doctrine/doctrine-cache-bundle": "~1.2", - "jdorn/sql-formatter": "~1.1", - "php": "^7.1", + "jdorn/sql-formatter": "^1.2.16", + "php": "^5.5.9|^7.0", "symfony/console": "~2.7|~3.0|~4.0", "symfony/dependency-injection": "~2.7|~3.0|~4.0", "symfony/doctrine-bridge": "~2.7|~3.0|~4.0", "symfony/framework-bundle": "~2.7|~3.0|~4.0" }, + "conflict": { + "symfony/http-foundation": "<2.6" + }, "require-dev": { "doctrine/orm": "~2.3", - "phpunit/phpunit": "^6.1", + "phpunit/phpunit": "^4.8.36|^5.7|^6.4", "satooshi/php-coveralls": "^1.0", "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", "symfony/property-info": "~2.8|~3.0|~4.0", "symfony/validator": "~2.7|~3.0|~4.0", + "symfony/web-profiler-bundle": "~2.7|~3.0|~4.0", "symfony/yaml": "~2.7|~3.0|~4.0", - "twig/twig": "~1.12|~2.0" + "twig/twig": "~1.26|~2.0" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -461,7 +406,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -499,7 +444,7 @@ "orm", "persistence" ], - "time": "2017-10-24T15:58:25+00:00" + "time": "2017-11-24T13:09:19+00:00" }, { "name": "doctrine/doctrine-cache-bundle", @@ -766,38 +711,40 @@ }, { "name": "doctrine/orm", - "version": "v2.5.12", + "version": "v2.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "984535cadc609e9eef8c89414aa3568ee97aa79f" + "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/984535cadc609e9eef8c89414aa3568ee97aa79f", - "reference": "984535cadc609e9eef8c89414aa3568ee97aa79f", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/374e7ace49d864dad8cddbc55346447c8a6a2083", + "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083", "shasum": "" }, "require": { - "doctrine/cache": "~1.4", - "doctrine/collections": "~1.2", - "doctrine/common": ">=2.5-dev,<2.9-dev", - "doctrine/dbal": ">=2.5-dev,<2.7-dev", - "doctrine/instantiator": "^1.0.1", + "doctrine/annotations": "~1.5", + "doctrine/cache": "~1.6", + "doctrine/collections": "^1.4", + "doctrine/common": "^2.7.1", + "doctrine/dbal": "^2.6", + "doctrine/instantiator": "~1.1", "ext-pdo": "*", - "php": ">=5.4", - "symfony/console": "~2.5|~3.0|~4.0" + "php": "^7.1", + "symfony/console": "~3.0|~4.0" }, "require-dev": { - "phpunit/phpunit": "~4.0", - "symfony/yaml": "~2.3|~3.0|~4.0" + "doctrine/coding-standard": "^1.0", + "phpunit/phpunit": "^6.5", + "squizlabs/php_codesniffer": "^3.2", + "symfony/yaml": "~3.4|~4.0" }, "suggest": { "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" }, "bin": [ - "bin/doctrine", - "bin/doctrine.php" + "bin/doctrine" ], "type": "library", "extra": { @@ -806,8 +753,8 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\ORM\\": "lib/" + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" } }, "notification-url": "https://packagist.org/downloads/", @@ -830,6 +777,10 @@ { "name": "Jonathan Wage", "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], "description": "Object-Relational-Mapper for PHP", @@ -838,116 +789,63 @@ "database", "orm" ], - "time": "2017-10-23T18:21:04+00:00" - }, - { - "name": "fig/link-util", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/link-util.git", - "reference": "1a07821801a148be4add11ab0603e4af55a72fac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac", - "reference": "1a07821801a148be4add11ab0603e4af55a72fac", - "shasum": "" - }, - "require": { - "php": ">=5.5.0", - "psr/link": "~1.0@dev" - }, - "require-dev": { - "phpunit/phpunit": "^5.1", - "squizlabs/php_codesniffer": "^2.3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Fig\\Link\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common utility implementations for HTTP links", - "keywords": [ - "http", - "http-link", - "link", - "psr", - "psr-13", - "rest" - ], - "time": "2016-10-17T18:31:11+00:00" + "time": "2017-12-20T00:38:15+00:00" }, { "name": "friendsofsymfony/rest-bundle", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git", - "reference": "d62a6c0f4bc699f899865d7e7bc7a4186aef9a86" + "reference": "24422b0b0ba3dcfe0649abb8637f92a101e9981a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/d62a6c0f4bc699f899865d7e7bc7a4186aef9a86", - "reference": "d62a6c0f4bc699f899865d7e7bc7a4186aef9a86", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/24422b0b0ba3dcfe0649abb8637f92a101e9981a", + "reference": "24422b0b0ba3dcfe0649abb8637f92a101e9981a", "shasum": "" }, "require": { "doctrine/inflector": "^1.0", "php": "^5.5.9|~7.0", "psr/log": "^1.0", - "symfony/config": "^2.7|^3.0", - "symfony/debug": "^2.7|^3.0", - "symfony/dependency-injection": "^2.7|^3.0", - "symfony/event-dispatcher": "^2.7|^3.0", - "symfony/finder": "^2.7|^3.0", - "symfony/framework-bundle": "^2.7|^3.0", - "symfony/http-foundation": "^2.7|^3.0", - "symfony/http-kernel": "^2.7|^3.0", - "symfony/routing": "^2.7|^3.0", - "symfony/security-core": "^2.7|^3.0", - "symfony/templating": "^2.7|^3.0", + "symfony/config": "^2.7|^3.0|^4.0", + "symfony/debug": "^2.7|^3.0|^4.0", + "symfony/dependency-injection": "^2.7|^3.0|^4.0", + "symfony/event-dispatcher": "^2.7|^3.0|^4.0", + "symfony/finder": "^2.7|^3.0|^4.0", + "symfony/framework-bundle": "^2.7|^3.0|^4.0", + "symfony/http-foundation": "^2.7|^3.0|^4.0", + "symfony/http-kernel": "^2.7|^3.0|^4.0", + "symfony/routing": "^2.7|^3.0|^4.0", + "symfony/security-core": "^2.7|^3.0|^4.0", + "symfony/templating": "^2.7|^3.0|^4.0", "willdurand/jsonp-callback-validator": "^1.0", "willdurand/negotiation": "^2.0" }, "conflict": { "jms/serializer": "1.3.0", + "jms/serializer-bundle": "<1.2.0", "sensio/framework-extra-bundle": "<3.0.13" }, "require-dev": { - "jms/serializer-bundle": "^1.0", + "jms/serializer-bundle": "^1.2|^2.0", "phpoption/phpoption": "^1.1", "psr/http-message": "^1.0", - "sensio/framework-extra-bundle": "^3.0.13", - "symfony/asset": "^2.7|^3.0", - "symfony/browser-kit": "^2.7|^3.0", - "symfony/css-selector": "^2.7|^3.0", - "symfony/dependency-injection": "^2.7|^3.0", - "symfony/expression-language": "~2.7|^3.0", - "symfony/form": "^2.7|^3.0", - "symfony/phpunit-bridge": "^3.2", - "symfony/security-bundle": "^2.7|^3.0", - "symfony/serializer": "^2.7.11|^3.0.4", - "symfony/twig-bundle": "^2.7|^3.0", - "symfony/validator": "^2.7|^3.0", - "symfony/web-profiler-bundle": "^2.7|^3.0", - "symfony/yaml": "^2.7|^3.0" + "sensio/framework-extra-bundle": "^3.0.13|^4.0|^5.0", + "symfony/asset": "^2.7|^3.0|^4.0", + "symfony/browser-kit": "^2.7|^3.0|^4.0", + "symfony/css-selector": "^2.7|^3.0|^4.0", + "symfony/dependency-injection": "^2.7|^3.0|^4.0", + "symfony/expression-language": "~2.7|^3.0|^4.0", + "symfony/form": "^2.7|^3.0|^4.0", + "symfony/phpunit-bridge": "^3.2|^4.0", + "symfony/security-bundle": "^2.7|^3.0|^4.0", + "symfony/serializer": "^2.7.11|^3.0.4|^4.0", + "symfony/twig-bundle": "^2.7|^3.0|^4.0", + "symfony/validator": "^2.7|^3.0|^4.0", + "symfony/web-profiler-bundle": "^2.7|^3.0|^4.0", + "symfony/yaml": "^2.7|^3.0|^4.0" }, "suggest": { "jms/serializer-bundle": "Add support for advanced serialization capabilities, recommended, requires ^1.0", @@ -959,7 +857,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-master": "2.3-dev" } }, "autoload": { @@ -993,58 +891,7 @@ "keywords": [ "rest" ], - "time": "2017-04-06T12:55:03+00:00" - }, - { - "name": "incenteev/composer-parameter-handler", - "version": "v2.1.2", - "source": { - "type": "git", - "url": "https://github.com/Incenteev/ParameterHandler.git", - "reference": "d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc", - "reference": "d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/yaml": "~2.3|~3.0" - }, - "require-dev": { - "composer/composer": "1.0.*@dev", - "phpspec/prophecy-phpunit": "~1.0", - "symfony/filesystem": "~2.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Incenteev\\ParameterHandler\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christophe Coevoet", - "email": "stof@notk.org" - } - ], - "description": "Composer script handling your ignored parameter file", - "homepage": "https://github.com/Incenteev/ParameterHandler", - "keywords": [ - "parameters management" - ], - "time": "2015-11-10T17:04:01+00:00" + "time": "2017-11-28T07:59:44+00:00" }, { "name": "jdorn/sql-formatter", @@ -1184,16 +1031,16 @@ }, { "name": "jms/serializer", - "version": "1.9.1", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "e708d6ef549044974b60a57fdcec2fa165436d57" + "reference": "62c7ff6d61f8692eac8be024c542b3d9d0ab8c8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/e708d6ef549044974b60a57fdcec2fa165436d57", - "reference": "e708d6ef549044974b60a57fdcec2fa165436d57", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/62c7ff6d61f8692eac8be024c542b3d9d0ab8c8a", + "reference": "62c7ff6d61f8692eac8be024c542b3d9d0ab8c8a", "shasum": "" }, "require": { @@ -1216,6 +1063,8 @@ "jackalope/jackalope-doctrine-dbal": "^1.1.5", "phpunit/phpunit": "^4.8|^5.0", "propel/propel1": "~1.7", + "psr/container": "^1.0", + "symfony/dependency-injection": "^2.7|^3.3|^4.0", "symfony/expression-language": "^2.6|^3.0", "symfony/filesystem": "^2.1", "symfony/form": "~2.1|^3.0", @@ -1232,7 +1081,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.10-dev" } }, "autoload": { @@ -1263,51 +1112,47 @@ "serialization", "xml" ], - "time": "2017-10-27T07:15:54+00:00" + "time": "2017-11-30T18:23:40+00:00" }, { "name": "jms/serializer-bundle", - "version": "2.2.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/schmittjoh/JMSSerializerBundle.git", - "reference": "dd40bfcb58ce01a950393f258d3d02a8dc4f4127" + "reference": "9dec7ab62248aa97f33cce70c301af15154f8f0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/JMSSerializerBundle/zipball/dd40bfcb58ce01a950393f258d3d02a8dc4f4127", - "reference": "dd40bfcb58ce01a950393f258d3d02a8dc4f4127", + "url": "https://api.github.com/repos/schmittjoh/JMSSerializerBundle/zipball/9dec7ab62248aa97f33cce70c301af15154f8f0b", + "reference": "9dec7ab62248aa97f33cce70c301af15154f8f0b", "shasum": "" }, "require": { - "jms/serializer": "^1.9", + "jms/serializer": "^1.10", "php": "^5.4|^7.0", "phpoption/phpoption": "^1.1.0", "symfony/framework-bundle": "~2.3|~3.0|~4.0" }, "require-dev": { - "doctrine/doctrine-bundle": "*", "doctrine/orm": "*", "phpunit/phpunit": "^4.8.35|^5.4.3|^6.0", - "symfony/browser-kit": "*", - "symfony/class-loader": "*", - "symfony/css-selector": "*", "symfony/expression-language": "~2.6|~3.0|~4.0", - "symfony/finder": "*", + "symfony/finder": "^2.3|^3.0|^4.0", "symfony/form": "*", - "symfony/process": "*", "symfony/stopwatch": "*", "symfony/twig-bundle": "*", "symfony/validator": "*", "symfony/yaml": "*" }, "suggest": { - "jms/di-extra-bundle": "Required to get lazy loading (de)serialization visitors, ~1.3" + "jms/di-extra-bundle": "Required to get lazy loading (de)serialization visitors, ~1.3", + "symfony/finder": "Required for cache warmup, supported versions ^2.3|^3.0|^4.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "2.3-dev" } }, "autoload": { @@ -1341,133 +1186,7 @@ "serialization", "xml" ], - "time": "2017-09-29T08:48:26+00:00" - }, - { - "name": "monolog/monolog", - "version": "1.23.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "jakub-onderka/php-parallel-lint": "0.9", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpunit/phpunit": "~4.5", - "phpunit/phpunit-mock-objects": "2.3.0", - "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "time": "2017-06-19T01:22:40+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v2.0.11", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", - "shasum": "" - }, - "require": { - "php": ">=5.2.0" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "pseudorandom", - "random" - ], - "time": "2017-09-27T21:40:39+00:00" + "time": "2017-12-08T19:49:08+00:00" }, { "name": "phpcollection/phpcollection", @@ -1712,55 +1431,6 @@ ], "time": "2017-02-14T16:28:37+00:00" }, - { - "name": "psr/link", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/link.git", - "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562", - "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Link\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for HTTP links", - "keywords": [ - "http", - "http-link", - "link", - "psr", - "psr-13", - "rest" - ], - "time": "2016-10-28T16:06:13+00:00" - }, { "name": "psr/log", "version": "1.0.2", @@ -1857,38 +1527,45 @@ "time": "2017-01-02T13:31:39+00:00" }, { - "name": "sensio/distribution-bundle", - "version": "v5.0.21", + "name": "snc/redis-bundle", + "version": "2.0.6", "source": { "type": "git", - "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", - "reference": "eb6266b3b472e4002538610b28a0a04bcf94891a" + "url": "https://github.com/snc/SncRedisBundle.git", + "reference": "73c87c435f87e08c2d564c3d9ad35f38cd8d3a0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a", - "reference": "eb6266b3b472e4002538610b28a0a04bcf94891a", + "url": "https://api.github.com/repos/snc/SncRedisBundle/zipball/73c87c435f87e08c2d564c3d9ad35f38cd8d3a0e", + "reference": "73c87c435f87e08c2d564c3d9ad35f38cd8d3a0e", "shasum": "" }, "require": { - "php": ">=5.3.9", - "sensiolabs/security-checker": "~3.0|~4.0", - "symfony/class-loader": "~2.3|~3.0", - "symfony/config": "~2.3|~3.0", - "symfony/dependency-injection": "~2.3|~3.0", - "symfony/filesystem": "~2.3|~3.0", - "symfony/http-kernel": "~2.3|~3.0", - "symfony/process": "~2.3|~3.0" + "php": ">=5.3.3", + "symfony/framework-bundle": "^2.7 || ^3.0 || ^4.0", + "symfony/yaml": "^2.7 || ^3.0 || ^4.0" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^4.8 || ^5.4", + "predis/predis": "^1.0", + "symfony/console": "^2.7 || ^3.0 || ^4.0", + "symfony/phpunit-bridge": "^2.7 || ^3.0 || ^4.0" + }, + "suggest": { + "monolog/monolog": "If you want to use the monolog redis handler.", + "predis/predis": "If you want to use predis.", + "symfony/console": "If you want to use commands to interact with the redis database" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Sensio\\Bundle\\DistributionBundle\\": "" + "Snc\\RedisBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1897,69 +1574,133 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Henrik Westphal", + "email": "henrik.westphal@gmail.com" + }, + { + "name": "Community contributors", + "homepage": "https://github.com/snc/SncRedisBundle/contributors" } ], - "description": "Base bundle for Symfony Distributions", + "description": "A Redis bundle for Symfony", + "homepage": "https://github.com/snc/SncRedisBundle", "keywords": [ - "configuration", - "distribution" + "nosql", + "redis", + "symfony" ], - "time": "2017-08-25T16:55:44+00:00" + "time": "2017-12-01T10:40:06+00:00" }, { - "name": "sensio/framework-extra-bundle", - "version": "v3.0.28", + "name": "symfony/cache", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "65eadf9e3fd5c47eee7986b306a5aed8affe6496" + "url": "https://github.com/symfony/cache.git", + "reference": "d00351f230ca037ca13f6fec3411e002043f7421" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/65eadf9e3fd5c47eee7986b306a5aed8affe6496", - "reference": "65eadf9e3fd5c47eee7986b306a5aed8affe6496", + "url": "https://api.github.com/repos/symfony/cache/zipball/d00351f230ca037ca13f6fec3411e002043f7421", + "reference": "d00351f230ca037ca13f6fec3411e002043f7421", "shasum": "" }, "require": { - "doctrine/common": "~2.2", - "symfony/dependency-injection": "~2.3|~3.0", - "symfony/framework-bundle": "~2.3|~3.0|~4.0" + "php": "^7.1.3", + "psr/cache": "~1.0", + "psr/log": "~1.0", + "psr/simple-cache": "^1.0" + }, + "conflict": { + "symfony/var-dumper": "<3.4" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" }, "require-dev": { - "doctrine/doctrine-bundle": "~1.5", - "doctrine/orm": "~2.4,>=2.4.5", - "symfony/asset": "~2.7|~3.0|~4.0", - "symfony/browser-kit": "~2.3|~3.0|~4.0", - "symfony/dom-crawler": "~2.3|~3.0|~4.0", - "symfony/expression-language": "~2.4|~3.0|~4.0", - "symfony/finder": "~2.3|~3.0|~4.0", - "symfony/phpunit-bridge": "~3.2|~4.0", - "symfony/psr-http-message-bridge": "^0.3|^1.0", - "symfony/security-bundle": "~2.4|~3.0|~4.0", - "symfony/templating": "~2.3|~3.0|~4.0", - "symfony/translation": "~2.3|~3.0|~4.0", - "symfony/twig-bundle": "~2.3|~3.0|~4.0", - "symfony/yaml": "~2.3|~3.0|~4.0", - "twig/twig": "~1.12|~2.0", - "zendframework/zend-diactoros": "^1.3" + "cache/integration-tests": "dev-master", + "doctrine/cache": "~1.6", + "doctrine/dbal": "~2.4", + "predis/predis": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "time": "2017-12-08T16:11:45+00:00" + }, + { + "name": "symfony/config", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "0356e6d5298e9e72212c0bad65c2f1b49e42d622" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/0356e6d5298e9e72212c0bad65c2f1b49e42d622", + "reference": "0356e6d5298e9e72212c0bad65c2f1b49e42d622", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/filesystem": "~3.4|~4.0" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/finder": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" }, "suggest": { - "symfony/expression-language": "", - "symfony/psr-http-message-bridge": "To use the PSR-7 converters", - "symfony/security-bundle": "" + "symfony/yaml": "To use the yaml reference dumper" }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Sensio\\Bundle\\FrameworkExtraBundle\\": "" - } + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1969,47 +1710,122 @@ { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "This bundle provides a way to configure your controllers with annotations", - "keywords": [ - "annotations", - "controllers" - ], - "time": "2017-10-12T17:37:20+00:00" + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" }, { - "name": "sensiolabs/security-checker", - "version": "v4.1.6", + "name": "symfony/console", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/sensiolabs/security-checker.git", - "reference": "387b6a3b723ba35588b33d5f8d14e28ed608bd30" + "url": "https://github.com/symfony/console.git", + "reference": "de8cf039eacdec59d83f7def67e3b8ff5ed46714" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/387b6a3b723ba35588b33d5f8d14e28ed608bd30", - "reference": "387b6a3b723ba35588b33d5f8d14e28ed608bd30", + "url": "https://api.github.com/repos/symfony/console/zipball/de8cf039eacdec59d83f7def67e3b8ff5ed46714", + "reference": "de8cf039eacdec59d83f7def67e3b8ff5ed46714", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.0", - "symfony/console": "~2.7|~3.0|~4.0" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" }, - "bin": [ - "security-checker" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.0-dev" } }, "autoload": { - "psr-0": { - "SensioLabs\\Security": "" + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "8c3e709209ce3b952a31c0f4a31ac7703c3d0226" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/8c3e709209ce3b952a31c0f4a31ac7703c3d0226", + "reference": "8c3e709209ce3b952a31c0f4a31ac7703c3d0226", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" } }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -2017,53 +1833,69 @@ "authors": [ { "name": "Fabien Potencier", - "email": "fabien.potencier@gmail.com" + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A security checker for your composer.lock", - "time": "2017-10-29T18:48:08+00:00" + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2017-12-12T08:41:51+00:00" }, { - "name": "snc/redis-bundle", - "version": "2.0.4", + "name": "symfony/dependency-injection", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/snc/SncRedisBundle.git", - "reference": "3fa62af06b9eb98cfb5a5a85ad4f7ec89ac1c8a2" + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "d2fa088b5fd7d429974a36bf1a9846b912d9d124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/snc/SncRedisBundle/zipball/3fa62af06b9eb98cfb5a5a85ad4f7ec89ac1c8a2", - "reference": "3fa62af06b9eb98cfb5a5a85ad4f7ec89ac1c8a2", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d2fa088b5fd7d429974a36bf1a9846b912d9d124", + "reference": "d2fa088b5fd7d429974a36bf1a9846b912d9d124", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/framework-bundle": "^2.7 || ^3.0", - "symfony/yaml": "^2.7 || ^3.0" + "php": "^7.1.3", + "psr/container": "^1.0" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0" }, "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "4.8.*", - "predis/predis": "^1.0", - "symfony/console": "^2.7 || ^3.0", - "symfony/phpunit-bridge": "^2.7 || ^3.0" + "symfony/config": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" }, "suggest": { - "monolog/monolog": "If you want to use the monolog redis handler.", - "predis/predis": "If you want to use predis.", - "symfony/console": "If you want to use commands to interact with the redis database" + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Snc\\RedisBundle\\": "" - } + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2071,53 +1903,140 @@ ], "authors": [ { - "name": "Henrik Westphal", - "email": "henrik.westphal@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Community contributors", - "homepage": "https://github.com/snc/SncRedisBundle/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A Redis bundle for Symfony", - "homepage": "https://github.com/snc/SncRedisBundle", - "keywords": [ - "nosql", - "redis", - "symfony" + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "d14c17af9290634eb1588b75ed64a64ee286ba3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d14c17af9290634eb1588b75ed64a64ee286ba3e", + "reference": "d14c17af9290634eb1588b75ed64a64ee286ba3e", + "shasum": "" + }, + "require": { + "doctrine/common": "~2.4", + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4" + }, + "require-dev": { + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": "~2.4", + "doctrine/orm": "^2.4.5", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/property-access": "~3.4|~4.0", + "symfony/property-info": "~3.4|~4.0", + "symfony/proxy-manager-bridge": "~3.4|~4.0", + "symfony/security": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "time": "2017-10-02T10:10:06+00:00" + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Bridge", + "homepage": "https://symfony.com", + "time": "2017-12-09T12:13:31+00:00" }, { - "name": "swiftmailer/swiftmailer", - "version": "v5.4.8", + "name": "symfony/event-dispatcher", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517", - "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d4face19ed8002eec8280bc1c5ec18130472bf43", + "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.1.3" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" }, "require-dev": { - "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "~3.2" + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { - "files": [ - "lib/swift_required.php" + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2126,111 +2045,309 @@ ], "authors": [ { - "name": "Chris Corbyn" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "8c2868641d0c4885eee9c12a89c2b695eb1985cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/8c2868641d0c4885eee9c12a89c2b695eb1985cd", + "reference": "8c2868641d0c4885eee9c12a89c2b695eb1985cd", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.org", - "keywords": [ - "email", - "mail", - "mailer" + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c", + "reference": "c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } ], - "time": "2017-05-01T15:54:03+00:00" + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2017-11-07T14:45:01+00:00" }, { - "name": "symfony/monolog-bundle", - "version": "v3.1.1", + "name": "symfony/flex", + "version": "v1.0.53", "source": { "type": "git", - "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "80c82d7d41c4eed0bf27e215f27531c05b217c17" + "url": "https://github.com/symfony/flex.git", + "reference": "cc4b1bac464597ce220d4f8208c38c75195e80c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/80c82d7d41c4eed0bf27e215f27531c05b217c17", - "reference": "80c82d7d41c4eed0bf27e215f27531c05b217c17", + "url": "https://api.github.com/repos/symfony/flex/zipball/cc4b1bac464597ce220d4f8208c38c75195e80c2", + "reference": "cc4b1bac464597ce220d4f8208c38c75195e80c2", "shasum": "" }, "require": { - "monolog/monolog": "~1.22", - "php": ">=5.3.2", - "symfony/config": "~2.7|~3.0|~4.0", - "symfony/dependency-injection": "~2.7|~3.0|~4.0", - "symfony/http-kernel": "~2.7|~3.0|~4.0", - "symfony/monolog-bridge": "~2.7|~3.0|~4.0" + "composer-plugin-api": "^1.1", + "php": "^7.0" + }, + "require-dev": { + "composer/composer": "^1.4", + "symfony/phpunit-bridge": "^3.2.8" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "time": "2017-12-27T16:06:01+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "82e45a486a2cbdab5d43512bea10af1681dcd8e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/82e45a486a2cbdab5d43512bea10af1681dcd8e2", + "reference": "82e45a486a2cbdab5d43512bea10af1681dcd8e2", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^7.1.3", + "symfony/cache": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/filesystem": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "~3.4|~4.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.0", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/asset": "<3.4", + "symfony/console": "<3.4", + "symfony/form": "<3.4", + "symfony/property-info": "<3.4", + "symfony/serializer": "<3.4", + "symfony/stopwatch": "<3.4", + "symfony/translation": "<3.4", + "symfony/validator": "<3.4", + "symfony/workflow": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "fig/link-util": "^1.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/asset": "~3.4|~4.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "~3.4|~4.0", + "symfony/property-info": "~3.4|~4.0", + "symfony/security": "~3.4|~4.0", + "symfony/security-core": "~3.4|~4.0", + "symfony/security-csrf": "~3.4|~4.0", + "symfony/serializer": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/web-link": "~3.4|~4.0", + "symfony/workflow": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" }, - "require-dev": { - "phpunit/phpunit": "^4.8", - "symfony/console": "~2.3|~3.0|~4.0", - "symfony/yaml": "~2.3|~3.0|~4.0" + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Bundle\\MonologBundle\\": "" - } + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony MonologBundle", - "homepage": "http://symfony.com", - "keywords": [ - "log", - "logging" - ], - "time": "2017-09-26T03:17:02+00:00" + "description": "Symfony FrameworkBundle", + "homepage": "https://symfony.com", + "time": "2017-12-15T01:44:28+00:00" }, { - "name": "symfony/polyfill-apcu", - "version": "v1.6.0", + "name": "symfony/http-foundation", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-apcu.git", - "reference": "04f62674339602def515bff4bc6901fc1d4951e8" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "aba96bd07be7796c81ca0ceafa7d48a6fef036c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/04f62674339602def515bff4bc6901fc1d4951e8", - "reference": "04f62674339602def515bff4bc6901fc1d4951e8", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/aba96bd07be7796c81ca0ceafa7d48a6fef036c8", + "reference": "aba96bd07be7796c81ca0ceafa7d48a6fef036c8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "symfony/expression-language": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Apcu\\": "" + "Symfony\\Component\\HttpFoundation\\": "" }, - "files": [ - "bootstrap.php" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2239,55 +2356,84 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions", + "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "keywords": [ - "apcu", - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2017-12-14T19:48:22+00:00" }, { - "name": "symfony/polyfill-intl-icu", - "version": "v1.6.0", + "name": "symfony/http-kernel", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "d2bb2ef00dd8605d6fbd4db53ed4af1395953497" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d2bb2ef00dd8605d6fbd4db53ed4af1395953497", - "reference": "d2bb2ef00dd8605d6fbd4db53ed4af1395953497", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5", + "reference": "f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/intl": "~2.3|~3.0|~4.0" + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/var-dumper": "<3.4", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "symfony/routing": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0" }, "suggest": { - "ext-intl": "For best performance" + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/var-dumper": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "4.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2296,102 +2442,129 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's ICU-related data and classes", + "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "icu", - "intl", - "polyfill", - "portable", - "shim" - ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2017-12-15T03:06:17+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.6.0", + "name": "symfony/lts", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" + "url": "https://github.com/symfony/lts.git", + "reference": "396c5fca8d73d01186df37d7031321a3c0c2bf92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", - "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "url": "https://api.github.com/repos/symfony/lts/zipball/396c5fca8d73d01186df37d7031321a3c0c2bf92", + "reference": "396c5fca8d73d01186df37d7031321a3c0c2bf92", "shasum": "" }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", + "conflict": { + "symfony/asset": ">=5", + "symfony/browser-kit": ">=5", + "symfony/cache": ">=5", + "symfony/class-loader": ">=5", + "symfony/config": ">=5", + "symfony/console": ">=5", + "symfony/css-selector": ">=5", + "symfony/debug": ">=5", + "symfony/debug-bundle": ">=5", + "symfony/dependency-injection": ">=5", + "symfony/doctrine-bridge": ">=5", + "symfony/dom-crawler": ">=5", + "symfony/dotenv": ">=5", + "symfony/event-dispatcher": ">=5", + "symfony/expression-language": ">=5", + "symfony/filesystem": ">=5", + "symfony/finder": ">=5", + "symfony/form": ">=5", + "symfony/framework-bundle": ">=5", + "symfony/http-foundation": ">=5", + "symfony/http-kernel": ">=5", + "symfony/inflector": ">=5", + "symfony/intl": ">=5", + "symfony/ldap": ">=5", + "symfony/lock": ">=5", + "symfony/monolog-bridge": ">=5", + "symfony/options-resolver": ">=5", + "symfony/process": ">=5", + "symfony/property-access": ">=5", + "symfony/property-info": ">=5", + "symfony/proxy-manager-bridge": ">=5", + "symfony/routing": ">=5", + "symfony/security": ">=5", + "symfony/security-bundle": ">=5", + "symfony/security-core": ">=5", + "symfony/security-csrf": ">=5", + "symfony/security-guard": ">=5", + "symfony/security-http": ">=5", + "symfony/serializer": ">=5", + "symfony/stopwatch": ">=5", + "symfony/symfony": ">=5", + "symfony/templating": ">=5", + "symfony/translation": ">=5", + "symfony/twig-bridge": ">=5", + "symfony/twig-bundle": ">=5", + "symfony/validator": ">=5", + "symfony/var-dumper": ">=5", + "symfony/web-link": ">=5", + "symfony/web-profiler-bundle": ">=5", + "symfony/web-server-bundle": ">=5", + "symfony/workflow": ">=5", + "symfony/yaml": ">=5" + }, + "type": "metapackage", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "4-dev" } }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Enforces Long Term Supported versions of Symfony components", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2017-10-19T02:16:32+00:00" }, { - "name": "symfony/polyfill-php56", + "name": "symfony/polyfill-mbstring", "version": "v1.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "265fc96795492430762c29be291a371494ba3a5b" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/265fc96795492430762c29be291a371494ba3a5b", - "reference": "265fc96795492430762c29be291a371494ba3a5b", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/polyfill-util": "~1.0" + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", "extra": { @@ -2401,7 +2574,7 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php56\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" @@ -2421,10 +2594,11 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", + "mbstring", "polyfill", "portable", "shim" @@ -2432,38 +2606,57 @@ "time": "2017-10-11T12:05:26+00:00" }, { - "name": "symfony/polyfill-php70", - "version": "v1.6.0", + "name": "symfony/routing", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff" + "url": "https://github.com/symfony/routing.git", + "reference": "972810def5cae044d19195045f7eb418141bf37b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", - "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", + "url": "https://api.github.com/repos/symfony/routing/zipball/972810def5cae044d19195045f7eb418141bf37b", + "reference": "972810def5cae044d19195045f7eb418141bf37b", "shasum": "" }, "require": { - "paragonie/random_compat": "~1.0|~2.0", - "php": ">=5.3.3" + "php": "^7.1.3" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/dependency-injection": "For loading routes from a service", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" + "Symfony\\Component\\Routing\\": "" }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2472,51 +2665,71 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "description": "Symfony Routing Component", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "router", + "routing", + "uri", + "url" ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2017-12-14T22:39:22+00:00" }, { - "name": "symfony/polyfill-util", - "version": "v1.6.0", + "name": "symfony/security-core", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-util.git", - "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176" + "url": "https://github.com/symfony/security-core.git", + "reference": "861b9fb45135c7ef35a8058769211492eb1a0409" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/6e719200c8e540e0c0effeb31f96bdb344b94176", - "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176", + "url": "https://api.github.com/repos/symfony/security-core/zipball/861b9fb45135c7ef35a8058769211492eb1a0409", + "reference": "861b9fb45135c7ef35a8058769211492eb1a0409", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.1.3" + }, + "require-dev": { + "psr/container": "^1.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/ldap": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0" + }, + "suggest": { + "psr/container": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Util\\": "" - } + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2524,213 +2737,111 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony utilities for portability of PHP codes", + "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", - "keywords": [ - "compat", - "compatibility", - "polyfill", - "shim" - ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2017-12-14T19:48:22+00:00" }, { - "name": "symfony/swiftmailer-bundle", - "version": "v2.6.7", + "name": "symfony/templating", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/swiftmailer-bundle.git", - "reference": "c4808f5169efc05567be983909d00f00521c53ec" + "url": "https://github.com/symfony/templating.git", + "reference": "9651f8ee0ebe868571edda29f62f49eafc58b7b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec", - "reference": "c4808f5169efc05567be983909d00f00521c53ec", + "url": "https://api.github.com/repos/symfony/templating/zipball/9651f8ee0ebe868571edda29f62f49eafc58b7b3", + "reference": "9651f8ee0ebe868571edda29f62f49eafc58b7b3", "shasum": "" }, "require": { - "php": ">=5.3.2", - "swiftmailer/swiftmailer": "~4.2|~5.0", - "symfony/config": "~2.7|~3.0", - "symfony/dependency-injection": "~2.7|~3.0", - "symfony/http-kernel": "~2.7|~3.0" + "php": "^7.1.3" }, "require-dev": { - "symfony/console": "~2.7|~3.0", - "symfony/framework-bundle": "~2.7|~3.0", - "symfony/phpunit-bridge": "~3.3@dev", - "symfony/yaml": "~2.7|~3.0" + "psr/log": "~1.0" }, "suggest": { - "psr/log": "Allows logging" + "psr/log": "For using debug logging in loaders" }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Bundle\\SwiftmailerBundle\\": "" - } + "Symfony\\Component\\Templating\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony SwiftmailerBundle", - "homepage": "http://symfony.com", - "time": "2017-10-19T01:06:41+00:00" + "description": "Symfony Templating Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" }, { - "name": "symfony/symfony", - "version": "v3.3.10", + "name": "symfony/yaml", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/symfony.git", - "reference": "cfef3b2d505ae4375b17032bd03ed9a3da4b7b43" + "url": "https://github.com/symfony/yaml.git", + "reference": "a5ee52d155f06ad23b19eb63c31228ff56ad1116" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/cfef3b2d505ae4375b17032bd03ed9a3da4b7b43", - "reference": "cfef3b2d505ae4375b17032bd03ed9a3da4b7b43", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a5ee52d155f06ad23b19eb63c31228ff56ad1116", + "reference": "a5ee52d155f06ad23b19eb63c31228ff56ad1116", "shasum": "" }, "require": { - "doctrine/common": "~2.4", - "ext-xml": "*", - "fig/link-util": "^1.0", - "php": "^5.5.9|>=7.0.8", - "psr/cache": "~1.0", - "psr/container": "^1.0", - "psr/link": "^1.0", - "psr/log": "~1.0", - "psr/simple-cache": "^1.0", - "symfony/polyfill-apcu": "~1.1", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php56": "~1.0", - "symfony/polyfill-php70": "~1.0", - "symfony/polyfill-util": "~1.0", - "twig/twig": "~1.34|~2.4" + "php": "^7.1.3" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.0||>=3.2.0,<3.2.2", - "phpdocumentor/type-resolver": "<0.2.0", - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" - }, - "provide": { - "psr/cache-implementation": "1.0", - "psr/container-implementation": "1.0", - "psr/simple-cache-implementation": "1.0" - }, - "replace": { - "symfony/asset": "self.version", - "symfony/browser-kit": "self.version", - "symfony/cache": "self.version", - "symfony/class-loader": "self.version", - "symfony/config": "self.version", - "symfony/console": "self.version", - "symfony/css-selector": "self.version", - "symfony/debug": "self.version", - "symfony/debug-bundle": "self.version", - "symfony/dependency-injection": "self.version", - "symfony/doctrine-bridge": "self.version", - "symfony/dom-crawler": "self.version", - "symfony/dotenv": "self.version", - "symfony/event-dispatcher": "self.version", - "symfony/expression-language": "self.version", - "symfony/filesystem": "self.version", - "symfony/finder": "self.version", - "symfony/form": "self.version", - "symfony/framework-bundle": "self.version", - "symfony/http-foundation": "self.version", - "symfony/http-kernel": "self.version", - "symfony/inflector": "self.version", - "symfony/intl": "self.version", - "symfony/ldap": "self.version", - "symfony/monolog-bridge": "self.version", - "symfony/options-resolver": "self.version", - "symfony/process": "self.version", - "symfony/property-access": "self.version", - "symfony/property-info": "self.version", - "symfony/proxy-manager-bridge": "self.version", - "symfony/routing": "self.version", - "symfony/security": "self.version", - "symfony/security-bundle": "self.version", - "symfony/security-core": "self.version", - "symfony/security-csrf": "self.version", - "symfony/security-guard": "self.version", - "symfony/security-http": "self.version", - "symfony/serializer": "self.version", - "symfony/stopwatch": "self.version", - "symfony/templating": "self.version", - "symfony/translation": "self.version", - "symfony/twig-bridge": "self.version", - "symfony/twig-bundle": "self.version", - "symfony/validator": "self.version", - "symfony/var-dumper": "self.version", - "symfony/web-link": "self.version", - "symfony/web-profiler-bundle": "self.version", - "symfony/web-server-bundle": "self.version", - "symfony/workflow": "self.version", - "symfony/yaml": "self.version" + "symfony/console": "<3.4" }, "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "~1.6", - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": "~2.4", - "doctrine/doctrine-bundle": "~1.4", - "doctrine/orm": "~2.4,>=2.4.5", - "egulias/email-validator": "~1.2,>=1.2.8|~2.0", - "monolog/monolog": "~1.11", - "ocramius/proxy-manager": "~0.4|~1.0|~2.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "predis/predis": "~1.0", - "sensio/framework-extra-bundle": "^3.0.2", - "symfony/phpunit-bridge": "~3.2", - "symfony/security-acl": "~2.8|~3.0" + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/", - "Symfony\\Bridge\\Monolog\\": "src/Symfony/Bridge/Monolog/", - "Symfony\\Bridge\\ProxyManager\\": "src/Symfony/Bridge/ProxyManager/", - "Symfony\\Bridge\\Twig\\": "src/Symfony/Bridge/Twig/", - "Symfony\\Bundle\\": "src/Symfony/Bundle/", - "Symfony\\Component\\": "src/Symfony/Component/" + "Symfony\\Component\\Yaml\\": "" }, - "classmap": [ - "src/Symfony/Component/Intl/Resources/stubs" - ], "exclude-from-classmap": [ - "**/Tests/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2747,12 +2858,9 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "The Symfony PHP framework", + "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "keywords": [ - "framework" - ], - "time": "2017-10-05T23:40:32+00:00" + "time": "2017-12-12T08:41:51+00:00" }, { "name": "twig/twig", @@ -2916,31 +3024,29 @@ "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "v1.2.2", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e" + "reference": "7b76ccc8e648c4502aad7f61347326c8a072bd3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e", - "reference": "17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7b76ccc8e648c4502aad7f61347326c8a072bd3b", + "reference": "7b76ccc8e648c4502aad7f61347326c8a072bd3b", "shasum": "" }, "require": { "doctrine/common": "~2.2", - "php": "^5.6 || ^7.0" - }, - "conflict": { - "doctrine/orm": "< 2.4" + "php": "^7.1" }, "require-dev": { "doctrine/dbal": "^2.5.4", "doctrine/orm": "^2.5.4", - "phpunit/phpunit": "^5.4.6" + "phpunit/phpunit": "^6.3" }, "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", "doctrine/orm": "For loading ORM fixtures", "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" @@ -2952,8 +3058,8 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\DataFixtures": "lib/" + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" } }, "notification-url": "https://packagist.org/downloads/", @@ -2971,7 +3077,7 @@ "keywords": [ "database" ], - "time": "2016-09-20T10:07:57+00:00" + "time": "2017-11-27T18:48:06+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -3031,41 +3137,34 @@ "time": "2017-10-30T19:26:42+00:00" }, { - "name": "sensio/generator-bundle", - "version": "v3.1.6", + "name": "symfony/dotenv", + "version": "v4.0.2", "source": { "type": "git", - "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git", - "reference": "128bc5dabc91ca40b7445f094968dd70ccd58305" + "url": "https://github.com/symfony/dotenv.git", + "reference": "ffcaeab01e42b0c40669add2aa8e77f79ddb9389" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/128bc5dabc91ca40b7445f094968dd70ccd58305", - "reference": "128bc5dabc91ca40b7445f094968dd70ccd58305", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/ffcaeab01e42b0c40669add2aa8e77f79ddb9389", + "reference": "ffcaeab01e42b0c40669add2aa8e77f79ddb9389", "shasum": "" }, "require": { - "symfony/console": "~2.7|~3.0", - "symfony/framework-bundle": "~2.7|~3.0", - "symfony/process": "~2.7|~3.0", - "symfony/yaml": "~2.7|~3.0", - "twig/twig": "^1.28.2|^2.0" + "php": "^7.1.3" }, "require-dev": { - "doctrine/orm": "~2.4", - "symfony/doctrine-bridge": "~2.7|~3.0", - "symfony/filesystem": "~2.7|~3.0", - "symfony/phpunit-bridge": "^3.3" + "symfony/process": "~3.4|~4.0" }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { - "Sensio\\Bundle\\GeneratorBundle\\": "" + "Symfony\\Component\\Dotenv\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3079,23 +3178,33 @@ { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "This bundle generates code for you", - "time": "2017-07-18T07:57:44+00:00" + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2017-12-08T15:46:13+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v3.3.10", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "6e40d1c8bc4037edf3852c0b29fdd2923c4e2133" + "reference": "61c84ebdce0d4c289413a222ee545f0114e60120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/6e40d1c8bc4037edf3852c0b29fdd2923c4e2133", - "reference": "6e40d1c8bc4037edf3852c0b29fdd2923c4e2133", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/61c84ebdce0d4c289413a222ee545f0114e60120", + "reference": "61c84ebdce0d4c289413a222ee545f0114e60120", "shasum": "" }, "require": { @@ -3114,7 +3223,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3144,16 +3253,61 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2017-10-02T06:54:00+00:00" + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/thanks", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/thanks.git", + "reference": "f3e567198cbac9dbec5baf9004f1e51fecc82c79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/thanks/zipball/f3e567198cbac9dbec5baf9004f1e51fecc82c79", + "reference": "f3e567198cbac9dbec5baf9004f1e51fecc82c79", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1", + "php": "^5.5.9|^7.0.8" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "class": "Symfony\\Thanks\\Thanks" + }, + "autoload": { + "psr-4": { + "Symfony\\Thanks\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "time": "2017-12-20T21:36:05+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "symfony/lts": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.5.9" + "php": ">=7.2", + "ext-iconv": "*" }, "platform-dev": [] } diff --git a/config/bundles.php b/config/bundles.php new file mode 100644 index 00000000..8d410970 --- /dev/null +++ b/config/bundles.php @@ -0,0 +1,11 @@ + ['all' => true], + FOS\RestBundle\FOSRestBundle::class => ['all' => true], + JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true], + Snc\RedisBundle\SncRedisBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], +]; diff --git a/config/packages/dev/jms_serializer.yaml b/config/packages/dev/jms_serializer.yaml new file mode 100644 index 00000000..353e4602 --- /dev/null +++ b/config/packages/dev/jms_serializer.yaml @@ -0,0 +1,7 @@ +jms_serializer: + visitors: + json: + options: + - JSON_PRETTY_PRINT + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION diff --git a/config/packages/dev/routing.yaml b/config/packages/dev/routing.yaml new file mode 100644 index 00000000..4116679a --- /dev/null +++ b/config/packages/dev/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: true diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml new file mode 100644 index 00000000..65024cff --- /dev/null +++ b/config/packages/doctrine.yaml @@ -0,0 +1,20 @@ +doctrine: + dbal: + # configure these for your database server + driver: 'pdo_pgsql' + server_version: '10' + charset: utf8mb4 + + # With Symfony 3.3, remove the `resolve:` prefix + url: '%env(resolve:DATABASE_URL)%' + orm: + auto_generate_proxy_classes: '%kernel.debug%' + naming_strategy: doctrine.orm.naming_strategy.underscore + auto_mapping: true + mappings: + App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App diff --git a/config/packages/fos_rest.yaml b/config/packages/fos_rest.yaml new file mode 100644 index 00000000..b84bb849 --- /dev/null +++ b/config/packages/fos_rest.yaml @@ -0,0 +1,18 @@ +# Read the documentation: https://symfony.com/doc/master/bundles/FOSRestBundle/index.html +fos_rest: + body_converter: + enabled: true + validate: true + serializer: + serialize_null: true + param_fetcher_listener: true + allowed_methods_listener: true + routing_loader: + default_format: json + include_format: false + view: + view_response_listener: true + format_listener: + rules: + - { path: '^/api', priorities: ['json'], fallback_format: 'json' } + - { path: '^/', stop: true } diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml new file mode 100644 index 00000000..7b44fa66 --- /dev/null +++ b/config/packages/framework.yaml @@ -0,0 +1,6 @@ +framework: + secret: '%env(APP_SECRET)%' + session: + handler_id: snc_redis.session.handler + php_errors: + log: true diff --git a/config/packages/jms_serializer.yaml b/config/packages/jms_serializer.yaml new file mode 100644 index 00000000..32da14cf --- /dev/null +++ b/config/packages/jms_serializer.yaml @@ -0,0 +1,6 @@ +jms_serializer: + visitors: + xml: + format_output: '%kernel.debug%' + metadata: + auto_detection: true diff --git a/config/packages/prod/doctrine.yaml b/config/packages/prod/doctrine.yaml new file mode 100644 index 00000000..2f16f0fd --- /dev/null +++ b/config/packages/prod/doctrine.yaml @@ -0,0 +1,31 @@ +doctrine: + orm: + metadata_cache_driver: + type: service + id: doctrine.system_cache_provider + query_cache_driver: + type: service + id: doctrine.system_cache_provider + result_cache_driver: + type: service + id: doctrine.result_cache_provider + +services: + doctrine.result_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.result_cache_pool' + doctrine.system_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.system_cache_pool' + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/config/packages/prod/jms_serializer.yaml b/config/packages/prod/jms_serializer.yaml new file mode 100644 index 00000000..bc97faf1 --- /dev/null +++ b/config/packages/prod/jms_serializer.yaml @@ -0,0 +1,6 @@ +jms_serializer: + visitors: + json: + options: + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml new file mode 100644 index 00000000..368bc7f4 --- /dev/null +++ b/config/packages/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: ~ diff --git a/config/packages/snc_redis.yaml b/config/packages/snc_redis.yaml new file mode 100644 index 00000000..ab1d4226 --- /dev/null +++ b/config/packages/snc_redis.yaml @@ -0,0 +1,12 @@ +snc_redis: + clients: + session_client: + type: predis + logging: false + alias: session_client + dsn: '%env(REDIS_URL)%' + options: ~ + session: + client: session_client + prefix: app_session_ + ttl: 86400 diff --git a/config/packages/test/framework.yaml b/config/packages/test/framework.yaml new file mode 100644 index 00000000..8aa270e9 --- /dev/null +++ b/config/packages/test/framework.yaml @@ -0,0 +1,5 @@ +framework: + test: ~ + # Uncomment this section if you're using sessions + #session: + # storage_id: session.storage.mock_file diff --git a/config/routes.yaml b/config/routes.yaml new file mode 100644 index 00000000..c3283aa2 --- /dev/null +++ b/config/routes.yaml @@ -0,0 +1,3 @@ +#index: +# path: / +# controller: App\Controller\DefaultController::index diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml new file mode 100644 index 00000000..d49a502a --- /dev/null +++ b/config/routes/annotations.yaml @@ -0,0 +1,3 @@ +controllers: + resource: ../../src/Controller/ + type: annotation diff --git a/config/services.yaml b/config/services.yaml new file mode 100644 index 00000000..23800b49 --- /dev/null +++ b/config/services.yaml @@ -0,0 +1,27 @@ +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + public: false # Allows optimizing the container by removing unused services; this also means + # fetching services directly from the container via $container->get() won't work. + # The best practice is to be explicit about your dependencies anyway. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{Entity,Migrations,Tests}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones diff --git a/config/services_test.yaml b/config/services_test.yaml new file mode 100644 index 00000000..876c36bd --- /dev/null +++ b/config/services_test.yaml @@ -0,0 +1,9 @@ +services: + _defaults: + public: true + + # If you need to access services in a test, create an alias + # and then fetch that alias from the container. As a convention, + # aliases are prefixed with test. For example: + # + # test.App\Service\MyService: '@App\Service\MyService' diff --git a/config/webpack.conf.js b/config/webpack.conf.js new file mode 100644 index 00000000..c603b355 --- /dev/null +++ b/config/webpack.conf.js @@ -0,0 +1,77 @@ +const path = require('path'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const webpack = require('webpack'); +const autoprefixer = require('autoprefixer'); + +module.exports = { + entry: { + page1: './src/Resources/js/page1/entrypoint.js', + page2: './src/Resources/js/page2/entrypoint.js', + }, + output: { + path: path.resolve(__dirname, '../src/Resources/public'), + filename: 'js/[name].js', + }, + module: { + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader', + options: { + scss: 'style!css!sass', + }, + }, + { + test: /\.js$/, + loader: 'babel-loader', + exclude: /node_modules/, + }, + { + test: /\.s[a|c]ss$/, + use: ExtractTextPlugin.extract({ + fallback: 'style-loader', + use: [ + 'css-loader', + 'postcss-loader', + { + loader: 'postcss-loader', + options: { + plugins: [ + autoprefixer({ + remove: false, + browsers: [ + 'last 2 versions', + 'Chrome >= 52', + 'FireFox >= 44', + 'Safari >= 7', + 'ie >= 10', + 'last 4 Edge versions', + ], + }), + ], + }, + }, + 'sass-loader', + ], + }), + }, + { + test: /\.(jpg|png|svg)$/, + loader: 'file-loader', + }, + ], + }, + plugins: [ + new ExtractTextPlugin({ + filename: 'css/style.css', + }), + new webpack.LoaderOptionsPlugin({ + options: { sassLoader: { includePaths: [path.resolve(__dirname, '../node_modules')] } }, + }), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: `'${process.env.NODE_ENV}'`, + }, + }), + ], +}; diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf index a9ecf0e5..f25e8ce2 100644 --- a/docker/nginx/nginx.conf +++ b/docker/nginx/nginx.conf @@ -25,5 +25,3 @@ http { include /etc/nginx/sites-enabled/*; open_file_cache max=100; } - -daemon off; diff --git a/docker/nginx/upstream.conf b/docker/nginx/upstream.conf index 553791cd..af558ed8 100644 --- a/docker/nginx/upstream.conf +++ b/docker/nginx/upstream.conf @@ -1,3 +1,3 @@ upstream php-upstream { server php:9000; -} \ No newline at end of file +} diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index f26f71fd..870c94a3 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -3,6 +3,7 @@ FROM php:7.2-fpm RUN apt-get update && \ apt-get install -y \ git \ + libzip-dev \ unzip \ libpq-dev @@ -17,7 +18,10 @@ RUN ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime RUN "date" # Type docker-php-ext-install to see available extensions -RUN docker-php-ext-install pdo_pgsql +RUN docker-php-ext-install pdo_pgsql zip + +# Type docker-php-ext-enable to see available extensions +#RUN docker-php-ext-enable zip RUN usermod -u 1000 www-data diff --git a/package.json b/package.json index 92181e76..004dda32 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,10 @@ "url": "https://github.com/elevan-labs/docker-symfony-vuejs" }, "scripts": { - "dev": "NODE_ENV=dev webpack --config ./app/config/webpack.conf.js --devtool source-map --debug --watch --display-error-details", - "build": "NODE_ENV=production webpack --config ./app/config/webpack.conf.js --progress --colors --optimize-minimize", + "dev": "NODE_ENV=dev webpack --config ./config/webpack.conf.js --devtool source-map --debug --watch --display-error-details", + "build": "NODE_ENV=production webpack --config ./config/webpack.conf.js --progress --colors --optimize-minimize", "test": "NODE_ENV=testing jest --coverage", - "lint": "eslint --ext .js,.vue src && stylelint src/AppBundle/Resources/js/**/**/*.scss src/AppBundle/Resources/js/**/*.scss --fix", + "lint": "eslint --ext .js,.vue src && stylelint src/Resources/js/**/**/*.scss src/Resources/js/**/*.scss", "add-component": "./bin/add-component.sh" }, "dependencies": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 5a12e676..dbeb5721 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -10,6 +10,18 @@ + + + + + + + + + + + + diff --git a/public/index.php b/public/index.php new file mode 100644 index 00000000..aa17e61b --- /dev/null +++ b/public/index.php @@ -0,0 +1,39 @@ +load(__DIR__ . '/../.env'); +} + +$env = $_SERVER['APP_ENV'] ?? 'dev'; +$debug = $_SERVER['APP_DEBUG'] ?? ('prod' !== $env); + +if ($debug) { + umask(0000); + + Debug::enable(); +} + +if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) { + Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); +} + +if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? false) { + Request::setTrustedHosts(explode(',', $trustedHosts)); +} + +$kernel = new Kernel($env, $debug); +$request = Request::createFromGlobals(); +$response = $kernel->handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/src/.htaccess b/src/.htaccess deleted file mode 100644 index fb1de45b..00000000 --- a/src/.htaccess +++ /dev/null @@ -1,7 +0,0 @@ - - Require all denied - - - Order deny,allow - Deny from all - diff --git a/src/AppBundle/AppBundle.php b/src/AppBundle/AppBundle.php deleted file mode 100644 index e2579291..00000000 --- a/src/AppBundle/AppBundle.php +++ /dev/null @@ -1,13 +0,0 @@ -getProjectDir().'/var/cache/'.$this->environment; + } + + public function getLogDir() + { + return $this->getProjectDir().'/var/log'; + } + + public function registerBundles() + { + $contents = require $this->getProjectDir().'/config/bundles.php'; + foreach ($contents as $class => $envs) { + if (isset($envs['all']) || isset($envs[$this->environment])) { + yield new $class(); + } + } + } + + protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) + { + $container->setParameter('container.autowiring.strict_mode', true); + $container->setParameter('container.dumper.inline_class_loader', true); + $confDir = $this->getProjectDir().'/config'; + $loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob'); + if (is_dir($confDir.'/packages/'.$this->environment)) { + $loader->load($confDir.'/packages/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); + } + $loader->load($confDir.'/services'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/services_'.$this->environment.self::CONFIG_EXTS, 'glob'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes) + { + $confDir = $this->getProjectDir().'/config'; + if (is_dir($confDir.'/routes/')) { + $routes->import($confDir.'/routes/*'.self::CONFIG_EXTS, '/', 'glob'); + } + if (is_dir($confDir.'/routes/'.$this->environment)) { + $routes->import($confDir.'/routes/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); + } + $routes->import($confDir.'/routes'.self::CONFIG_EXTS, '/', 'glob'); + } +} diff --git a/src/Repository/.gitignore b/src/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/src/AppBundle/Resources/js/components/message/index.vue b/src/Resources/js/components/message/index.vue similarity index 100% rename from src/AppBundle/Resources/js/components/message/index.vue rename to src/Resources/js/components/message/index.vue diff --git a/src/AppBundle/Resources/js/page1/entrypoint.js b/src/Resources/js/page1/entrypoint.js similarity index 100% rename from src/AppBundle/Resources/js/page1/entrypoint.js rename to src/Resources/js/page1/entrypoint.js diff --git a/src/AppBundle/Resources/js/page1/index.vue b/src/Resources/js/page1/index.vue similarity index 100% rename from src/AppBundle/Resources/js/page1/index.vue rename to src/Resources/js/page1/index.vue diff --git a/src/AppBundle/Resources/js/page1/playground.spec.js b/src/Resources/js/page1/playground.spec.js similarity index 100% rename from src/AppBundle/Resources/js/page1/playground.spec.js rename to src/Resources/js/page1/playground.spec.js diff --git a/src/AppBundle/Resources/js/page2/entrypoint.js b/src/Resources/js/page2/entrypoint.js similarity index 100% rename from src/AppBundle/Resources/js/page2/entrypoint.js rename to src/Resources/js/page2/entrypoint.js diff --git a/src/AppBundle/Resources/js/page2/index.vue b/src/Resources/js/page2/index.vue similarity index 100% rename from src/AppBundle/Resources/js/page2/index.vue rename to src/Resources/js/page2/index.vue diff --git a/src/AppBundle/Resources/js/page2/playground.spec.js b/src/Resources/js/page2/playground.spec.js similarity index 100% rename from src/AppBundle/Resources/js/page2/playground.spec.js rename to src/Resources/js/page2/playground.spec.js diff --git a/src/Resources/public/js/page1.js b/src/Resources/public/js/page1.js new file mode 100644 index 00000000..a11e1a0b --- /dev/null +++ b/src/Resources/public/js/page1.js @@ -0,0 +1,8250 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 3); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +/* globals __VUE_SSR_CONTEXT__ */ + +// this module is a runtime utility for cleaner component module output and will +// be included in the final webpack user bundle + +module.exports = function normalizeComponent ( + rawScriptExports, + compiledTemplate, + injectStyles, + scopeId, + moduleIdentifier /* server only */ +) { + var esModule + var scriptExports = rawScriptExports = rawScriptExports || {} + + // ES6 modules interop + var type = typeof rawScriptExports.default + if (type === 'object' || type === 'function') { + esModule = rawScriptExports + scriptExports = rawScriptExports.default + } + + // Vue.extend constructor export interop + var options = typeof scriptExports === 'function' + ? scriptExports.options + : scriptExports + + // render functions + if (compiledTemplate) { + options.render = compiledTemplate.render + options.staticRenderFns = compiledTemplate.staticRenderFns + } + + // scopedId + if (scopeId) { + options._scopeId = scopeId + } + + var hook + if (moduleIdentifier) { // server build + hook = function (context) { + // 2.3 injection + context = + context || // cached call + (this.$vnode && this.$vnode.ssrContext) || // stateful + (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional + // 2.2 with runInNewContext: true + if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { + context = __VUE_SSR_CONTEXT__ + } + // inject component styles + if (injectStyles) { + injectStyles.call(this, context) + } + // register component module identifier for async chunk inferrence + if (context && context._registeredComponents) { + context._registeredComponents.add(moduleIdentifier) + } + } + // used by ssr in case component is cached and beforeCreate + // never gets called + options._ssrRegister = hook + } else if (injectStyles) { + hook = injectStyles + } + + if (hook) { + var functional = options.functional + var existing = functional + ? options.render + : options.beforeCreate + if (!functional) { + // inject component registration as beforeCreate hook + options.beforeCreate = existing + ? [].concat(existing, hook) + : [hook] + } else { + // register for functioal component in vue file + options.render = function renderWithStyleInjection (h, context) { + hook.call(context) + return existing(h, context) + } + } + } + + return { + esModule: esModule, + exports: scriptExports, + options: options + } +} + + +/***/ }), +/* 1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* WEBPACK VAR INJECTION */(function(global) {/*! + * Vue.js v2.4.2 + * (c) 2014-2017 Evan You + * Released under the MIT License. + */ +/* */ + +// these helpers produces better vm code in JS engines due to their +// explicitness and function inlining +function isUndef (v) { + return v === undefined || v === null +} + +function isDef (v) { + return v !== undefined && v !== null +} + +function isTrue (v) { + return v === true +} + +function isFalse (v) { + return v === false +} + +/** + * Check if value is primitive + */ +function isPrimitive (value) { + return ( + typeof value === 'string' || + typeof value === 'number' || + typeof value === 'boolean' + ) +} + +/** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ +function isObject (obj) { + return obj !== null && typeof obj === 'object' +} + +var _toString = Object.prototype.toString; + +/** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ +function isPlainObject (obj) { + return _toString.call(obj) === '[object Object]' +} + +function isRegExp (v) { + return _toString.call(v) === '[object RegExp]' +} + +/** + * Check if val is a valid array index. + */ +function isValidArrayIndex (val) { + var n = parseFloat(val); + return n >= 0 && Math.floor(n) === n && isFinite(val) +} + +/** + * Convert a value to a string that is actually rendered. + */ +function toString (val) { + return val == null + ? '' + : typeof val === 'object' + ? JSON.stringify(val, null, 2) + : String(val) +} + +/** + * Convert a input value to a number for persistence. + * If the conversion fails, return original string. + */ +function toNumber (val) { + var n = parseFloat(val); + return isNaN(n) ? val : n +} + +/** + * Make a map and return a function for checking if a key + * is in that map. + */ +function makeMap ( + str, + expectsLowerCase +) { + var map = Object.create(null); + var list = str.split(','); + for (var i = 0; i < list.length; i++) { + map[list[i]] = true; + } + return expectsLowerCase + ? function (val) { return map[val.toLowerCase()]; } + : function (val) { return map[val]; } +} + +/** + * Check if a tag is a built-in tag. + */ +var isBuiltInTag = makeMap('slot,component', true); + +/** + * Check if a attribute is a reserved attribute. + */ +var isReservedAttribute = makeMap('key,ref,slot,is'); + +/** + * Remove an item from an array + */ +function remove (arr, item) { + if (arr.length) { + var index = arr.indexOf(item); + if (index > -1) { + return arr.splice(index, 1) + } + } +} + +/** + * Check whether the object has the property. + */ +var hasOwnProperty = Object.prototype.hasOwnProperty; +function hasOwn (obj, key) { + return hasOwnProperty.call(obj, key) +} + +/** + * Create a cached version of a pure function. + */ +function cached (fn) { + var cache = Object.create(null); + return (function cachedFn (str) { + var hit = cache[str]; + return hit || (cache[str] = fn(str)) + }) +} + +/** + * Camelize a hyphen-delimited string. + */ +var camelizeRE = /-(\w)/g; +var camelize = cached(function (str) { + return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) +}); + +/** + * Capitalize a string. + */ +var capitalize = cached(function (str) { + return str.charAt(0).toUpperCase() + str.slice(1) +}); + +/** + * Hyphenate a camelCase string. + */ +var hyphenateRE = /([^-])([A-Z])/g; +var hyphenate = cached(function (str) { + return str + .replace(hyphenateRE, '$1-$2') + .replace(hyphenateRE, '$1-$2') + .toLowerCase() +}); + +/** + * Simple bind, faster than native + */ +function bind (fn, ctx) { + function boundFn (a) { + var l = arguments.length; + return l + ? l > 1 + ? fn.apply(ctx, arguments) + : fn.call(ctx, a) + : fn.call(ctx) + } + // record original fn length + boundFn._length = fn.length; + return boundFn +} + +/** + * Convert an Array-like object to a real Array. + */ +function toArray (list, start) { + start = start || 0; + var i = list.length - start; + var ret = new Array(i); + while (i--) { + ret[i] = list[i + start]; + } + return ret +} + +/** + * Mix properties into target object. + */ +function extend (to, _from) { + for (var key in _from) { + to[key] = _from[key]; + } + return to +} + +/** + * Merge an Array of Objects into a single Object. + */ +function toObject (arr) { + var res = {}; + for (var i = 0; i < arr.length; i++) { + if (arr[i]) { + extend(res, arr[i]); + } + } + return res +} + +/** + * Perform no operation. + * Stubbing args to make Flow happy without leaving useless transpiled code + * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/) + */ +function noop (a, b, c) {} + +/** + * Always return false. + */ +var no = function (a, b, c) { return false; }; + +/** + * Return same value + */ +var identity = function (_) { return _; }; + +/** + * Generate a static keys string from compiler modules. + */ + + +/** + * Check if two values are loosely equal - that is, + * if they are plain objects, do they have the same shape? + */ +function looseEqual (a, b) { + if (a === b) { return true } + var isObjectA = isObject(a); + var isObjectB = isObject(b); + if (isObjectA && isObjectB) { + try { + var isArrayA = Array.isArray(a); + var isArrayB = Array.isArray(b); + if (isArrayA && isArrayB) { + return a.length === b.length && a.every(function (e, i) { + return looseEqual(e, b[i]) + }) + } else if (!isArrayA && !isArrayB) { + var keysA = Object.keys(a); + var keysB = Object.keys(b); + return keysA.length === keysB.length && keysA.every(function (key) { + return looseEqual(a[key], b[key]) + }) + } else { + /* istanbul ignore next */ + return false + } + } catch (e) { + /* istanbul ignore next */ + return false + } + } else if (!isObjectA && !isObjectB) { + return String(a) === String(b) + } else { + return false + } +} + +function looseIndexOf (arr, val) { + for (var i = 0; i < arr.length; i++) { + if (looseEqual(arr[i], val)) { return i } + } + return -1 +} + +/** + * Ensure a function is called only once. + */ +function once (fn) { + var called = false; + return function () { + if (!called) { + called = true; + fn.apply(this, arguments); + } + } +} + +var SSR_ATTR = 'data-server-rendered'; + +var ASSET_TYPES = [ + 'component', + 'directive', + 'filter' +]; + +var LIFECYCLE_HOOKS = [ + 'beforeCreate', + 'created', + 'beforeMount', + 'mounted', + 'beforeUpdate', + 'updated', + 'beforeDestroy', + 'destroyed', + 'activated', + 'deactivated' +]; + +/* */ + +var config = ({ + /** + * Option merge strategies (used in core/util/options) + */ + optionMergeStrategies: Object.create(null), + + /** + * Whether to suppress warnings. + */ + silent: false, + + /** + * Show production mode tip message on boot? + */ + productionTip: 'dev' !== 'production', + + /** + * Whether to enable devtools + */ + devtools: 'dev' !== 'production', + + /** + * Whether to record perf + */ + performance: false, + + /** + * Error handler for watcher errors + */ + errorHandler: null, + + /** + * Warn handler for watcher warns + */ + warnHandler: null, + + /** + * Ignore certain custom elements + */ + ignoredElements: [], + + /** + * Custom user key aliases for v-on + */ + keyCodes: Object.create(null), + + /** + * Check if a tag is reserved so that it cannot be registered as a + * component. This is platform-dependent and may be overwritten. + */ + isReservedTag: no, + + /** + * Check if an attribute is reserved so that it cannot be used as a component + * prop. This is platform-dependent and may be overwritten. + */ + isReservedAttr: no, + + /** + * Check if a tag is an unknown element. + * Platform-dependent. + */ + isUnknownElement: no, + + /** + * Get the namespace of an element + */ + getTagNamespace: noop, + + /** + * Parse the real tag name for the specific platform. + */ + parsePlatformTagName: identity, + + /** + * Check if an attribute must be bound using property, e.g. value + * Platform-dependent. + */ + mustUseProp: no, + + /** + * Exposed for legacy reasons + */ + _lifecycleHooks: LIFECYCLE_HOOKS +}); + +/* */ + +var emptyObject = Object.freeze({}); + +/** + * Check if a string starts with $ or _ + */ +function isReserved (str) { + var c = (str + '').charCodeAt(0); + return c === 0x24 || c === 0x5F +} + +/** + * Define a property. + */ +function def (obj, key, val, enumerable) { + Object.defineProperty(obj, key, { + value: val, + enumerable: !!enumerable, + writable: true, + configurable: true + }); +} + +/** + * Parse simple path. + */ +var bailRE = /[^\w.$]/; +function parsePath (path) { + if (bailRE.test(path)) { + return + } + var segments = path.split('.'); + return function (obj) { + for (var i = 0; i < segments.length; i++) { + if (!obj) { return } + obj = obj[segments[i]]; + } + return obj + } +} + +/* */ + +var warn = noop; +var tip = noop; +var formatComponentName = (null); // work around flow check + +if (true) { + var hasConsole = typeof console !== 'undefined'; + var classifyRE = /(?:^|[-_])(\w)/g; + var classify = function (str) { return str + .replace(classifyRE, function (c) { return c.toUpperCase(); }) + .replace(/[-_]/g, ''); }; + + warn = function (msg, vm) { + var trace = vm ? generateComponentTrace(vm) : ''; + + if (config.warnHandler) { + config.warnHandler.call(null, msg, vm, trace); + } else if (hasConsole && (!config.silent)) { + console.error(("[Vue warn]: " + msg + trace)); + } + }; + + tip = function (msg, vm) { + if (hasConsole && (!config.silent)) { + console.warn("[Vue tip]: " + msg + ( + vm ? generateComponentTrace(vm) : '' + )); + } + }; + + formatComponentName = function (vm, includeFile) { + if (vm.$root === vm) { + return '' + } + var name = typeof vm === 'string' + ? vm + : typeof vm === 'function' && vm.options + ? vm.options.name + : vm._isVue + ? vm.$options.name || vm.$options._componentTag + : vm.name; + + var file = vm._isVue && vm.$options.__file; + if (!name && file) { + var match = file.match(/([^/\\]+)\.vue$/); + name = match && match[1]; + } + + return ( + (name ? ("<" + (classify(name)) + ">") : "") + + (file && includeFile !== false ? (" at " + file) : '') + ) + }; + + var repeat = function (str, n) { + var res = ''; + while (n) { + if (n % 2 === 1) { res += str; } + if (n > 1) { str += str; } + n >>= 1; + } + return res + }; + + var generateComponentTrace = function (vm) { + if (vm._isVue && vm.$parent) { + var tree = []; + var currentRecursiveSequence = 0; + while (vm) { + if (tree.length > 0) { + var last = tree[tree.length - 1]; + if (last.constructor === vm.constructor) { + currentRecursiveSequence++; + vm = vm.$parent; + continue + } else if (currentRecursiveSequence > 0) { + tree[tree.length - 1] = [last, currentRecursiveSequence]; + currentRecursiveSequence = 0; + } + } + tree.push(vm); + vm = vm.$parent; + } + return '\n\nfound in\n\n' + tree + .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm) + ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)") + : formatComponentName(vm))); }) + .join('\n') + } else { + return ("\n\n(found in " + (formatComponentName(vm)) + ")") + } + }; +} + +/* */ + +function handleError (err, vm, info) { + if (config.errorHandler) { + config.errorHandler.call(null, err, vm, info); + } else { + if (true) { + warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm); + } + /* istanbul ignore else */ + if (inBrowser && typeof console !== 'undefined') { + console.error(err); + } else { + throw err + } + } +} + +/* */ +/* globals MutationObserver */ + +// can we use __proto__? +var hasProto = '__proto__' in {}; + +// Browser environment sniffing +var inBrowser = typeof window !== 'undefined'; +var UA = inBrowser && window.navigator.userAgent.toLowerCase(); +var isIE = UA && /msie|trident/.test(UA); +var isIE9 = UA && UA.indexOf('msie 9.0') > 0; +var isEdge = UA && UA.indexOf('edge/') > 0; +var isAndroid = UA && UA.indexOf('android') > 0; +var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA); +var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; + +// Firefix has a "watch" function on Object.prototype... +var nativeWatch = ({}).watch; + +var supportsPassive = false; +if (inBrowser) { + try { + var opts = {}; + Object.defineProperty(opts, 'passive', ({ + get: function get () { + /* istanbul ignore next */ + supportsPassive = true; + } + })); // https://github.com/facebook/flow/issues/285 + window.addEventListener('test-passive', null, opts); + } catch (e) {} +} + +// this needs to be lazy-evaled because vue may be required before +// vue-server-renderer can set VUE_ENV +var _isServer; +var isServerRendering = function () { + if (_isServer === undefined) { + /* istanbul ignore if */ + if (!inBrowser && typeof global !== 'undefined') { + // detect presence of vue-server-renderer and avoid + // Webpack shimming the process + _isServer = global['process'].env.VUE_ENV === 'server'; + } else { + _isServer = false; + } + } + return _isServer +}; + +// detect devtools +var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; + +/* istanbul ignore next */ +function isNative (Ctor) { + return typeof Ctor === 'function' && /native code/.test(Ctor.toString()) +} + +var hasSymbol = + typeof Symbol !== 'undefined' && isNative(Symbol) && + typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys); + +/** + * Defer a task to execute it asynchronously. + */ +var nextTick = (function () { + var callbacks = []; + var pending = false; + var timerFunc; + + function nextTickHandler () { + pending = false; + var copies = callbacks.slice(0); + callbacks.length = 0; + for (var i = 0; i < copies.length; i++) { + copies[i](); + } + } + + // the nextTick behavior leverages the microtask queue, which can be accessed + // via either native Promise.then or MutationObserver. + // MutationObserver has wider support, however it is seriously bugged in + // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It + // completely stops working after triggering a few times... so, if native + // Promise is available, we will use it: + /* istanbul ignore if */ + if (typeof Promise !== 'undefined' && isNative(Promise)) { + var p = Promise.resolve(); + var logError = function (err) { console.error(err); }; + timerFunc = function () { + p.then(nextTickHandler).catch(logError); + // in problematic UIWebViews, Promise.then doesn't completely break, but + // it can get stuck in a weird state where callbacks are pushed into the + // microtask queue but the queue isn't being flushed, until the browser + // needs to do some other work, e.g. handle a timer. Therefore we can + // "force" the microtask queue to be flushed by adding an empty timer. + if (isIOS) { setTimeout(noop); } + }; + } else if (typeof MutationObserver !== 'undefined' && ( + isNative(MutationObserver) || + // PhantomJS and iOS 7.x + MutationObserver.toString() === '[object MutationObserverConstructor]' + )) { + // use MutationObserver where native Promise is not available, + // e.g. PhantomJS IE11, iOS7, Android 4.4 + var counter = 1; + var observer = new MutationObserver(nextTickHandler); + var textNode = document.createTextNode(String(counter)); + observer.observe(textNode, { + characterData: true + }); + timerFunc = function () { + counter = (counter + 1) % 2; + textNode.data = String(counter); + }; + } else { + // fallback to setTimeout + /* istanbul ignore next */ + timerFunc = function () { + setTimeout(nextTickHandler, 0); + }; + } + + return function queueNextTick (cb, ctx) { + var _resolve; + callbacks.push(function () { + if (cb) { + try { + cb.call(ctx); + } catch (e) { + handleError(e, ctx, 'nextTick'); + } + } else if (_resolve) { + _resolve(ctx); + } + }); + if (!pending) { + pending = true; + timerFunc(); + } + if (!cb && typeof Promise !== 'undefined') { + return new Promise(function (resolve, reject) { + _resolve = resolve; + }) + } + } +})(); + +var _Set; +/* istanbul ignore if */ +if (typeof Set !== 'undefined' && isNative(Set)) { + // use native Set when available. + _Set = Set; +} else { + // a non-standard Set polyfill that only works with primitive keys. + _Set = (function () { + function Set () { + this.set = Object.create(null); + } + Set.prototype.has = function has (key) { + return this.set[key] === true + }; + Set.prototype.add = function add (key) { + this.set[key] = true; + }; + Set.prototype.clear = function clear () { + this.set = Object.create(null); + }; + + return Set; + }()); +} + +/* */ + + +var uid$1 = 0; + +/** + * A dep is an observable that can have multiple + * directives subscribing to it. + */ +var Dep = function Dep () { + this.id = uid$1++; + this.subs = []; +}; + +Dep.prototype.addSub = function addSub (sub) { + this.subs.push(sub); +}; + +Dep.prototype.removeSub = function removeSub (sub) { + remove(this.subs, sub); +}; + +Dep.prototype.depend = function depend () { + if (Dep.target) { + Dep.target.addDep(this); + } +}; + +Dep.prototype.notify = function notify () { + // stabilize the subscriber list first + var subs = this.subs.slice(); + for (var i = 0, l = subs.length; i < l; i++) { + subs[i].update(); + } +}; + +// the current target watcher being evaluated. +// this is globally unique because there could be only one +// watcher being evaluated at any time. +Dep.target = null; +var targetStack = []; + +function pushTarget (_target) { + if (Dep.target) { targetStack.push(Dep.target); } + Dep.target = _target; +} + +function popTarget () { + Dep.target = targetStack.pop(); +} + +/* + * not type checking this file because flow doesn't play well with + * dynamically accessing methods on Array prototype + */ + +var arrayProto = Array.prototype; +var arrayMethods = Object.create(arrayProto);[ + 'push', + 'pop', + 'shift', + 'unshift', + 'splice', + 'sort', + 'reverse' +] +.forEach(function (method) { + // cache original method + var original = arrayProto[method]; + def(arrayMethods, method, function mutator () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var result = original.apply(this, args); + var ob = this.__ob__; + var inserted; + switch (method) { + case 'push': + case 'unshift': + inserted = args; + break + case 'splice': + inserted = args.slice(2); + break + } + if (inserted) { ob.observeArray(inserted); } + // notify change + ob.dep.notify(); + return result + }); +}); + +/* */ + +var arrayKeys = Object.getOwnPropertyNames(arrayMethods); + +/** + * By default, when a reactive property is set, the new value is + * also converted to become reactive. However when passing down props, + * we don't want to force conversion because the value may be a nested value + * under a frozen data structure. Converting it would defeat the optimization. + */ +var observerState = { + shouldConvert: true +}; + +/** + * Observer class that are attached to each observed + * object. Once attached, the observer converts target + * object's property keys into getter/setters that + * collect dependencies and dispatches updates. + */ +var Observer = function Observer (value) { + this.value = value; + this.dep = new Dep(); + this.vmCount = 0; + def(value, '__ob__', this); + if (Array.isArray(value)) { + var augment = hasProto + ? protoAugment + : copyAugment; + augment(value, arrayMethods, arrayKeys); + this.observeArray(value); + } else { + this.walk(value); + } +}; + +/** + * Walk through each property and convert them into + * getter/setters. This method should only be called when + * value type is Object. + */ +Observer.prototype.walk = function walk (obj) { + var keys = Object.keys(obj); + for (var i = 0; i < keys.length; i++) { + defineReactive$$1(obj, keys[i], obj[keys[i]]); + } +}; + +/** + * Observe a list of Array items. + */ +Observer.prototype.observeArray = function observeArray (items) { + for (var i = 0, l = items.length; i < l; i++) { + observe(items[i]); + } +}; + +// helpers + +/** + * Augment an target Object or Array by intercepting + * the prototype chain using __proto__ + */ +function protoAugment (target, src, keys) { + /* eslint-disable no-proto */ + target.__proto__ = src; + /* eslint-enable no-proto */ +} + +/** + * Augment an target Object or Array by defining + * hidden properties. + */ +/* istanbul ignore next */ +function copyAugment (target, src, keys) { + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + def(target, key, src[key]); + } +} + +/** + * Attempt to create an observer instance for a value, + * returns the new observer if successfully observed, + * or the existing observer if the value already has one. + */ +function observe (value, asRootData) { + if (!isObject(value)) { + return + } + var ob; + if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { + ob = value.__ob__; + } else if ( + observerState.shouldConvert && + !isServerRendering() && + (Array.isArray(value) || isPlainObject(value)) && + Object.isExtensible(value) && + !value._isVue + ) { + ob = new Observer(value); + } + if (asRootData && ob) { + ob.vmCount++; + } + return ob +} + +/** + * Define a reactive property on an Object. + */ +function defineReactive$$1 ( + obj, + key, + val, + customSetter, + shallow +) { + var dep = new Dep(); + + var property = Object.getOwnPropertyDescriptor(obj, key); + if (property && property.configurable === false) { + return + } + + // cater for pre-defined getter/setters + var getter = property && property.get; + var setter = property && property.set; + + var childOb = !shallow && observe(val); + Object.defineProperty(obj, key, { + enumerable: true, + configurable: true, + get: function reactiveGetter () { + var value = getter ? getter.call(obj) : val; + if (Dep.target) { + dep.depend(); + if (childOb) { + childOb.dep.depend(); + } + if (Array.isArray(value)) { + dependArray(value); + } + } + return value + }, + set: function reactiveSetter (newVal) { + var value = getter ? getter.call(obj) : val; + /* eslint-disable no-self-compare */ + if (newVal === value || (newVal !== newVal && value !== value)) { + return + } + /* eslint-enable no-self-compare */ + if ('dev' !== 'production' && customSetter) { + customSetter(); + } + if (setter) { + setter.call(obj, newVal); + } else { + val = newVal; + } + childOb = !shallow && observe(newVal); + dep.notify(); + } + }); +} + +/** + * Set a property on an object. Adds the new property and + * triggers change notification if the property doesn't + * already exist. + */ +function set (target, key, val) { + if (Array.isArray(target) && isValidArrayIndex(key)) { + target.length = Math.max(target.length, key); + target.splice(key, 1, val); + return val + } + if (hasOwn(target, key)) { + target[key] = val; + return val + } + var ob = (target).__ob__; + if (target._isVue || (ob && ob.vmCount)) { + 'dev' !== 'production' && warn( + 'Avoid adding reactive properties to a Vue instance or its root $data ' + + 'at runtime - declare it upfront in the data option.' + ); + return val + } + if (!ob) { + target[key] = val; + return val + } + defineReactive$$1(ob.value, key, val); + ob.dep.notify(); + return val +} + +/** + * Delete a property and trigger change if necessary. + */ +function del (target, key) { + if (Array.isArray(target) && isValidArrayIndex(key)) { + target.splice(key, 1); + return + } + var ob = (target).__ob__; + if (target._isVue || (ob && ob.vmCount)) { + 'dev' !== 'production' && warn( + 'Avoid deleting properties on a Vue instance or its root $data ' + + '- just set it to null.' + ); + return + } + if (!hasOwn(target, key)) { + return + } + delete target[key]; + if (!ob) { + return + } + ob.dep.notify(); +} + +/** + * Collect dependencies on array elements when the array is touched, since + * we cannot intercept array element access like property getters. + */ +function dependArray (value) { + for (var e = (void 0), i = 0, l = value.length; i < l; i++) { + e = value[i]; + e && e.__ob__ && e.__ob__.dep.depend(); + if (Array.isArray(e)) { + dependArray(e); + } + } +} + +/* */ + +/** + * Option overwriting strategies are functions that handle + * how to merge a parent option value and a child option + * value into the final value. + */ +var strats = config.optionMergeStrategies; + +/** + * Options with restrictions + */ +if (true) { + strats.el = strats.propsData = function (parent, child, vm, key) { + if (!vm) { + warn( + "option \"" + key + "\" can only be used during instance " + + 'creation with the `new` keyword.' + ); + } + return defaultStrat(parent, child) + }; +} + +/** + * Helper that recursively merges two data objects together. + */ +function mergeData (to, from) { + if (!from) { return to } + var key, toVal, fromVal; + var keys = Object.keys(from); + for (var i = 0; i < keys.length; i++) { + key = keys[i]; + toVal = to[key]; + fromVal = from[key]; + if (!hasOwn(to, key)) { + set(to, key, fromVal); + } else if (isPlainObject(toVal) && isPlainObject(fromVal)) { + mergeData(toVal, fromVal); + } + } + return to +} + +/** + * Data + */ +function mergeDataOrFn ( + parentVal, + childVal, + vm +) { + if (!vm) { + // in a Vue.extend merge, both should be functions + if (!childVal) { + return parentVal + } + if (!parentVal) { + return childVal + } + // when parentVal & childVal are both present, + // we need to return a function that returns the + // merged result of both functions... no need to + // check if parentVal is a function here because + // it has to be a function to pass previous merges. + return function mergedDataFn () { + return mergeData( + typeof childVal === 'function' ? childVal.call(this) : childVal, + typeof parentVal === 'function' ? parentVal.call(this) : parentVal + ) + } + } else if (parentVal || childVal) { + return function mergedInstanceDataFn () { + // instance merge + var instanceData = typeof childVal === 'function' + ? childVal.call(vm) + : childVal; + var defaultData = typeof parentVal === 'function' + ? parentVal.call(vm) + : undefined; + if (instanceData) { + return mergeData(instanceData, defaultData) + } else { + return defaultData + } + } + } +} + +strats.data = function ( + parentVal, + childVal, + vm +) { + if (!vm) { + if (childVal && typeof childVal !== 'function') { + 'dev' !== 'production' && warn( + 'The "data" option should be a function ' + + 'that returns a per-instance value in component ' + + 'definitions.', + vm + ); + + return parentVal + } + return mergeDataOrFn.call(this, parentVal, childVal) + } + + return mergeDataOrFn(parentVal, childVal, vm) +}; + +/** + * Hooks and props are merged as arrays. + */ +function mergeHook ( + parentVal, + childVal +) { + return childVal + ? parentVal + ? parentVal.concat(childVal) + : Array.isArray(childVal) + ? childVal + : [childVal] + : parentVal +} + +LIFECYCLE_HOOKS.forEach(function (hook) { + strats[hook] = mergeHook; +}); + +/** + * Assets + * + * When a vm is present (instance creation), we need to do + * a three-way merge between constructor options, instance + * options and parent options. + */ +function mergeAssets (parentVal, childVal) { + var res = Object.create(parentVal || null); + return childVal + ? extend(res, childVal) + : res +} + +ASSET_TYPES.forEach(function (type) { + strats[type + 's'] = mergeAssets; +}); + +/** + * Watchers. + * + * Watchers hashes should not overwrite one + * another, so we merge them as arrays. + */ +strats.watch = function (parentVal, childVal) { + // work around Firefox's Object.prototype.watch... + if (parentVal === nativeWatch) { parentVal = undefined; } + if (childVal === nativeWatch) { childVal = undefined; } + /* istanbul ignore if */ + if (!childVal) { return Object.create(parentVal || null) } + if (!parentVal) { return childVal } + var ret = {}; + extend(ret, parentVal); + for (var key in childVal) { + var parent = ret[key]; + var child = childVal[key]; + if (parent && !Array.isArray(parent)) { + parent = [parent]; + } + ret[key] = parent + ? parent.concat(child) + : Array.isArray(child) ? child : [child]; + } + return ret +}; + +/** + * Other object hashes. + */ +strats.props = +strats.methods = +strats.inject = +strats.computed = function (parentVal, childVal) { + if (!parentVal) { return childVal } + var ret = Object.create(null); + extend(ret, parentVal); + if (childVal) { extend(ret, childVal); } + return ret +}; +strats.provide = mergeDataOrFn; + +/** + * Default strategy. + */ +var defaultStrat = function (parentVal, childVal) { + return childVal === undefined + ? parentVal + : childVal +}; + +/** + * Validate component names + */ +function checkComponents (options) { + for (var key in options.components) { + var lower = key.toLowerCase(); + if (isBuiltInTag(lower) || config.isReservedTag(lower)) { + warn( + 'Do not use built-in or reserved HTML elements as component ' + + 'id: ' + key + ); + } + } +} + +/** + * Ensure all props option syntax are normalized into the + * Object-based format. + */ +function normalizeProps (options) { + var props = options.props; + if (!props) { return } + var res = {}; + var i, val, name; + if (Array.isArray(props)) { + i = props.length; + while (i--) { + val = props[i]; + if (typeof val === 'string') { + name = camelize(val); + res[name] = { type: null }; + } else if (true) { + warn('props must be strings when using array syntax.'); + } + } + } else if (isPlainObject(props)) { + for (var key in props) { + val = props[key]; + name = camelize(key); + res[name] = isPlainObject(val) + ? val + : { type: val }; + } + } + options.props = res; +} + +/** + * Normalize all injections into Object-based format + */ +function normalizeInject (options) { + var inject = options.inject; + if (Array.isArray(inject)) { + var normalized = options.inject = {}; + for (var i = 0; i < inject.length; i++) { + normalized[inject[i]] = inject[i]; + } + } +} + +/** + * Normalize raw function directives into object format. + */ +function normalizeDirectives (options) { + var dirs = options.directives; + if (dirs) { + for (var key in dirs) { + var def = dirs[key]; + if (typeof def === 'function') { + dirs[key] = { bind: def, update: def }; + } + } + } +} + +/** + * Merge two option objects into a new one. + * Core utility used in both instantiation and inheritance. + */ +function mergeOptions ( + parent, + child, + vm +) { + if (true) { + checkComponents(child); + } + + if (typeof child === 'function') { + child = child.options; + } + + normalizeProps(child); + normalizeInject(child); + normalizeDirectives(child); + var extendsFrom = child.extends; + if (extendsFrom) { + parent = mergeOptions(parent, extendsFrom, vm); + } + if (child.mixins) { + for (var i = 0, l = child.mixins.length; i < l; i++) { + parent = mergeOptions(parent, child.mixins[i], vm); + } + } + var options = {}; + var key; + for (key in parent) { + mergeField(key); + } + for (key in child) { + if (!hasOwn(parent, key)) { + mergeField(key); + } + } + function mergeField (key) { + var strat = strats[key] || defaultStrat; + options[key] = strat(parent[key], child[key], vm, key); + } + return options +} + +/** + * Resolve an asset. + * This function is used because child instances need access + * to assets defined in its ancestor chain. + */ +function resolveAsset ( + options, + type, + id, + warnMissing +) { + /* istanbul ignore if */ + if (typeof id !== 'string') { + return + } + var assets = options[type]; + // check local registration variations first + if (hasOwn(assets, id)) { return assets[id] } + var camelizedId = camelize(id); + if (hasOwn(assets, camelizedId)) { return assets[camelizedId] } + var PascalCaseId = capitalize(camelizedId); + if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } + // fallback to prototype chain + var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; + if ('dev' !== 'production' && warnMissing && !res) { + warn( + 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, + options + ); + } + return res +} + +/* */ + +function validateProp ( + key, + propOptions, + propsData, + vm +) { + var prop = propOptions[key]; + var absent = !hasOwn(propsData, key); + var value = propsData[key]; + // handle boolean props + if (isType(Boolean, prop.type)) { + if (absent && !hasOwn(prop, 'default')) { + value = false; + } else if (!isType(String, prop.type) && (value === '' || value === hyphenate(key))) { + value = true; + } + } + // check default value + if (value === undefined) { + value = getPropDefaultValue(vm, prop, key); + // since the default value is a fresh copy, + // make sure to observe it. + var prevShouldConvert = observerState.shouldConvert; + observerState.shouldConvert = true; + observe(value); + observerState.shouldConvert = prevShouldConvert; + } + if (true) { + assertProp(prop, key, value, vm, absent); + } + return value +} + +/** + * Get the default value of a prop. + */ +function getPropDefaultValue (vm, prop, key) { + // no default, return undefined + if (!hasOwn(prop, 'default')) { + return undefined + } + var def = prop.default; + // warn against non-factory defaults for Object & Array + if ('dev' !== 'production' && isObject(def)) { + warn( + 'Invalid default value for prop "' + key + '": ' + + 'Props with type Object/Array must use a factory function ' + + 'to return the default value.', + vm + ); + } + // the raw prop value was also undefined from previous render, + // return previous default value to avoid unnecessary watcher trigger + if (vm && vm.$options.propsData && + vm.$options.propsData[key] === undefined && + vm._props[key] !== undefined + ) { + return vm._props[key] + } + // call factory function for non-Function types + // a value is Function if its prototype is function even across different execution context + return typeof def === 'function' && getType(prop.type) !== 'Function' + ? def.call(vm) + : def +} + +/** + * Assert whether a prop is valid. + */ +function assertProp ( + prop, + name, + value, + vm, + absent +) { + if (prop.required && absent) { + warn( + 'Missing required prop: "' + name + '"', + vm + ); + return + } + if (value == null && !prop.required) { + return + } + var type = prop.type; + var valid = !type || type === true; + var expectedTypes = []; + if (type) { + if (!Array.isArray(type)) { + type = [type]; + } + for (var i = 0; i < type.length && !valid; i++) { + var assertedType = assertType(value, type[i]); + expectedTypes.push(assertedType.expectedType || ''); + valid = assertedType.valid; + } + } + if (!valid) { + warn( + 'Invalid prop: type check failed for prop "' + name + '".' + + ' Expected ' + expectedTypes.map(capitalize).join(', ') + + ', got ' + Object.prototype.toString.call(value).slice(8, -1) + '.', + vm + ); + return + } + var validator = prop.validator; + if (validator) { + if (!validator(value)) { + warn( + 'Invalid prop: custom validator check failed for prop "' + name + '".', + vm + ); + } + } +} + +var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/; + +function assertType (value, type) { + var valid; + var expectedType = getType(type); + if (simpleCheckRE.test(expectedType)) { + valid = typeof value === expectedType.toLowerCase(); + } else if (expectedType === 'Object') { + valid = isPlainObject(value); + } else if (expectedType === 'Array') { + valid = Array.isArray(value); + } else { + valid = value instanceof type; + } + return { + valid: valid, + expectedType: expectedType + } +} + +/** + * Use function string name to check built-in types, + * because a simple equality check will fail when running + * across different vms / iframes. + */ +function getType (fn) { + var match = fn && fn.toString().match(/^\s*function (\w+)/); + return match ? match[1] : '' +} + +function isType (type, fn) { + if (!Array.isArray(fn)) { + return getType(fn) === getType(type) + } + for (var i = 0, len = fn.length; i < len; i++) { + if (getType(fn[i]) === getType(type)) { + return true + } + } + /* istanbul ignore next */ + return false +} + +/* */ + +/* not type checking this file because flow doesn't play well with Proxy */ + +var initProxy; + +if (true) { + var allowedGlobals = makeMap( + 'Infinity,undefined,NaN,isFinite,isNaN,' + + 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + + 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' + + 'require' // for Webpack/Browserify + ); + + var warnNonPresent = function (target, key) { + warn( + "Property or method \"" + key + "\" is not defined on the instance but " + + "referenced during render. Make sure to declare reactive data " + + "properties in the data option.", + target + ); + }; + + var hasProxy = + typeof Proxy !== 'undefined' && + Proxy.toString().match(/native code/); + + if (hasProxy) { + var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta'); + config.keyCodes = new Proxy(config.keyCodes, { + set: function set (target, key, value) { + if (isBuiltInModifier(key)) { + warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key)); + return false + } else { + target[key] = value; + return true + } + } + }); + } + + var hasHandler = { + has: function has (target, key) { + var has = key in target; + var isAllowed = allowedGlobals(key) || key.charAt(0) === '_'; + if (!has && !isAllowed) { + warnNonPresent(target, key); + } + return has || !isAllowed + } + }; + + var getHandler = { + get: function get (target, key) { + if (typeof key === 'string' && !(key in target)) { + warnNonPresent(target, key); + } + return target[key] + } + }; + + initProxy = function initProxy (vm) { + if (hasProxy) { + // determine which proxy handler to use + var options = vm.$options; + var handlers = options.render && options.render._withStripped + ? getHandler + : hasHandler; + vm._renderProxy = new Proxy(vm, handlers); + } else { + vm._renderProxy = vm; + } + }; +} + +var mark; +var measure; + +if (true) { + var perf = inBrowser && window.performance; + /* istanbul ignore if */ + if ( + perf && + perf.mark && + perf.measure && + perf.clearMarks && + perf.clearMeasures + ) { + mark = function (tag) { return perf.mark(tag); }; + measure = function (name, startTag, endTag) { + perf.measure(name, startTag, endTag); + perf.clearMarks(startTag); + perf.clearMarks(endTag); + perf.clearMeasures(name); + }; + } +} + +/* */ + +var VNode = function VNode ( + tag, + data, + children, + text, + elm, + context, + componentOptions, + asyncFactory +) { + this.tag = tag; + this.data = data; + this.children = children; + this.text = text; + this.elm = elm; + this.ns = undefined; + this.context = context; + this.functionalContext = undefined; + this.key = data && data.key; + this.componentOptions = componentOptions; + this.componentInstance = undefined; + this.parent = undefined; + this.raw = false; + this.isStatic = false; + this.isRootInsert = true; + this.isComment = false; + this.isCloned = false; + this.isOnce = false; + this.asyncFactory = asyncFactory; + this.asyncMeta = undefined; + this.isAsyncPlaceholder = false; +}; + +var prototypeAccessors = { child: {} }; + +// DEPRECATED: alias for componentInstance for backwards compat. +/* istanbul ignore next */ +prototypeAccessors.child.get = function () { + return this.componentInstance +}; + +Object.defineProperties( VNode.prototype, prototypeAccessors ); + +var createEmptyVNode = function (text) { + if ( text === void 0 ) text = ''; + + var node = new VNode(); + node.text = text; + node.isComment = true; + return node +}; + +function createTextVNode (val) { + return new VNode(undefined, undefined, undefined, String(val)) +} + +// optimized shallow clone +// used for static nodes and slot nodes because they may be reused across +// multiple renders, cloning them avoids errors when DOM manipulations rely +// on their elm reference. +function cloneVNode (vnode) { + var cloned = new VNode( + vnode.tag, + vnode.data, + vnode.children, + vnode.text, + vnode.elm, + vnode.context, + vnode.componentOptions, + vnode.asyncFactory + ); + cloned.ns = vnode.ns; + cloned.isStatic = vnode.isStatic; + cloned.key = vnode.key; + cloned.isComment = vnode.isComment; + cloned.isCloned = true; + return cloned +} + +function cloneVNodes (vnodes) { + var len = vnodes.length; + var res = new Array(len); + for (var i = 0; i < len; i++) { + res[i] = cloneVNode(vnodes[i]); + } + return res +} + +/* */ + +var normalizeEvent = cached(function (name) { + var passive = name.charAt(0) === '&'; + name = passive ? name.slice(1) : name; + var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first + name = once$$1 ? name.slice(1) : name; + var capture = name.charAt(0) === '!'; + name = capture ? name.slice(1) : name; + return { + name: name, + once: once$$1, + capture: capture, + passive: passive + } +}); + +function createFnInvoker (fns) { + function invoker () { + var arguments$1 = arguments; + + var fns = invoker.fns; + if (Array.isArray(fns)) { + var cloned = fns.slice(); + for (var i = 0; i < cloned.length; i++) { + cloned[i].apply(null, arguments$1); + } + } else { + // return handler return value for single handlers + return fns.apply(null, arguments) + } + } + invoker.fns = fns; + return invoker +} + +function updateListeners ( + on, + oldOn, + add, + remove$$1, + vm +) { + var name, cur, old, event; + for (name in on) { + cur = on[name]; + old = oldOn[name]; + event = normalizeEvent(name); + if (isUndef(cur)) { + 'dev' !== 'production' && warn( + "Invalid handler for event \"" + (event.name) + "\": got " + String(cur), + vm + ); + } else if (isUndef(old)) { + if (isUndef(cur.fns)) { + cur = on[name] = createFnInvoker(cur); + } + add(event.name, cur, event.once, event.capture, event.passive); + } else if (cur !== old) { + old.fns = cur; + on[name] = old; + } + } + for (name in oldOn) { + if (isUndef(on[name])) { + event = normalizeEvent(name); + remove$$1(event.name, oldOn[name], event.capture); + } + } +} + +/* */ + +function mergeVNodeHook (def, hookKey, hook) { + var invoker; + var oldHook = def[hookKey]; + + function wrappedHook () { + hook.apply(this, arguments); + // important: remove merged hook to ensure it's called only once + // and prevent memory leak + remove(invoker.fns, wrappedHook); + } + + if (isUndef(oldHook)) { + // no existing hook + invoker = createFnInvoker([wrappedHook]); + } else { + /* istanbul ignore if */ + if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { + // already a merged invoker + invoker = oldHook; + invoker.fns.push(wrappedHook); + } else { + // existing plain hook + invoker = createFnInvoker([oldHook, wrappedHook]); + } + } + + invoker.merged = true; + def[hookKey] = invoker; +} + +/* */ + +function extractPropsFromVNodeData ( + data, + Ctor, + tag +) { + // we are only extracting raw values here. + // validation and default values are handled in the child + // component itself. + var propOptions = Ctor.options.props; + if (isUndef(propOptions)) { + return + } + var res = {}; + var attrs = data.attrs; + var props = data.props; + if (isDef(attrs) || isDef(props)) { + for (var key in propOptions) { + var altKey = hyphenate(key); + if (true) { + var keyInLowerCase = key.toLowerCase(); + if ( + key !== keyInLowerCase && + attrs && hasOwn(attrs, keyInLowerCase) + ) { + tip( + "Prop \"" + keyInLowerCase + "\" is passed to component " + + (formatComponentName(tag || Ctor)) + ", but the declared prop name is" + + " \"" + key + "\". " + + "Note that HTML attributes are case-insensitive and camelCased " + + "props need to use their kebab-case equivalents when using in-DOM " + + "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"." + ); + } + } + checkProp(res, props, key, altKey, true) || + checkProp(res, attrs, key, altKey, false); + } + } + return res +} + +function checkProp ( + res, + hash, + key, + altKey, + preserve +) { + if (isDef(hash)) { + if (hasOwn(hash, key)) { + res[key] = hash[key]; + if (!preserve) { + delete hash[key]; + } + return true + } else if (hasOwn(hash, altKey)) { + res[key] = hash[altKey]; + if (!preserve) { + delete hash[altKey]; + } + return true + } + } + return false +} + +/* */ + +// The template compiler attempts to minimize the need for normalization by +// statically analyzing the template at compile time. +// +// For plain HTML markup, normalization can be completely skipped because the +// generated render function is guaranteed to return Array. There are +// two cases where extra normalization is needed: + +// 1. When the children contains components - because a functional component +// may return an Array instead of a single root. In this case, just a simple +// normalization is needed - if any child is an Array, we flatten the whole +// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep +// because functional components already normalize their own children. +function simpleNormalizeChildren (children) { + for (var i = 0; i < children.length; i++) { + if (Array.isArray(children[i])) { + return Array.prototype.concat.apply([], children) + } + } + return children +} + +// 2. When the children contains constructs that always generated nested Arrays, +// e.g.