From 661b9b2fd042132cc40de34dc3dcdd0ea6b3f441 Mon Sep 17 00:00:00 2001 From: Alcides Ramos Date: Sun, 8 Sep 2024 22:15:00 +0200 Subject: [PATCH] refactor: upgrade PHP up to PHP v8.3.11 updated Makefile to include commands related with production environment updated Makefile to include guidelines to properly setup xDebug --- Dockerfile | 21 +- Makefile | 94 ++-- README.md | 91 +++- build/{ => dev}/Caddyfile | 2 +- build/prod/Caddyfile | 13 + build/xdebug.ini | 4 +- docker-compose-dev.yml | 19 + docker-compose-prod.yml | 17 + docker-compose.yml | 8 +- src/Makefile | 54 +-- src/README.md | 27 +- src/composer.json | 37 +- src/composer.lock | 952 +++++++++++++++++++++++++++++++++++++- 13 files changed, 1171 insertions(+), 168 deletions(-) rename build/{ => dev}/Caddyfile (87%) create mode 100644 build/prod/Caddyfile create mode 100644 docker-compose-dev.yml create mode 100644 docker-compose-prod.yml diff --git a/Dockerfile b/Dockerfile index 26b19f5..d620555 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ # STAGE: BASE-IMAGE #---------------------------------------------------------- -FROM php:8.3.10-fpm-alpine AS base-image +FROM php:8.3.11-fpm-alpine AS base-image #---------------------------------------------------------- # STAGE: COMMON @@ -14,7 +14,8 @@ FROM base-image AS common # Add OS dependencies RUN apk update && apk add --no-cache \ - fcgi + fcgi \ + libzip # Add a custom HEALTHCHECK script # Ensure the `healthcheck.sh` can be executed inside the container @@ -31,7 +32,8 @@ FROM base-image AS extensions-builder-common # Add, compile and configure PHP extensions RUN curl -sSL https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions -o - | sh -s \ - apcu + uuid \ + zip #---------------------------------------------------------- # STAGE: EXTENSIONS-BUILDER-DEV @@ -51,10 +53,10 @@ RUN curl -sSL https://github.com/mlocati/docker-php-extension-installer/releases FROM common AS build-development -ARG HOST_USER_ID=1001 -ARG HOST_USER_NAME=host-user-name -ARG HOST_GROUP_ID=1001 -ARG HOST_GROUP_NAME=host-group-name +ARG HOST_USER_ID=1000 +ARG HOST_USER_NAME=host-username +ARG HOST_GROUP_ID=1000 +ARG HOST_GROUP_NAME=host-groupname ENV ENV=DEVELOPMENT @@ -62,7 +64,7 @@ ENV ENV=DEVELOPMENT RUN addgroup --gid ${HOST_GROUP_ID} ${HOST_GROUP_NAME} \ && adduser --shell /bin/bash --uid ${HOST_USER_ID} --ingroup ${HOST_GROUP_NAME} --ingroup www-data --disabled-password --gecos '' ${HOST_USER_NAME} -# Ensure working dir is writtable by current user +# Empty working dir and make it writtable by current user RUN chown -Rf ${HOST_USER_NAME}:${HOST_GROUP_NAME} /var/www/html \ && find /var/www/html -type f -delete \ && rm -Rf /var/www/html/* @@ -76,7 +78,6 @@ COPY --from=composer /usr/bin/composer /usr/bin/composer # Add OS dependencies related with development RUN apk update && apk add --no-cache \ - bash \ git \ make \ ncurses \ @@ -90,7 +91,7 @@ RUN sed -i -r "s/USER-NAME/${HOST_USER_NAME}/g" /usr/local/etc/php-fpm.d/www.con # Setup xDebug COPY build/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini RUN touch /var/log/xdebug.log \ - && chmod 0777 /var/log/xdebug.log + && chown ${HOST_USER_NAME}:${HOST_GROUP_NAME} /var/log/xdebug.log #---------------------------------------------------------- # STAGE: OPTIMIZE-PHP-DEPENDENCIES diff --git a/Makefile b/Makefile index bd43350..4aabaac 100644 --- a/Makefile +++ b/Makefile @@ -44,15 +44,12 @@ HOST_GROUP_NAME := $(shell id --group --name) #--- -DOCKER_COMPOSE = docker compose +DOCKER_COMPOSE = docker compose --file docker-compose.yml --file docker-compose-$(env).yml -DOCKER_RUN = $(DOCKER_COMPOSE) run --rm $(SERVICE_APP) -DOCKER_EXEC = $(DOCKER_COMPOSE) exec $(SERVICE_APP) +DOCKER_BUILD_ARGUMENTS = --build-arg="HOST_USER_ID=$(HOST_USER_ID)" --build-arg="HOST_USER_NAME=$(HOST_USER_NAME)" --build-arg="HOST_GROUP_ID=$(HOST_GROUP_ID)" --build-arg="HOST_GROUP_NAME=$(HOST_GROUP_NAME)" +DOCKER_RUN = $(DOCKER_COMPOSE) run --rm $(SERVICE_APP) DOCKER_RUN_AS_USER = $(DOCKER_COMPOSE) run --rm --user $(HOST_USER_ID):$(HOST_GROUP_ID) $(SERVICE_APP) -DOCKER_EXEC_AS_USER = $(DOCKER_COMPOSE) exec --user $(HOST_USER_ID):$(HOST_GROUP_ID) $(SERVICE_APP) - -DOCKER_BUILD_ARGUMENTS = --build-arg="HOST_USER_ID=$(HOST_USER_ID)" --build-arg="HOST_USER_NAME=$(HOST_USER_NAME)" --build-arg="HOST_GROUP_ID=$(HOST_GROUP_ID)" --build-arg="HOST_GROUP_NAME=$(HOST_GROUP_NAME)" ### # FUNCTIONS @@ -91,6 +88,10 @@ define orderedList @echo "" endef +define pad + $(shell printf "%-$(1)s" " ") +endef + ### # HELP ### @@ -98,70 +99,65 @@ endef .PHONY: help help: @clear - @echo "╔══════════════════════════════════════════════════════════════════════════════╗" - @echo "║ ║" - @echo "║ ${YELLOW}.:${RESET} AVAILABLE COMMANDS ${YELLOW}:.${RESET} ║" - @echo "║ ║" - @echo "╚══════════════════════════════════════════════════════════════════════════════╝" - @echo "" - @grep -E '^[a-zA-Z_0-9%-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "· ${YELLOW}%-30s${RESET} %s\n", $$1, $$2}' - @echo "" - -### -# MISCELANEOUS -### - -.PHONY: show-context -show-context: ## Setup: show context - $(call showInfo,"Showing context") - @echo " · Domain : ${YELLOW}${WEBSITE_URL}${RESET}" - @echo " · Host user : (${YELLOW}${HOST_USER_ID}${RESET}) ${YELLOW}${HOST_USER_NAME}${RESET}" - @echo " · Host group : (${YELLOW}${HOST_GROUP_ID}${RESET}) ${YELLOW}${HOST_GROUP_NAME}${RESET}" - @echo " · Service(s) : ${YELLOW}${SERVICE_APP}${RESET}, ${YELLOW}${SERVICE_CADDY}${RESET}" + @echo "${BLACK}" + @echo "╔════════════════════════════════════════════════════════════════════════════════════════════════════════╗" + @echo "║ $(call pad,96) ║" + @echo "║ $(call pad,32) ${YELLOW}.:${RESET} AVAILABLE COMMANDS ${YELLOW}:.${BLACK} $(call pad,32) ║" + @echo "║ $(call pad,96) ║" + @echo "╚════════════════════════════════════════════════════════════════════════════════════════════════════════╝" + @echo "${BLACK}·${RESET} ${MAGENTA}USER${BLACK} ......... ${WHITE}(${CYAN}$(HOST_USER_ID)${WHITE})${BLACK} ${CYAN}$(HOST_USER_NAME)${BLACK}" + @echo "${BLACK}·${RESET} ${MAGENTA}GROUP${BLACK} ........ ${WHITE}(${CYAN}$(HOST_GROUP_ID)${WHITE})${BLACK} ${CYAN}$(HOST_GROUP_NAME)${BLACK}" + @echo "${BLACK}·${RESET} ${MAGENTA}SERVICE(s)${BLACK} ... ${CYAN}$(SERVICE_APP)${BLACK}, ${CYAN}$(SERVICE_CADDY)${BLACK}" + @echo "${RESET}" + @grep -E '^[a-zA-Z_0-9%-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "${BLACK}·${RESET} ${YELLOW}%-35s${RESET} %s\n", $$1, $$2}' @echo "" - $(call showInfo,"SSL") - @echo " · Please execute [ ${YELLOW}make install-caddy-certificate${RESET} ] to register ${CYAN}Caddy's Root Certificate${RESET} on your browser" - $(call taskDone) ### # DOCKER RELATED ### .PHONY: build -build: ## Docker: builds the service +build: ## Docker: builds the service + @$(eval env ?= 'dev') @$(DOCKER_COMPOSE) build $(DOCKER_BUILD_ARGUMENTS) $(call taskDone) .PHONY: up -up: ## Docker: starts the service +up: ## Docker: starts the service + @$(eval env ?= 'dev') @$(DOCKER_COMPOSE) up --remove-orphans --detach $(call taskDone) .PHONY: restart -restart: ## Docker: restarts the service +restart: ## Docker: restarts the service + @$(eval env ?= 'dev') @$(DOCKER_COMPOSE) restart $(call taskDone) .PHONY: down -down: ## Docker: stops the service - @$(DOCKER_COMPOSE) down --remove-orphans +down: ## Docker: stops the service + @$(eval env ?= 'dev') + @$(DOCKER_COMPOSE) down $(DOCKER_COMPOSE_FILES) --remove-orphans $(call taskDone) .PHONY: logs -logs: ## Docker: exposes the service logs - @$(DOCKER_COMPOSE) logs +logs: ## Docker: exposes the service logs + @$(eval env ?= 'dev') + @$(eval service ?= 'app') + @$(DOCKER_COMPOSE) logs $(service) $(call taskDone) -.PHONY: bash -bash: ## Docker: establish a bash session into main container - $(DOCKER_RUN_AS_USER) bash +.PHONY: shell +shell: ## Docker: establish a shell session into main container + @$(eval env ?= 'dev') + $(DOCKER_RUN_AS_USER) sh ### # CADDY ### -.PHONY: extract-caddy-certificate -extract-caddy-certificate: up ## Setup: extracts the Caddy Local Authority certificate +.PHONY: install-caddy-certificate +install-caddy-certificate: up ## Setup: extracts the Caddy Local Authority certificate @echo "How to install [ $(YELLOW)Caddy Local Authority - 20XX ECC Root$(RESET) ] as a valid Certificate Authority" $(call orderedList,1,"Copy the root certificate from Caddy Docker container") @docker cp $(SERVICE_CADDY):/data/caddy/pki/authorities/local/root.crt ./caddy-root-ca-authority.crt @@ -185,27 +181,29 @@ extract-caddy-certificate: up ## Setup: extracts the Caddy Local Authority certi # APPLICATION ### -.PHONY: uninstall -uninstall: require-confirm ## Application: removes the PHP application - $(call showInfo,"Uninstalling PHP Application") - @find ./src -type f -delete - @rm -Rf ./src/* - $(call taskDone) - .PHONY: install-skeleton install-skeleton: ## Application: installs PHP Skeleton $(call showInfo,"Installing PHP Skeleton") + @$(eval env ?= 'dev') $(DOCKER_RUN_AS_USER) composer create-project alcidesrc/php-skeleton . $(call taskDone) .PHONY: install-laravel install-laravel: ## Application: installs Laravel $(call showInfo,"Installing Laravel") + @$(eval env ?= 'dev') $(DOCKER_RUN_AS_USER) composer create-project laravel/laravel . $(call taskDone) .PHONY: install-symfony install-symfony: ## Application: installs Symfony $(call showInfo,"Installing Symfony") + @$(eval env ?= 'dev') $(DOCKER_RUN_AS_USER) composer create-project symfony/skeleton . $(call taskDone) + +.PHONY: uninstall +uninstall: require-confirm ## Application: removes the PHP application + $(call showInfo,"Uninstalling PHP Application") + @rm -Rf ./src && mkdir ./src + $(call taskDone) diff --git a/README.md b/README.md index b93882f..a482427 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ To use this repository you need: | Service | [Caddy Server](https://caddyserver.com/) | Open source web server with automatic HTTPS written in Go | | Service | [PHP-FPM](https://www.php.net/manual/en/install.fpm.php) | PHP with FastCGI Process Manager | | Miscelaneous | [Bash](https://www.gnu.org/software/bash/) | Allows to create an interactive shell within containerized service | -| Miscelaneous | [Make](https://www.gnu.org/software/make/) | Allows to execute commands defined on a _Makefile_ | +| Miscelaneous | [Make](https://www.gnu.org/software/make/) | Allows tThe order on here is important!o execute commands defined on a _Makefile_ | @@ -212,24 +212,26 @@ A *Makefile* is provided with following commands: ```bash ~/path/to/my-new-project$ make -╔══════════════════════════════════════════════════════════════════════════════╗ -║ ║ -║ .: AVAILABLE COMMANDS :. ║ -║ ║ -╚══════════════════════════════════════════════════════════════════════════════╝ - -· build Docker: builds the service -· up Docker: starts the service -· restart Docker: restarts the service -· down Docker: stops the service -· logs Docker: exposes the service logs -· bash Docker: establish a bash session into main container -· extract-caddy-certificate Setup: extracts the Caddy Local Authority certificate -· show-context Setup: show context -· uninstall Application: removes the PHP application -· install-skeleton Application: installs PHP Skeleton -· install-laravel Application: installs Laravel -· install-symfony Application: installs Symfony +╔════════════════════════════════════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ .: AVAILABLE COMMANDS :. ║ +║ ║ +╚════════════════════════════════════════════════════════════════════════════════════════════════════════╝ +· USER ......... (1000) alcidesrc +· GROUP ........ (1000) alcidesrc +· SERVICE(s) ... app, caddy + +· build Docker: builds the service +· up Docker: starts the service +· restart Docker: restarts the service +· down Docker: stops the service +· logs Docker: exposes the service logs +· shell Docker: establish a shell session into main container +· install-caddy-certificate Setup: extracts the Caddy Local Authority certificate +· install-skeleton Application: installs PHP Skeleton +· install-laravel Application: installs Laravel +· install-symfony Application: installs Symfony +· uninstall Application: removes the PHP application ``` #### Web Server @@ -311,7 +313,7 @@ Testing with date and/or time variations sometimes can be a nightmare. To assist -### Development Environment +### Max. simultaneous connectionsMax. simultaneous connectionsDevelopment Environment #### Build Docker Image @@ -341,6 +343,51 @@ $ make bash $ docker run -it --rm app:development bash ``` + + +#### Setup PHPStorm + +##### Help > Change Memory Settings + +To allow PHPStorm index huge projects consider to increase the default assigned memory amount from 2048 MiB up to 8192 MiB. + +![phpstorm-memory-settings](./phpstorm-memory-settings.png) + +##### Settings > PHP > Debug + +Ensure the `Max. simultaneous connections` is set to 1 to avoid trace collisions when debugging. + +![phpstorm-debug](./phpstorm-settings-php-debug.png) + +##### Settings > PHP > Servers + +Ensure the `~/path/to/my-new-project/src` folder is mapped to `/var/www/html` + +![phpstorm-settings-php-servers](./phpstorm-settings-php-servers.png) + +##### Settings > PHP + +![phpstorm-settings-php-settings](./phpstorm-settings-php-settings.png) + +![phpstorm-settings-php-settings-cli-interpreter](./phpstorm-settings-php-settings-cli-interpreter.png) + + + +> [!IMPORTANT] +> +> When selecting Docker Compose configuration files, ensure to include: +> +> 1. The `docker-compose.yml` file, which contains the default service(s) specification +> 2. The `docker-compose-dev.yml` file, which contains some override values or customization from default specification. +> +> **The order on here is important!** + + + +![phpstorm-settings-php-settings-cli-interpreters-configuration-files](./phpstorm-settings-php-settings-cli-interpreters-configuration-files.png) + + + ### Production Environment #### Build Docker Image @@ -348,7 +395,7 @@ $ docker run -it --rm app:development bash ##### Linux Based Hosts ```bash -$ docker buildx build --target=build-production --tag="app:production" . +$ make env=prod ``` ##### Windows Hosts @@ -362,7 +409,7 @@ $ docker buildx build --target=build-production --tag="app:production" . ##### Linux Based Hosts ```bash -$ docker run -it --rm app:production sh +$ make shell env=prod ``` ##### Windows Hosts diff --git a/build/Caddyfile b/build/dev/Caddyfile similarity index 87% rename from build/Caddyfile rename to build/dev/Caddyfile index 4a81ebd..14a54a4 100644 --- a/build/Caddyfile +++ b/build/dev/Caddyfile @@ -5,7 +5,7 @@ website.localhost { root * /var/www/html/public - encode zstd gzip + encode zstd gzip php_fastcgi app:9000 diff --git a/build/prod/Caddyfile b/build/prod/Caddyfile new file mode 100644 index 0000000..9aa4de9 --- /dev/null +++ b/build/prod/Caddyfile @@ -0,0 +1,13 @@ +acme.com { + tls internal + + respond /healthcheck 200 + + root * /var/www/html/public + + encode zstd gzip + + php_fastcgi app:9000 + + file_server +} diff --git a/build/xdebug.ini b/build/xdebug.ini index c87425b..e3f1f85 100644 --- a/build/xdebug.ini +++ b/build/xdebug.ini @@ -1,6 +1,4 @@ -;Intentionally disabled -;See https://medium.com/@stef_r/on-demand-xdebug-with-phpunit-and-laravel-in-phpstorm-f6bff6397a6 for further details -;zend_extension=xdebug.so +zend_extension=xdebug.so [xdebug] xdebug.client_host=host.docker.internal diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml new file mode 100644 index 0000000..c00ab8b --- /dev/null +++ b/docker-compose-dev.yml @@ -0,0 +1,19 @@ +services: + app: + extends: + file: docker-compose.yml + service: app + build: + target: build-development + image: app:development + volumes: + - ./coverage:/coverage + + caddy: + extends: + file: docker-compose.yml + service: caddy + volumes: + - ./build/dev/Caddyfile:/etc/caddy/Caddyfile:ro + healthcheck: + test: ["CMD", "wget", "--spider", "https://website.localhost/healthcheck"] diff --git a/docker-compose-prod.yml b/docker-compose-prod.yml new file mode 100644 index 0000000..49dc777 --- /dev/null +++ b/docker-compose-prod.yml @@ -0,0 +1,17 @@ +services: + app: + extends: + file: docker-compose.yml + service: app + build: + target: build-production + image: app:production + + caddy: + extends: + file: docker-compose.yml + service: caddy + volumes: + - ./build/prod/Caddyfile:/etc/caddy/Caddyfile:ro + healthcheck: + test: ["CMD", "wget", "--spider", "https://acme.com/healthcheck"] diff --git a/docker-compose.yml b/docker-compose.yml index 49007f5..afede37 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,8 +8,6 @@ services: build: context: . dockerfile: Dockerfile - target: build-development - image: app:development restart: unless-stopped tty: true volumes: @@ -22,16 +20,14 @@ services: volumes: - caddy_data:/data - caddy_config:/config - - ./build/Caddyfile:/etc/caddy/Caddyfile:ro - ./src:/var/www/html ports: - 80:80 - 443:443 - 443:443/udp - depends_on: - - app healthcheck: - test: ["CMD", "wget", "--spider", "https://website.localhost/healthcheck"] interval: 10s timeout: 1s retries: 3 + depends_on: + - app diff --git a/src/Makefile b/src/Makefile index d3643ae..e848e09 100644 --- a/src/Makefile +++ b/src/Makefile @@ -26,6 +26,11 @@ else RESET := "" endif +#--- + +RANDOM_ORDER_SEED := $(shell head -200 /dev/urandom | cksum | cut -f1 -d " ") + +#--- ### # HELP @@ -68,32 +73,32 @@ endef ### .PHONY: composer-dump -composer-dump: ## Application: +composer-dump: ## [COMPOSER] Executes inside the container $(DOCKER_RUN_AS_USER) composer dump-auto --ansi --no-plugins --profile --classmap-authoritative --apcu --strict-psr $(call taskDone) .PHONY: composer-install -composer-install: ## Application: +composer-install: ## [COMPOSER] Executes inside the container $(DOCKER_RUN_AS_USER) composer install --ansi --no-plugins --classmap-authoritative --audit --apcu-autoloader $(call taskDone) .PHONY: composer-remove -composer-remove: require-package ## Application: +composer-remove: require-package ## [COMPOSER] Executes inside the container $(DOCKER_RUN_AS_USER) composer remove --ansi --no-plugins --classmap-authoritative --apcu-autoloader --with-all-dependencies --unused $(call taskDone) .PHONY: composer-require-dev -composer-require-dev: ## Application: +composer-require-dev: ## [COMPOSER] Executes inside the container $(DOCKER_RUN_AS_USER) composer require --ansi --no-plugins --classmap-authoritative --apcu-autoloader --with-all-dependencies --prefer-stable --sort-packages --dev $(call taskDone) .PHONY: composer-require -composer-require: ## Application: +composer-require: ## [COMPOSER] Executes inside the container $(DOCKER_RUN_AS_USER) composer require --ansi --no-plugins --classmap-authoritative --apcu-autoloader --with-all-dependencies --prefer-stable --sort-packages $(call taskDone) .PHONY: composer-update -composer-update: ## Application: +composer-update: ## [COMPOSER] Executes inside the container $(DOCKER_RUN_AS_USER) composer update --ansi --no-plugins --classmap-authoritative --apcu-autoloader --with-all-dependencies $(call taskDone) @@ -101,44 +106,39 @@ composer-update: ## Application: # QA ### -.PHONY: linter -linter: ## QA: +.PHONY: check-syntax +check-syntax: ## [QA] Executes inside the container @$(eval filter ?= 'app') - @composer linter $(filter) + @vendor/bin/parallel-lint --colors -e php -j 10 $(filter) $(call taskDone) -.PHONY: phpcs -phpcs: ## QA: +.PHONY: check-style +check-style: ## [QA] Executes inside the container @$(eval filter ?= 'app') - @composer phpcs $(filter) + @vendor/bin/phpcs -p --colors --standard=phpcs.xml $(filter) $(call taskDone) -.PHONY: phpcbf -phpcbf: ## QA: +.PHONY: fix-style +fix-style: ## [QA] Executes inside the container @$(eval filter ?= 'app') - @composer phpcbf $(filter) + @vendor/bin/phpcbf -p --colors --standard=phpcs.xml $(filter) $(call taskDone) .PHONY: phpstan -phpstan: ## QA: +phpstan: ## [QA] Executes inside the container @$(eval filter ?= 'app') - @composer phpstan $(filter) + @vendor/bin/phpstan analyse --ansi --memory-limit=1G --no-progress --configuration=phpstan.neon $(filter) $(call taskDone) .PHONY: tests -tests: ## QA: +tests: ## [QA] Executes inside the container @$(eval testsuite ?= 'Unit') @$(eval filter ?= '.') - @composer tests --testsuite=$(testsuite) --filter=$(filter) - $(call taskDone) - -.PHONY: tests-unit -tests-unit: ## QA: - @$(eval filter ?= '.') - @composer tests-unit --filter=$(filter) + @XDEBUG_MODE=off vendor/bin/phpunit --testsuite=$(testsuite) --filter=$(filter) --configuration=phpunit.xml --coverage-text --testdox --colors --order-by=random --random-order-seed=$(RANDOM_ORDER_SEED) $(call taskDone) .PHONY: coverage -coverage: ## QA: - @composer coverage +coverage: ## [QA] Executes inside the container + @rm -Rf /coverage/* + @XDEBUG_MODE=off vendor/bin/phpunit --coverage-html=/coverage --configuration=phpunit.xml --coverage-text --testdox --colors --order-by=random --random-order-seed=$(RANDOM_ORDER_SEED) $(call taskDone) diff --git a/src/README.md b/src/README.md index ee41f20..5052f0c 100644 --- a/src/README.md +++ b/src/README.md @@ -1,3 +1,5 @@ +[![Continuous Integration](https://github.com/AlcidesRC/php-skeleton/actions/workflows/ci.yml/badge.svg)](https://github.com/AlcidesRC/php-skeleton/actions/workflows/ci.yml) + # PHP Skeleton @@ -92,19 +94,18 @@ Additionally a *Makefile* is provided with frequently used commands: ║ ║ ╚══════════════════════════════════════════════════════════════════════════════╝ -· composer-dump Application: -· composer-install Application: -· composer-remove Application: -· composer-require-dev Application: -· composer-require Application: -· composer-update Application: -· linter QA: -· phpcs QA: -· phpcbf QA: -· phpstan QA: -· tests QA: -· tests-unit QA: -· coverage QA: +· composer-dump [COMPOSER] Executes inside the container +· composer-install [COMPOSER] Executes inside the container +· composer-remove [COMPOSER] Executes inside the container +· composer-require-dev [COMPOSER] Executes inside the container +· composer-require [COMPOSER] Executes inside the container +· composer-update [COMPOSER] Executes inside the container +· check-syntax [QA] Executes inside the container +· check-style [QA] Executes inside the container +· fix-style [QA] Executes inside the container +· phpstan [QA] Executes inside the container +· tests [QA] Executes inside the container +· coverage [QA] Executes inside the container ``` ##### Installing Dependencies diff --git a/src/composer.json b/src/composer.json index 5aea42b..d245131 100644 --- a/src/composer.json +++ b/src/composer.json @@ -11,6 +11,13 @@ "homepage": "https://alcidesrc.com/" } ], + "support": { + "issues": "https://github.com/alcidesrc/php-skeleton/issues", + "source": "https://github.com/alcidesrc/php-skeleton" + }, + "require": { + "php": "^8.3" + }, "autoload": { "psr-4": { "App\\": "app/" @@ -33,6 +40,7 @@ "require-dev": { "php-parallel-lint/php-console-highlighter": "^1.0", "php-parallel-lint/php-parallel-lint": "^1.3", + "phpmd/phpmd": "^2.15", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^11.0", "slope-it/clock-mock": "^0.4.0", @@ -40,29 +48,12 @@ "symfony/var-dumper": "^7.0" }, "scripts": { - "linter": "vendor/bin/parallel-lint --colors -e php -j 10", - "phpcs": "vendor/bin/phpcs -p --colors --standard=phpcs.xml", - "phpcbf": "vendor/bin/phpcbf -p --colors --standard=phpcs.xml", - "phpstan": "vendor/bin/phpstan analyse --ansi --memory-limit=1G --no-progress --configuration=phpstan.neon", - "phpunit": "vendor/bin/phpunit --configuration=phpunit.xml --testdox --colors --order-by=random --random-order-seed=$(head -200 /dev/urandom | cksum | cut -f1 -d \" \")", - - "tests": [ - "@linter app/ tests/", - "@phpcs", - "@phpunit --coverage-text" - ], - "tests-unit": [ - "@linter app/ tests/", - "@phpcs", - "@phpunit --coverage-text --testsuite=Unit" - ], - - "coverage": [ - "rm -Rf /coverage/*", - "@linter app/ tests/", - "@phpcs", - "@phpunit --coverage-text --coverage-html=/coverage" - ] + "check-syntax": "parallel-lint --colors -e php -j 10 app/ tests/", + "check-style": "phpcs -p --colors --standard=phpcs.xml app/ tests/", + "fix-style": "phpcbf -p --colors --standard=phpcs.xml app/ tests/", + "phpstan": "phpstan analyse --ansi --memory-limit=1G --configuration=phpstan.neon", + "phpmd": "phpmd app/,tests/ ansi cleancode,codesize,controversial,design,naming,unusedcode", + "tests": "XDEBUG_MODE=off phpunit --configuration phpunit.xml --coverage-text --colors --testdox --order-by=random --random-order-seed=$(head -200 /dev/urandom | cksum | cut -f1 -d \" \")" }, "minimum-stability": "stable", "prefer-stable": true diff --git a/src/composer.lock b/src/composer.lock index 4a64a16..573ebf9 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,9 +4,154 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "20a24fa6c040081d19bf57d4cf72710c", + "content-hash": "077e54d5b5230b5db105db6132b33515", "packages": [], "packages-dev": [ + { + "name": "composer/pcre", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "1637e067347a0c40bbb1e3cd786b20dcab556a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/1637e067347a0c40bbb1e3cd786b20dcab556a81", + "reference": "1637e067347a0c40bbb1e3cd786b20dcab556a81", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.11.10", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-08-19T19:43:53+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, { "name": "myclabs/deep-copy", "version": "1.12.0", @@ -125,6 +270,69 @@ }, "time": "2024-07-01T20:03:41+00:00" }, + { + "name": "pdepend/pdepend", + "version": "2.16.2", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "shasum": "" + }, + "require": { + "php": ">=5.3.7", + "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.19" + }, + "require-dev": { + "easy-doc/easy-doc": "0.0.0|^1.2.3", + "gregwar/rst": "^1.0", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "PDepend\\": "src/main/php/PDepend" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], + "support": { + "issues": "https://github.com/pdepend/pdepend/issues", + "source": "https://github.com/pdepend/pdepend/tree/2.16.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], + "time": "2023-12-17T18:09:59+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.4", @@ -405,6 +613,89 @@ }, "time": "2024-03-27T12:14:49+00:00" }, + { + "name": "phpmd/phpmd", + "version": "2.15.0", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", + "shasum": "" + }, + "require": { + "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", + "ext-xml": "*", + "pdepend/pdepend": "^2.16.1", + "php": ">=5.3.9" + }, + "require-dev": { + "easy-doc/easy-doc": "0.0.0 || ^1.3.2", + "ext-json": "*", + "ext-simplexml": "*", + "gregwar/rst": "^1.0", + "mikey179/vfsstream": "^1.6.8", + "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "library", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project Founder" + }, + { + "name": "Marc Würth", + "email": "ravage@bluewin.ch", + "homepage": "https://github.com/ravage84", + "role": "Project Maintainer" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "https://phpmd.org/", + "keywords": [ + "dev", + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "support": { + "irc": "irc://irc.freenode.org/phpmd", + "issues": "https://github.com/phpmd/phpmd/issues", + "source": "https://github.com/phpmd/phpmd/tree/2.15.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], + "time": "2023-12-11T08:22:20+00:00" + }, { "name": "phpstan/phpstan", "version": "1.11.11", @@ -886,6 +1177,109 @@ ], "time": "2024-08-13T06:14:23+00:00" }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/log", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "79dff0b268932c640297f5208d6298f71855c03e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", + "reference": "79dff0b268932c640297f5208d6298f71855c03e", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.1" + }, + "time": "2024-08-21T13:31:24+00:00" + }, { "name": "sebastian/cli-parser", "version": "3.0.2", @@ -1944,31 +2338,398 @@ "time": "2024-07-21T23:26:44+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "name": "symfony/config", + "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "url": "https://github.com/symfony/config.git", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.1", + "symfony/polyfill-ctype": "~1.8" }, - "provide": { - "ext-mbstring": "*" + "conflict": { + "symfony/finder": "<6.4", + "symfony/service-contracts": "<2.5" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", - "extra": { - "thanks": { + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "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": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "8126f0be4ff984e4db0140e60917900a53facb49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8126f0be4ff984e4db0140e60917900a53facb49", + "reference": "8126f0be4ff984e4db0140e60917900a53facb49", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.5", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "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": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T07:35:39+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "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": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "92a91985250c251de9b947a14bb2c9390b1a562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/92a91985250c251de9b947a14bb2c9390b1a562c", + "reference": "92a91985250c251de9b947a14bb2c9390b1a562c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "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": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T10:03:55+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } @@ -2023,6 +2784,89 @@ ], "time": "2024-06-19T12:30:46+00:00" }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, { "name": "symfony/var-dumper", "version": "v7.1.3", @@ -2106,6 +2950,82 @@ ], "time": "2024-07-26T12:41:01+00:00" }, + { + "name": "symfony/var-exporter", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "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": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T08:00:31+00:00" + }, { "name": "theseer/tokenizer", "version": "1.2.3", @@ -2162,7 +3082,9 @@ "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, - "platform": [], + "platform": { + "php": "^8.3" + }, "platform-dev": [], "plugin-api-version": "2.6.0" }