From 9068e47629d7169c979b6e70afe16c3dd58f0bc4 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Wed, 25 Feb 2026 15:48:36 +0100 Subject: [PATCH 01/20] Add PostgreSQL client and server to Dockerfile --- .devcontainer/Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 71c01c0b..0f1e5424 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -17,6 +17,10 @@ RUN apt-get update && apt-get install -y \ # MySQL client AND server default-mysql-client \ default-mysql-server \ + # PostgreSQL client AND server ← AGGIUNTO + postgresql \ + postgresql-client \ + libpq-dev \ # Cypress dependencies xvfb \ libgtk2.0-0 \ @@ -30,7 +34,7 @@ RUN apt-get update && apt-get install -y \ xauth \ && \ # Install the required PHP extensions for Zip and MySQL - docker-php-ext-install zip mysqli && \ + docker-php-ext-install zip mysqli pdo pdo_pgsql pgsql && \ # Install Node.js (LTS version) curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \ apt-get install -y nodejs && \ From 174b179dec2ddc00e1e636237053b87860069082 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Wed, 25 Feb 2026 15:49:30 +0100 Subject: [PATCH 02/20] Add PostgreSQL service to docker-compose --- .devcontainer/docker-compose.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 514cb324..6ccf7f79 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -15,6 +15,7 @@ services: mysql: image: mysql:8.0 + profiles: ["mysql", "default"] command: --default-authentication-plugin=mysql_native_password restart: unless-stopped environment: @@ -24,6 +25,20 @@ services: MYSQL_PASSWORD: joomla_ut volumes: - "mysql-data:/var/lib/mysql" + + db_pgsql: + image: postgres:16 + profiles: ["pgsql"] + restart: unless-stopped + environment: + POSTGRES_DB: test_joomla + POSTGRES_USER: joomla_ut + POSTGRES_PASSWORD: joomla_ut + volumes: + - db_pgsql_data:/var/lib/postgresql/data + ports: + - "5432:5432" + mailpit: image: axllent/mailpit:latest restart: unless-stopped @@ -31,3 +46,4 @@ services: - "8025:8025" volumes: mysql-data: + db_pgsql_data: From 8470f1ff6f008084bd2750f81ccf2c5dde5622f9 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Wed, 25 Feb 2026 15:50:41 +0100 Subject: [PATCH 03/20] Add PostgreSQL to forwarded ports in devcontainer --- .devcontainer/devcontainer.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f11cd02d..59da0247 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -11,6 +11,10 @@ "label": "Web Server (Joomla & phpmyadmin)", "onAutoForward": "silent" }, + "5432": { + "label": "postgres", + "onAutoForward": "silent" + }, "6080": { "label": "Cypress GUI", "onAutoForward": "silent" @@ -20,7 +24,7 @@ "onAutoForward": "openPreview" } }, - "forwardPorts": [80, 443, 6080, 8025], + "forwardPorts": [80, 443, 5432, 6080, 8025], "postCreateCommand": "bash ./.devcontainer/post-create.sh", "customizations": { "vscode": { From d12c0bdcb4482ea32598b6c27516585103cdd069 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Wed, 25 Feb 2026 15:55:33 +0100 Subject: [PATCH 04/20] Switch database configuration from MySQL to PostgreSQL --- .devcontainer/post-create.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 0aef33c6..198ce19e 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -46,12 +46,15 @@ php installation/joomla.php install \ --admin-username="$ADMIN_USER" \ --admin-password="$ADMIN_PASS" \ --admin-email="$ADMIN_EMAIL" \ - --db-type="mysqli" \ - --db-host="mysql" \ +# --db-type="mysqli" \ +# --db-host="mysql" \ + --db-type="pgsql" \ + --db-host="db_pgsql" \ --db-name="$DB_NAME" \ --db-user="$DB_USER" \ --db-pass="$DB_PASS" \ - --db-prefix="mysql_" \ +# --db-prefix="mysql_" \ + --db-prefix="pgsql_" \ --db-encryption="0" \ --public-folder="" From 176e23ffe5b8895e7663b5981f70e712d76165ff Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Wed, 25 Feb 2026 16:42:26 +0100 Subject: [PATCH 05/20] Add .env file with MySQL profile configuration --- .devcontainer/.env | 1 + 1 file changed, 1 insertion(+) create mode 100644 .devcontainer/.env diff --git a/.devcontainer/.env b/.devcontainer/.env new file mode 100644 index 00000000..4a5b5882 --- /dev/null +++ b/.devcontainer/.env @@ -0,0 +1 @@ +PROFILE=mysql From f692262ddcd7d4963854912f2f50d0d4ca5f922d Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Wed, 25 Feb 2026 16:43:18 +0100 Subject: [PATCH 06/20] Add postStartCommand to devcontainer configuration --- .devcontainer/devcontainer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 59da0247..21dce630 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -25,6 +25,7 @@ } }, "forwardPorts": [80, 443, 5432, 6080, 8025], + "postStartCommand": "docker compose --profile ${PROFILE} up -d", "postCreateCommand": "bash ./.devcontainer/post-create.sh", "customizations": { "vscode": { From cf7979e342cfe2763fda8736c113370ffceec028 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Wed, 25 Feb 2026 16:47:18 +0100 Subject: [PATCH 07/20] Refactor post-create.sh for database profile detection --- .devcontainer/post-create.sh | 79 +++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 198ce19e..a3b300da 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -17,11 +17,44 @@ JOOMLA_ROOT="/var/www/html" git config --global --add safe.directory $WORKSPACE_ROOT -# --- 1. Wait for MariaDB --- -echo "--> Waiting for MariaDB..." -while ! mysqladmin ping -h"mysql" --silent; do - sleep 1 -done +# --- 1. Detect active DB profile --- +echo "--> Detecting active database profile..." + +PROFILE=$(grep -E '^PROFILE=' .env | cut -d '=' -f2) + +if [ -z "$PROFILE" ]; then + echo "❌ ERROR: PROFILE non definito nel file .env" + exit 1 +fi + +echo "--> Active profile: $PROFILE" + +if [ "$PROFILE" = "mysql" ]; then + DB_TYPE="mysqli" + DB_HOST="mysql" + DB_PREFIX="mysql_" + + echo "--> Waiting for MySQL..." + until mysqladmin ping -h"$DB_HOST" --silent; do + sleep 1 + done + +elif [ "$PROFILE" = "pgsql" ]; then + DB_TYPE="pgsql" + DB_HOST="db_pgsql" + DB_PREFIX="pgsql_" + + echo "--> Waiting for PostgreSQL..." + until pg_isready -h "$DB_HOST" -U "$DB_USER" >/dev/null 2>&1; do + sleep 1 + done + +else + echo "❌ ERROR: Profilo sconosciuto: $PROFILE" + exit 1 +fi + +echo "--> Database is ready!" # --- 2. Install Dependencies --- echo "--> Installing dependencies..." @@ -46,27 +79,26 @@ php installation/joomla.php install \ --admin-username="$ADMIN_USER" \ --admin-password="$ADMIN_PASS" \ --admin-email="$ADMIN_EMAIL" \ -# --db-type="mysqli" \ -# --db-host="mysql" \ - --db-type="pgsql" \ - --db-host="db_pgsql" \ + --db-type="$DB_TYPE" \ + --db-host="$DB_HOST" \ --db-name="$DB_NAME" \ --db-user="$DB_USER" \ --db-pass="$DB_PASS" \ -# --db-prefix="mysql_" \ - --db-prefix="pgsql_" \ + --db-prefix="$DB_PREFIX" \ --db-encryption="0" \ --public-folder="" # --- 5. Configure Joomla --- echo "--> Configuring Joomla..." php cli/joomla.php config:set debug=true error_reporting=maximum + # Configure mail settings for Mailpit php cli/joomla.php config:set mailer=smtp php cli/joomla.php config:set smtphost=mailpit php cli/joomla.php config:set smtpport=1025 php cli/joomla.php config:set smtpauth=0 php cli/joomla.php config:set smtpsecure=none + # Install extension if available ALIKONWEB_PKG="${WORKSPACE_ROOT}/dist/pkg-alikonweb-current.zip" if [ -f "$ALIKONWEB_PKG" ]; then @@ -98,22 +130,19 @@ if (isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] === 'localhost:80') { } EOF -# Include fix in both entry points cp $JOOMLA_ROOT/fix.php $JOOMLA_ROOT/administrator/fix.php sed -i '2i require_once __DIR__ . "/fix.php";' $JOOMLA_ROOT/index.php sed -i '2i require_once __DIR__ . "/../fix.php";' $JOOMLA_ROOT/administrator/index.php - # --- 8. Finalize and setup Cypress --- echo "--> Finalizing and setting up Cypress..." -# Only run git-related commands if we're inside a git repo if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then git update-index --assume-unchanged ./node_modules/.bin/cypress || true fi chmod +x ./node_modules/.bin/cypress chown -R www-data:www-data $JOOMLA_ROOT npx cypress install -# Navigate to workspace root where the file might be + cd "$WORKSPACE_ROOT" cp cypress.config.dist.js cypress.config.js sed -i "/db_prefix: process.env.DB_PREFIX/a \ cmsPath: '${JOOMLA_ROOT}'," cypress.config.js @@ -121,38 +150,24 @@ sed -i "s|baseUrl: 'http://localhost/'|baseUrl: 'http://localhost'|" cypress.con service apache2 restart # Save details - DETAILS_FILE="${WORKSPACE_ROOT}/codespace-details.txt" { echo "" echo "---" echo "✅ Setup complete! Your environment is ready." echo "" - echo "This information has been saved to codespace-details.txt" - echo "" echo "Joomla Admin Login:" - echo " URL: Open the 'Web Server' port and add /administrator to the end." echo " Username: $ADMIN_USER" echo " Password: $ADMIN_PASS" echo "" echo "phpMyAdmin Login:" - echo " URL: Open the 'Web Server' port and add /phpmyadmin to the end." echo " Username: joomla_ut" echo " Password: joomla_ut" echo "" - echo "Mailpit (Email Testing):" - echo " URL: Open the 'Ports' tab, find 'Mailpit Web UI' (8025), and click the Globe icon" - echo " All emails sent by Joomla will appear here for testing" + echo "Mailpit Web UI available on port 8025" echo "" - echo "To use cypress testing:" - echo " Open 'Cypress GUI' port." - echo " Run Interactive Cypress using 'npx cypress open' and you should see cypress interface when you visit 'Cypress GUI' port page." - echo " You can also run Headless tests in the terminal using 'npx cypress run'" + echo "Cypress ready to use" echo "" - echo "Xdebug for PHP Debugging:" - echo " Xdebug is pre-configured and ready to use." - echo " To start a debugging session, open the 'Run and Debug' view in VS Code," - echo " select 'Listen for Xdebug', and click the play button." - echo " The debugger will listen on port 9003." + echo "Xdebug ready on port 9003" echo "---" } | tee "$DETAILS_FILE" From faf51773febcfa6d074d6ef1e60fb3e4fade5fc7 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Wed, 25 Feb 2026 16:16:14 +0000 Subject: [PATCH 08/20] wait for db's until timeout --- .devcontainer/devcontainer.json | 13 +++++++--- .devcontainer/post-create.sh | 46 +++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 21dce630..f2fe6348 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,11 +3,13 @@ "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/testcom", + "features": { "ghcr.io/devcontainers/features/desktop-lite:1": {} }, + "portsAttributes": { - "443" : { + "443": { "label": "Web Server (Joomla & phpmyadmin)", "onAutoForward": "silent" }, @@ -24,9 +26,11 @@ "onAutoForward": "openPreview" } }, + "forwardPorts": [80, 443, 5432, 6080, 8025], - "postStartCommand": "docker compose --profile ${PROFILE} up -d", - "postCreateCommand": "bash ./.devcontainer/post-create.sh", + + "postCreateCommand": "docker compose --profile ${PROFILE} up -d && bash ./.devcontainer/post-create.sh", + "customizations": { "vscode": { "extensions": [ @@ -50,5 +54,6 @@ } } }, + "remoteUser": "root" -} +} \ No newline at end of file diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index a3b300da..9b297107 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -20,7 +20,14 @@ git config --global --add safe.directory $WORKSPACE_ROOT # --- 1. Detect active DB profile --- echo "--> Detecting active database profile..." -PROFILE=$(grep -E '^PROFILE=' .env | cut -d '=' -f2) +ENV_FILE="$WORKSPACE_ROOT/.devcontainer/.env" + +if [ ! -f "$ENV_FILE" ]; then + echo "❌ ERROR: File .env non trovato in $ENV_FILE" + exit 1 +fi + +PROFILE=$(grep -E '^PROFILE=' "$ENV_FILE" | cut -d '=' -f2) if [ -z "$PROFILE" ]; then echo "❌ ERROR: PROFILE non definito nel file .env" @@ -34,28 +41,44 @@ if [ "$PROFILE" = "mysql" ]; then DB_HOST="mysql" DB_PREFIX="mysql_" - echo "--> Waiting for MySQL..." - until mysqladmin ping -h"$DB_HOST" --silent; do + echo "--> Waiting for MySQL (max 60s)..." + for i in {1..60}; do + if mysqladmin ping -h"$DB_HOST" --silent; then + echo "--> MySQL is ready!" + break + fi sleep 1 done + if ! mysqladmin ping -h"$DB_HOST" --silent; then + echo "❌ ERROR: MySQL non risponde dopo 60 secondi" + exit 1 + fi + elif [ "$PROFILE" = "pgsql" ]; then DB_TYPE="pgsql" DB_HOST="db_pgsql" DB_PREFIX="pgsql_" - echo "--> Waiting for PostgreSQL..." - until pg_isready -h "$DB_HOST" -U "$DB_USER" >/dev/null 2>&1; do + echo "--> Waiting for PostgreSQL (max 60s)..." + for i in {1..60}; do + if pg_isready -h "$DB_HOST" -U "$DB_USER" >/dev/null 2>&1; then + echo "--> PostgreSQL is ready!" + break + fi sleep 1 done + if ! pg_isready -h "$DB_HOST" -U "$DB_USER" >/dev/null 2>&1; then + echo "❌ ERROR: PostgreSQL non risponde dopo 60 secondi" + exit 1 + fi + else echo "❌ ERROR: Profilo sconosciuto: $PROFILE" exit 1 fi -echo "--> Database is ready!" - # --- 2. Install Dependencies --- echo "--> Installing dependencies..." composer install @@ -92,21 +115,19 @@ php installation/joomla.php install \ echo "--> Configuring Joomla..." php cli/joomla.php config:set debug=true error_reporting=maximum -# Configure mail settings for Mailpit php cli/joomla.php config:set mailer=smtp php cli/joomla.php config:set smtphost=mailpit php cli/joomla.php config:set smtpport=1025 php cli/joomla.php config:set smtpauth=0 php cli/joomla.php config:set smtpsecure=none -# Install extension if available ALIKONWEB_PKG="${WORKSPACE_ROOT}/dist/pkg-alikonweb-current.zip" if [ -f "$ALIKONWEB_PKG" ]; then php cli/joomla.php extension:install --path="$ALIKONWEB_PKG" cd $WORKSPACE_ROOT && vendor/bin/robo map $JOOMLA_ROOT fi -# --- 6. Download and prepare phpMyAdmin --- +# --- 6. phpMyAdmin --- PMA_ROOT="/var/www/html/phpmyadmin" echo "--> Downloading phpMyAdmin into $PMA_ROOT..." PMA_VERSION=5.2.1 @@ -134,7 +155,7 @@ cp $JOOMLA_ROOT/fix.php $JOOMLA_ROOT/administrator/fix.php sed -i '2i require_once __DIR__ . "/fix.php";' $JOOMLA_ROOT/index.php sed -i '2i require_once __DIR__ . "/../fix.php";' $JOOMLA_ROOT/administrator/index.php -# --- 8. Finalize and setup Cypress --- +# --- 8. Cypress --- echo "--> Finalizing and setting up Cypress..." if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then git update-index --assume-unchanged ./node_modules/.bin/cypress || true @@ -149,7 +170,6 @@ sed -i "/db_prefix: process.env.DB_PREFIX/a \ cmsPath: '${JOOMLA_ROOT}'," cyp sed -i "s|baseUrl: 'http://localhost/'|baseUrl: 'http://localhost'|" cypress.config.js service apache2 restart -# Save details DETAILS_FILE="${WORKSPACE_ROOT}/codespace-details.txt" { echo "" @@ -170,4 +190,4 @@ DETAILS_FILE="${WORKSPACE_ROOT}/codespace-details.txt" echo "" echo "Xdebug ready on port 9003" echo "---" -} | tee "$DETAILS_FILE" +} | tee "$DETAILS_FILE" \ No newline at end of file From bcac0d4770d47a1b9f1eafaeed10311511db7071 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 08:40:31 +0000 Subject: [PATCH 09/20] switching --- .devcontainer/devcontainer.json | 49 ++++++++++++-------------------- .devcontainer/docker-compose.yml | 4 ++- .devcontainer/post-create.sh | 28 +++++++++++------- 3 files changed, 39 insertions(+), 42 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f2fe6348..98bf7683 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,33 +3,35 @@ "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/testcom", + "runProfiles": ["mysql"], + // Define the PROFILE here so the script can see it without needing to grep an .env file + "containerEnv": { + "PROFILE": "mysql" + }, "features": { - "ghcr.io/devcontainers/features/desktop-lite:1": {} + "ghcr.io/devcontainers/features/desktop-lite:1": {}, + "ghcr.io/devcontainers/features/docker-in-docker:2": { + "version": "latest", + "enableNonRootDocker": "true" + } }, + + "portsAttributes": { - "443": { - "label": "Web Server (Joomla & phpmyadmin)", - "onAutoForward": "silent" - }, - "5432": { - "label": "postgres", - "onAutoForward": "silent" - }, + "443": { "label": "Web Server", "onAutoForward": "silent" }, + "5432": { "label": "postgres", "onAutoForward": "silent" }, "6080": { "label": "Cypress GUI", "onAutoForward": "silent" }, - "8025": { - "label": "Mailpit Web UI", - "onAutoForward": "openPreview" - } + "8025": { "label": "Mailpit", "onAutoForward": "openPreview" } }, - "forwardPorts": [80, 443, 5432, 6080, 8025], - "postCreateCommand": "docker compose --profile ${PROFILE} up -d && bash ./.devcontainer/post-create.sh", + // Cleaned up command + "postCreateCommand": "bash ./.devcontainer/post-create.sh", "customizations": { "vscode": { @@ -37,23 +39,8 @@ "xdebug.php-debug", "bmewburn.vscode-intelephense-client", "esbenp.prettier-vscode" - ], - "settings": { - "launch": { - "version": "0.2.0", - "configurations": [ - { - "name": "Listen for Xdebug", - "type": "php", - "request": "launch", - "port": 9003, - "log": false - } - ] - } - } + ] } }, - "remoteUser": "root" } \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 6ccf7f79..8430fdac 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -9,9 +9,9 @@ services: ports: - "80:80" - "443:443" - - "3306:3306" - "6080:6080" command: sleep infinity + privileged: true mysql: image: mysql:8.0 @@ -25,6 +25,8 @@ services: MYSQL_PASSWORD: joomla_ut volumes: - "mysql-data:/var/lib/mysql" + ports: + - "3306:3306" db_pgsql: image: postgres:16 diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 9b297107..d4980407 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -27,7 +27,14 @@ if [ ! -f "$ENV_FILE" ]; then exit 1 fi -PROFILE=$(grep -E '^PROFILE=' "$ENV_FILE" | cut -d '=' -f2) +# New Way: Use the environment variable, fallback to .env if needed +if [ -z "$PROFILE" ]; then + if [ -f "$ENV_FILE" ]; then + PROFILE=$(grep -E '^PROFILE=' "$ENV_FILE" | cut -d '=' -f2) + else + PROFILE="mysql" # Default fallback + fi +fi if [ -z "$PROFILE" ]; then echo "❌ ERROR: PROFILE non definito nel file .env" @@ -43,18 +50,19 @@ if [ "$PROFILE" = "mysql" ]; then echo "--> Waiting for MySQL (max 60s)..." for i in {1..60}; do - if mysqladmin ping -h"$DB_HOST" --silent; then - echo "--> MySQL is ready!" - break + # We use a simple TCP check first to see if the port is even open + if timeout 1s bash -c "cat < /dev/null > /dev/tcp/$DB_HOST/3306" 2>/dev/null; then + echo "--> MySQL Port is open! Checking readiness..." + # Now check if it's actually accepting logins + if mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then + echo "--> MySQL is ready and authenticated!" + break + fi fi - sleep 1 + echo "--> MySQL not ready yet (attempt $i)..." + sleep 2 done - if ! mysqladmin ping -h"$DB_HOST" --silent; then - echo "❌ ERROR: MySQL non risponde dopo 60 secondi" - exit 1 - fi - elif [ "$PROFILE" = "pgsql" ]; then DB_TYPE="pgsql" DB_HOST="db_pgsql" From 6862fbcd35f51df9411117fba1b8f16f9fdda6dc Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 09:16:56 +0000 Subject: [PATCH 10/20] network --- .devcontainer/docker-compose.yml | 13 +++++++++++++ .devcontainer/post-create.sh | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 8430fdac..83965e1c 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -12,6 +12,8 @@ services: - "6080:6080" command: sleep infinity privileged: true + networks: + - internal mysql: image: mysql:8.0 @@ -27,6 +29,8 @@ services: - "mysql-data:/var/lib/mysql" ports: - "3306:3306" + networks: + - internal db_pgsql: image: postgres:16 @@ -40,12 +44,21 @@ services: - db_pgsql_data:/var/lib/postgresql/data ports: - "5432:5432" + networks: + - internal mailpit: image: axllent/mailpit:latest restart: unless-stopped ports: - "8025:8025" + networks: + - internal + volumes: mysql-data: db_pgsql_data: + +networks: + internal: + driver: bridge diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index d4980407..62090a7c 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -62,6 +62,11 @@ if [ "$PROFILE" = "mysql" ]; then echo "--> MySQL not ready yet (attempt $i)..." sleep 2 done + if ! mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then + echo "❌ ERROR: MySQL non raggiungibile dopo 60 tentativi" + exit 1 + fi + elif [ "$PROFILE" = "pgsql" ]; then DB_TYPE="pgsql" From 07acee3b487938b1ef9809f66b1b39bddd953adc Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 09:39:15 +0000 Subject: [PATCH 11/20] netwok name --- .devcontainer/devcontainer.json | 5 +---- .devcontainer/docker-compose.yml | 9 ++++++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 98bf7683..895f07d7 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -22,10 +22,7 @@ "portsAttributes": { "443": { "label": "Web Server", "onAutoForward": "silent" }, "5432": { "label": "postgres", "onAutoForward": "silent" }, - "6080": { - "label": "Cypress GUI", - "onAutoForward": "silent" - }, + "6080": {"label": "Cypress GUI", "onAutoForward": "silent"}, "8025": { "label": "Mailpit", "onAutoForward": "openPreview" } }, "forwardPorts": [80, 443, 5432, 6080, 8025], diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 83965e1c..c310519b 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,3 +1,8 @@ +networks: + internal: + name: testcom-internal + driver: bridge + services: app: build: @@ -59,6 +64,4 @@ volumes: mysql-data: db_pgsql_data: -networks: - internal: - driver: bridge + From dd316c098f8379516eb4d0dd0492e5b9106402a4 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 09:50:24 +0000 Subject: [PATCH 12/20] remove privileged: true --- .devcontainer/docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index c310519b..39f7555e 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -16,7 +16,6 @@ services: - "443:443" - "6080:6080" command: sleep infinity - privileged: true networks: - internal From 4dd5a90881626837742e00b0eed946773ec1181f Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 10:45:08 +0000 Subject: [PATCH 13/20] another-attempt --- .devcontainer/Dockerfile | 48 ++++---- .devcontainer/devcontainer.json | 24 ++-- .devcontainer/docker-compose.yml | 30 ++++- .devcontainer/post-create.sh | 203 ++++++++++++++++++------------- 4 files changed, 175 insertions(+), 130 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 0f1e5424..0339b902 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,26 +1,22 @@ -# Start from the official PHP 8.3 image with Apache FROM php:8.3-apache-bookworm -# Install system dependencies, Node.js, Composer, and Cypress dependencies RUN apt-get update && apt-get install -y \ - # System tools and git git \ zstd \ wget \ curl \ sudo \ + unzip \ # PHP extensions dependencies libpng-dev \ libonig-dev \ libxml2-dev \ libzip-dev \ - # MySQL client AND server + # MySQL client (il server MySQL gira nel container dedicato) default-mysql-client \ - default-mysql-server \ - # PostgreSQL client AND server ← AGGIUNTO - postgresql \ + # PostgreSQL client (il server PostgreSQL gira nel container dedicato) postgresql-client \ - libpq-dev \ + libpq-dev \ # Cypress dependencies xvfb \ libgtk2.0-0 \ @@ -33,29 +29,35 @@ RUN apt-get update && apt-get install -y \ libxtst6 \ xauth \ && \ - # Install the required PHP extensions for Zip and MySQL - docker-php-ext-install zip mysqli pdo pdo_pgsql pgsql && \ - # Install Node.js (LTS version) + # PHP extensions + docker-php-ext-install zip mysqli pdo pdo_mysql pdo_pgsql pgsql && \ + # Node.js LTS curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \ apt-get install -y nodejs && \ - # Install Composer globally + # Composer curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ - # Install Xdebug + # Xdebug pecl install xdebug && \ - # Enable Apache's rewrite module and set the ServerName to prevent warnings - a2enmod rewrite && \ + docker-php-ext-enable xdebug && \ + # Apache + a2enmod rewrite ssl && \ echo "ServerName localhost" >> /etc/apache2/apache2.conf && \ - # Clean up apt cache to reduce image size + # Cleanup apt-get clean && rm -rf /var/lib/apt/lists/* && \ - # Create a custom PHP configuration file to enable file uploads - # Create the log directory and file with correct permissions for the www-data user + # PHP config mkdir -p /var/log/ && \ touch /var/log/php_errors.log && \ chown -R www-data:www-data /var/log/ && \ chmod 766 /var/log/php_errors.log && \ - echo "upload_tmp_dir = /tmp" > /usr/local/etc/php/conf.d/custom-php.ini && \ - echo "post_max_size = 64M" >> /usr/local/etc/php/conf.d/custom-php.ini && \ - echo "upload_max_filesize = 64M" >> /usr/local/etc/php/conf.d/custom-php.ini && \ - echo "log_errors = On" >> /usr/local/etc/php/conf.d/custom-php.ini && \ + echo "upload_tmp_dir = /tmp" > /usr/local/etc/php/conf.d/custom-php.ini && \ + echo "post_max_size = 64M" >> /usr/local/etc/php/conf.d/custom-php.ini && \ + echo "upload_max_filesize = 64M" >> /usr/local/etc/php/conf.d/custom-php.ini && \ + echo "log_errors = On" >> /usr/local/etc/php/conf.d/custom-php.ini && \ echo "error_log = /var/log/php_errors.log" >> /usr/local/etc/php/conf.d/custom-php.ini && \ - echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/custom-php.ini + echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/custom-php.ini + +# Apache VirtualHost per Joomla +COPY apache-joomla.conf /etc/apache2/sites-available/000-default.conf + +EXPOSE 80 443 +CMD ["apache2-foreground"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 895f07d7..e1429808 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,31 +3,25 @@ "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/testcom", - "runProfiles": ["mysql"], - // Define the PROFILE here so the script can see it without needing to grep an .env file "containerEnv": { - "PROFILE": "mysql" + "PROFILE": "mysql", + "COMPOSE_PROFILES": "mysql" }, "features": { - "ghcr.io/devcontainers/features/desktop-lite:1": {}, - "ghcr.io/devcontainers/features/docker-in-docker:2": { - "version": "latest", - "enableNonRootDocker": "true" - } + "ghcr.io/devcontainers/features/desktop-lite:1": {} }, - - "portsAttributes": { - "443": { "label": "Web Server", "onAutoForward": "silent" }, - "5432": { "label": "postgres", "onAutoForward": "silent" }, - "6080": {"label": "Cypress GUI", "onAutoForward": "silent"}, + "80": { "label": "Web Server", "onAutoForward": "silent" }, + "443": { "label": "Web Server HTTPS", "onAutoForward": "silent" }, + "3306": { "label": "MySQL", "onAutoForward": "silent" }, + "5432": { "label": "PostgreSQL", "onAutoForward": "silent" }, + "6080": { "label": "Cypress GUI", "onAutoForward": "silent" }, "8025": { "label": "Mailpit", "onAutoForward": "openPreview" } }, - "forwardPorts": [80, 443, 5432, 6080, 8025], + "forwardPorts": [80, 443, 3306, 5432, 6080, 8025], - // Cleaned up command "postCreateCommand": "bash ./.devcontainer/post-create.sh", "customizations": { diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 39f7555e..41e97340 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,5 +1,5 @@ networks: - internal: + internal: name: testcom-internal driver: bridge @@ -18,10 +18,17 @@ services: command: sleep infinity networks: - internal + depends_on: + mysql: + condition: service_healthy + required: false + db_pgsql: + condition: service_healthy + required: false mysql: image: mysql:8.0 - profiles: ["mysql", "default"] + profiles: ["mysql"] command: --default-authentication-plugin=mysql_native_password restart: unless-stopped environment: @@ -30,11 +37,17 @@ services: MYSQL_USER: joomla_ut MYSQL_PASSWORD: joomla_ut volumes: - - "mysql-data:/var/lib/mysql" + - mysql-data:/var/lib/mysql ports: - "3306:3306" networks: - internal + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "joomla_ut", "-pjoomla_ut"] + interval: 5s + timeout: 5s + retries: 20 + start_period: 10s db_pgsql: image: postgres:16 @@ -50,17 +63,22 @@ services: - "5432:5432" networks: - internal + healthcheck: + test: ["CMD-SHELL", "pg_isready -U joomla_ut -d test_joomla"] + interval: 5s + timeout: 5s + retries: 20 + start_period: 10s mailpit: image: axllent/mailpit:latest restart: unless-stopped ports: + - "1025:1025" - "8025:8025" networks: - internal volumes: mysql-data: - db_pgsql_data: - - + db_pgsql_data: \ No newline at end of file diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 62090a7c..396cffbd 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -15,32 +15,14 @@ ADMIN_EMAIL="admin@example.org" WORKSPACE_ROOT="/workspaces/testcom" JOOMLA_ROOT="/var/www/html" -git config --global --add safe.directory $WORKSPACE_ROOT +git config --global --add safe.directory "$WORKSPACE_ROOT" # --- 1. Detect active DB profile --- echo "--> Detecting active database profile..." -ENV_FILE="$WORKSPACE_ROOT/.devcontainer/.env" - -if [ ! -f "$ENV_FILE" ]; then - echo "❌ ERROR: File .env non trovato in $ENV_FILE" - exit 1 -fi - -# New Way: Use the environment variable, fallback to .env if needed -if [ -z "$PROFILE" ]; then - if [ -f "$ENV_FILE" ]; then - PROFILE=$(grep -E '^PROFILE=' "$ENV_FILE" | cut -d '=' -f2) - else - PROFILE="mysql" # Default fallback - fi -fi - -if [ -z "$PROFILE" ]; then - echo "❌ ERROR: PROFILE non definito nel file .env" - exit 1 -fi - +# PROFILE è iniettato da containerEnv nel devcontainer.json +# Fallback a mysql se non definito +PROFILE="${PROFILE:-mysql}" echo "--> Active profile: $PROFILE" if [ "$PROFILE" = "mysql" ]; then @@ -48,37 +30,33 @@ if [ "$PROFILE" = "mysql" ]; then DB_HOST="mysql" DB_PREFIX="mysql_" - echo "--> Waiting for MySQL (max 60s)..." - for i in {1..60}; do - # We use a simple TCP check first to see if the port is even open - if timeout 1s bash -c "cat < /dev/null > /dev/tcp/$DB_HOST/3306" 2>/dev/null; then - echo "--> MySQL Port is open! Checking readiness..." - # Now check if it's actually accepting logins - if mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then - echo "--> MySQL is ready and authenticated!" - break - fi + echo "--> Waiting for MySQL (max 120s)..." + for i in $(seq 1 60); do + if mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then + echo "--> MySQL is ready!" + break fi - echo "--> MySQL not ready yet (attempt $i)..." + echo "--> MySQL not ready yet (attempt $i/60)..." sleep 2 done + if ! mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then - echo "❌ ERROR: MySQL non raggiungibile dopo 60 tentativi" + echo "❌ ERROR: MySQL non raggiungibile dopo 120 secondi" exit 1 fi - elif [ "$PROFILE" = "pgsql" ]; then DB_TYPE="pgsql" DB_HOST="db_pgsql" DB_PREFIX="pgsql_" echo "--> Waiting for PostgreSQL (max 60s)..." - for i in {1..60}; do + for i in $(seq 1 60); do if pg_isready -h "$DB_HOST" -U "$DB_USER" >/dev/null 2>&1; then echo "--> PostgreSQL is ready!" break fi + echo "--> PostgreSQL not ready yet (attempt $i/60)..." sleep 1 done @@ -88,27 +66,37 @@ elif [ "$PROFILE" = "pgsql" ]; then fi else - echo "❌ ERROR: Profilo sconosciuto: $PROFILE" + echo "❌ ERROR: Profilo sconosciuto: $PROFILE. Valori validi: mysql, pgsql" exit 1 fi # --- 2. Install Dependencies --- -echo "--> Installing dependencies..." -composer install +echo "--> Installing Composer dependencies..." +cd "$WORKSPACE_ROOT" +composer install --no-interaction + +echo "--> Installing Node dependencies..." npm install # --- 3. Build Extension --- echo "--> Building extension..." -[ -f "vendor/bin/robo" ] && vendor/bin/robo build || echo "Robo not found, skipping build." +if [ -f "vendor/bin/robo" ]; then + vendor/bin/robo build +else + echo "Robo not found, skipping build." +fi # --- 4. Install Joomla --- echo "--> Installing Joomla..." -rm -f $JOOMLA_ROOT/index.html -cd $JOOMLA_ROOT +rm -f "$JOOMLA_ROOT/index.html" +cd "$JOOMLA_ROOT" + +echo "--> Downloading Joomla nightly..." curl -o joomla.tar.zst -L https://developer.joomla.org/download-nightly.php/stable/debug/full/joomla.tar.zst tar xfa joomla.tar.zst rm joomla.tar.zst +echo "--> Running Joomla installer..." php installation/joomla.php install \ --site-name="Joomla CMS Test" \ --admin-user="$ADMIN_REAL_NAME" \ @@ -134,73 +122,116 @@ php cli/joomla.php config:set smtpport=1025 php cli/joomla.php config:set smtpauth=0 php cli/joomla.php config:set smtpsecure=none +# --- 6. Install extension if present --- ALIKONWEB_PKG="${WORKSPACE_ROOT}/dist/pkg-alikonweb-current.zip" if [ -f "$ALIKONWEB_PKG" ]; then - php cli/joomla.php extension:install --path="$ALIKONWEB_PKG" - cd $WORKSPACE_ROOT && vendor/bin/robo map $JOOMLA_ROOT + echo "--> Installing Alikonweb extension..." + php "$JOOMLA_ROOT/cli/joomla.php" extension:install --path="$ALIKONWEB_PKG" + cd "$WORKSPACE_ROOT" && vendor/bin/robo map "$JOOMLA_ROOT" +fi + +# --- 7. phpMyAdmin (solo se profilo mysql) --- +if [ "$PROFILE" = "mysql" ]; then + PMA_ROOT="/var/www/html/phpmyadmin" + PMA_VERSION="5.2.1" + echo "--> Installing phpMyAdmin $PMA_VERSION..." + mkdir -p "$PMA_ROOT" + curl -sL -o /tmp/phpmyadmin.tar.gz \ + "https://files.phpmyadmin.net/phpMyAdmin/${PMA_VERSION}/phpMyAdmin-${PMA_VERSION}-all-languages.tar.gz" + tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C "$PMA_ROOT" + rm /tmp/phpmyadmin.tar.gz + cp "$PMA_ROOT/config.sample.inc.php" "$PMA_ROOT/config.inc.php" + # Imposta host mysql e disabilita autenticazione per sviluppo + sed -i "s/\['host'\] = 'localhost'/['host'] = 'mysql'/" "$PMA_ROOT/config.inc.php" + # Genera un blowfish secret casuale + BLOWFISH=$(openssl rand -base64 32 | tr -d '=+/' | head -c 32) + sed -i "s/\['blowfish_secret'\] = ''/['blowfish_secret'] = '$BLOWFISH'/" "$PMA_ROOT/config.inc.php" fi -# --- 6. phpMyAdmin --- -PMA_ROOT="/var/www/html/phpmyadmin" -echo "--> Downloading phpMyAdmin into $PMA_ROOT..." -PMA_VERSION=5.2.1 -mkdir -p $PMA_ROOT -curl -o /tmp/phpmyadmin.tar.gz https://files.phpmyadmin.net/phpMyAdmin/${PMA_VERSION}/phpMyAdmin-${PMA_VERSION}-all-languages.tar.gz -tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C $PMA_ROOT -rm /tmp/phpmyadmin.tar.gz -cp $PMA_ROOT/config.sample.inc.php $PMA_ROOT/config.inc.php -sed -i "/\['AllowNoPassword'\] = false/a \$cfg['Servers'][\$i]['host'] = 'mysql';" $PMA_ROOT/config.inc.php - -# --- 7. Codespaces Fix --- -echo "--> Applying Codespaces fix..." - -cat > $JOOMLA_ROOT/fix.php << 'EOF' +# --- 8. Codespaces proxy fix --- +echo "--> Applying Codespaces reverse-proxy fix..." + +cat > "$JOOMLA_ROOT/fix.php" << 'EOF' Setting permissions..." +chown -R www-data:www-data "$JOOMLA_ROOT" +chmod -R 755 "$JOOMLA_ROOT" + +# --- 10. Cypress --- +echo "--> Setting up Cypress..." +cd "$WORKSPACE_ROOT" -# --- 8. Cypress --- -echo "--> Finalizing and setting up Cypress..." if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then - git update-index --assume-unchanged ./node_modules/.bin/cypress || true + git update-index --assume-unchanged ./node_modules/.bin/cypress 2>/dev/null || true fi + chmod +x ./node_modules/.bin/cypress -chown -R www-data:www-data $JOOMLA_ROOT npx cypress install -cd "$WORKSPACE_ROOT" cp cypress.config.dist.js cypress.config.js + +# URL base: usa l'URL pubblico del Codespace se disponibile, altrimenti localhost +if [ -n "$CODESPACE_NAME" ] && [ -n "$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN" ]; then + BASE_URL="https://${CODESPACE_NAME}-80.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}" + echo "--> Codespace detected, using baseUrl: $BASE_URL" +else + BASE_URL="http://localhost" + echo "--> Local environment, using baseUrl: $BASE_URL" +fi + +sed -i "s|baseUrl: 'http://localhost[^']*'|baseUrl: '${BASE_URL}'|" cypress.config.js sed -i "/db_prefix: process.env.DB_PREFIX/a \ cmsPath: '${JOOMLA_ROOT}'," cypress.config.js -sed -i "s|baseUrl: 'http://localhost/'|baseUrl: 'http://localhost'|" cypress.config.js -service apache2 restart +# --- 11. Restart Apache --- +echo "--> Restarting Apache..." +service apache2 restart || apache2ctl restart || true + +# --- Done --- DETAILS_FILE="${WORKSPACE_ROOT}/codespace-details.txt" { echo "" - echo "---" + echo "================================================" echo "✅ Setup complete! Your environment is ready." + echo "================================================" echo "" - echo "Joomla Admin Login:" + echo "Profile attivo: $PROFILE" + echo "" + echo "Joomla Admin:" + echo " URL: ${BASE_URL}/administrator" echo " Username: $ADMIN_USER" echo " Password: $ADMIN_PASS" echo "" - echo "phpMyAdmin Login:" - echo " Username: joomla_ut" - echo " Password: joomla_ut" - echo "" - echo "Mailpit Web UI available on port 8025" - echo "" - echo "Cypress ready to use" + if [ "$PROFILE" = "mysql" ]; then + echo "phpMyAdmin:" + echo " URL: ${BASE_URL}/phpmyadmin" + echo " Username: $DB_USER" + echo " Password: $DB_PASS" echo "" - echo "Xdebug ready on port 9003" - echo "---" -} | tee "$DETAILS_FILE" \ No newline at end of file + fi + echo "Mailpit Web UI: porta 8025" + echo "Cypress: pronto" + echo "Xdebug: porta 9003" + echo "================================================" +} | tee "$DETAILS_FILE" + +cat "$DETAILS_FILE" \ No newline at end of file From 528c7dc1d05b423c5382e6eec076cfd9d0b46a4b Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 11:59:44 +0100 Subject: [PATCH 14/20] Add Apache configuration for Joomla setup --- .devcontainer/apache-joomla.conf | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .devcontainer/apache-joomla.conf diff --git a/.devcontainer/apache-joomla.conf b/.devcontainer/apache-joomla.conf new file mode 100644 index 00000000..ff361f2e --- /dev/null +++ b/.devcontainer/apache-joomla.conf @@ -0,0 +1,13 @@ + + ServerAdmin webmaster@localhost + DocumentRoot /var/www/html + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + From 30be3db5fc332fc40df9c82133dfd0d055590caf Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 11:35:38 +0000 Subject: [PATCH 15/20] detect-better --- .devcontainer/devcontainer.json | 3 ++- .devcontainer/docker-compose.yml | 1 - .devcontainer/post-create.sh | 34 +++++++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e1429808..9bc625c8 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,9 +3,10 @@ "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/testcom", + "runServices": ["app", "mysql", "mailpit"], + "containerEnv": { "PROFILE": "mysql", - "COMPOSE_PROFILES": "mysql" }, "features": { diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 41e97340..73fbd494 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -28,7 +28,6 @@ services: mysql: image: mysql:8.0 - profiles: ["mysql"] command: --default-authentication-plugin=mysql_native_password restart: unless-stopped environment: diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 396cffbd..7baa9b14 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -30,18 +30,42 @@ if [ "$PROFILE" = "mysql" ]; then DB_HOST="mysql" DB_PREFIX="mysql_" - echo "--> Waiting for MySQL (max 120s)..." + echo "--> Waiting for MySQL container to be reachable (max 300s)..." + + # Step 1: aspetta che la porta TCP sia aperta + echo "--> Step 1: waiting for TCP port 3306 on $DB_HOST..." + for i in $(seq 1 60); do + if timeout 2s bash -c "cat < /dev/null > /dev/tcp/$DB_HOST/3306" 2>/dev/null; then + echo "--> Port 3306 is open after $i attempts" + break + fi + echo "--> TCP not open yet (attempt $i/60)..." + sleep 3 + done + + # Step 2: aspetta che MySQL accetti connessioni autenticate + echo "--> Step 2: waiting for MySQL to accept connections..." for i in $(seq 1 60); do if mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then - echo "--> MySQL is ready!" + echo "--> MySQL is ready after $i attempts!" break fi - echo "--> MySQL not ready yet (attempt $i/60)..." - sleep 2 + # Mostra l'errore reale per capire cosa sta succedendo + MYSQL_ERR=$(mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" 2>&1 | head -1) + echo "--> Not ready yet (attempt $i/60): $MYSQL_ERR" + sleep 3 done if ! mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then - echo "❌ ERROR: MySQL non raggiungibile dopo 120 secondi" + echo "❌ ERROR: MySQL non raggiungibile" + echo "--- Debug info ---" + echo "Hostname resolution:" + getent hosts "$DB_HOST" || echo " Cannot resolve $DB_HOST" + echo "Network interfaces:" + ip addr show 2>/dev/null || ifconfig 2>/dev/null || echo " ip/ifconfig not available" + echo "Docker networks:" + cat /etc/hosts + echo "------------------" exit 1 fi From 3b48472e82a4fee578ae40c779a21a94ac98e18d Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 13:00:01 +0100 Subject: [PATCH 16/20] Remove port mappings for database services Removed port mappings for MySQL and PostgreSQL services to avoid conflicts in Codespaces. --- .devcontainer/docker-compose.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 73fbd494..5cedb4d2 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -37,8 +37,7 @@ services: MYSQL_PASSWORD: joomla_ut volumes: - mysql-data:/var/lib/mysql - ports: - - "3306:3306" + # Nessun ports: — non serve in Codespaces, evita conflitti con porta host networks: - internal healthcheck: @@ -46,7 +45,7 @@ services: interval: 5s timeout: 5s retries: 20 - start_period: 10s + start_period: 15s db_pgsql: image: postgres:16 @@ -58,8 +57,7 @@ services: POSTGRES_PASSWORD: joomla_ut volumes: - db_pgsql_data:/var/lib/postgresql/data - ports: - - "5432:5432" + # Nessun ports: — stessa ragione networks: - internal healthcheck: @@ -80,4 +78,4 @@ services: volumes: mysql-data: - db_pgsql_data: \ No newline at end of file + db_pgsql_data: From 33973c6373d5f72b9154d05e5b0f3a6dc39704e6 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 13:32:12 +0000 Subject: [PATCH 17/20] xdebug --- .devcontainer/devcontainer.json | 20 +- .devcontainer/docker-compose.yml | 5 +- .devcontainer/post-create.sh | 195 +- .devcontainer/xdebug.ini | 6 +- .vscode/launch.json | 33 + composer.lock | 6100 ++++++++++++++++++++++++++++++ package-lock.json | 4 +- 7 files changed, 6235 insertions(+), 128 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 composer.lock diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9bc625c8..c0a47904 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,25 +3,29 @@ "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/testcom", - "runServices": ["app", "mysql", "mailpit"], + // Per MySQL: + "runServices": ["app", "mysql", "mailpit"], "containerEnv": { - "PROFILE": "mysql", + "PROFILE": "mysql" }, + // Per PostgreSQL, sostituisci le due righe sopra con: + // "runServices": ["app", "db_pgsql", "mailpit"], + // "containerEnv": { "PROFILE": "pgsql" }, + "features": { "ghcr.io/devcontainers/features/desktop-lite:1": {} }, "portsAttributes": { - "80": { "label": "Web Server", "onAutoForward": "silent" }, + "80": { "label": "Web Server", "onAutoForward": "silent" }, "443": { "label": "Web Server HTTPS", "onAutoForward": "silent" }, - "3306": { "label": "MySQL", "onAutoForward": "silent" }, - "5432": { "label": "PostgreSQL", "onAutoForward": "silent" }, - "6080": { "label": "Cypress GUI", "onAutoForward": "silent" }, - "8025": { "label": "Mailpit", "onAutoForward": "openPreview" } + "6080": { "label": "Cypress GUI", "onAutoForward": "silent" }, + "8025": { "label": "Mailpit", "onAutoForward": "openPreview" }, + "9003": { "label": "Xdebug", "onAutoForward": "silent" } }, - "forwardPorts": [80, 443, 3306, 5432, 6080, 8025], + "forwardPorts": [80, 443, 6080, 8025, 9003], "postCreateCommand": "bash ./.devcontainer/post-create.sh", diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 5cedb4d2..b5d4a5ea 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -11,6 +11,7 @@ services: volumes: - ..:/workspaces/testcom:cached - ./xdebug.ini:/usr/local/etc/php/conf.d/99-xdebug.ini + - joomla-html:/var/www/html ports: - "80:80" - "443:443" @@ -37,7 +38,6 @@ services: MYSQL_PASSWORD: joomla_ut volumes: - mysql-data:/var/lib/mysql - # Nessun ports: — non serve in Codespaces, evita conflitti con porta host networks: - internal healthcheck: @@ -49,7 +49,6 @@ services: db_pgsql: image: postgres:16 - profiles: ["pgsql"] restart: unless-stopped environment: POSTGRES_DB: test_joomla @@ -57,7 +56,6 @@ services: POSTGRES_PASSWORD: joomla_ut volumes: - db_pgsql_data:/var/lib/postgresql/data - # Nessun ports: — stessa ragione networks: - internal healthcheck: @@ -79,3 +77,4 @@ services: volumes: mysql-data: db_pgsql_data: + joomla-html: \ No newline at end of file diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 7baa9b14..d0bfe46a 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -4,7 +4,6 @@ set -e echo "--- Starting Post-Creation Setup ---" -# Configuration variables DB_NAME="test_joomla" DB_USER="joomla_ut" DB_PASS="joomla_ut" @@ -19,9 +18,6 @@ git config --global --add safe.directory "$WORKSPACE_ROOT" # --- 1. Detect active DB profile --- echo "--> Detecting active database profile..." - -# PROFILE è iniettato da containerEnv nel devcontainer.json -# Fallback a mysql se non definito PROFILE="${PROFILE:-mysql}" echo "--> Active profile: $PROFILE" @@ -30,42 +26,22 @@ if [ "$PROFILE" = "mysql" ]; then DB_HOST="mysql" DB_PREFIX="mysql_" - echo "--> Waiting for MySQL container to be reachable (max 300s)..." - - # Step 1: aspetta che la porta TCP sia aperta - echo "--> Step 1: waiting for TCP port 3306 on $DB_HOST..." - for i in $(seq 1 60); do - if timeout 2s bash -c "cat < /dev/null > /dev/tcp/$DB_HOST/3306" 2>/dev/null; then - echo "--> Port 3306 is open after $i attempts" - break - fi - echo "--> TCP not open yet (attempt $i/60)..." - sleep 3 - done - - # Step 2: aspetta che MySQL accetti connessioni autenticate - echo "--> Step 2: waiting for MySQL to accept connections..." + echo "--> Waiting for MySQL (max 300s)..." for i in $(seq 1 60); do if mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then echo "--> MySQL is ready after $i attempts!" break fi - # Mostra l'errore reale per capire cosa sta succedendo MYSQL_ERR=$(mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" 2>&1 | head -1) echo "--> Not ready yet (attempt $i/60): $MYSQL_ERR" - sleep 3 + sleep 5 done if ! mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" >/dev/null 2>&1; then - echo "❌ ERROR: MySQL non raggiungibile" - echo "--- Debug info ---" - echo "Hostname resolution:" - getent hosts "$DB_HOST" || echo " Cannot resolve $DB_HOST" - echo "Network interfaces:" - ip addr show 2>/dev/null || ifconfig 2>/dev/null || echo " ip/ifconfig not available" - echo "Docker networks:" + echo "❌ ERROR: MySQL non raggiungibile dopo 300 secondi" + echo "--- Debug ---" + getent hosts "$DB_HOST" || echo "Cannot resolve $DB_HOST" cat /etc/hosts - echo "------------------" exit 1 fi @@ -77,10 +53,10 @@ elif [ "$PROFILE" = "pgsql" ]; then echo "--> Waiting for PostgreSQL (max 60s)..." for i in $(seq 1 60); do if pg_isready -h "$DB_HOST" -U "$DB_USER" >/dev/null 2>&1; then - echo "--> PostgreSQL is ready!" + echo "--> PostgreSQL is ready after $i attempts!" break fi - echo "--> PostgreSQL not ready yet (attempt $i/60)..." + echo "--> Not ready yet (attempt $i/60)..." sleep 1 done @@ -111,73 +87,72 @@ else fi # --- 4. Install Joomla --- -echo "--> Installing Joomla..." -rm -f "$JOOMLA_ROOT/index.html" -cd "$JOOMLA_ROOT" - -echo "--> Downloading Joomla nightly..." -curl -o joomla.tar.zst -L https://developer.joomla.org/download-nightly.php/stable/debug/full/joomla.tar.zst -tar xfa joomla.tar.zst -rm joomla.tar.zst - -echo "--> Running Joomla installer..." -php installation/joomla.php install \ - --site-name="Joomla CMS Test" \ - --admin-user="$ADMIN_REAL_NAME" \ - --admin-username="$ADMIN_USER" \ - --admin-password="$ADMIN_PASS" \ - --admin-email="$ADMIN_EMAIL" \ - --db-type="$DB_TYPE" \ - --db-host="$DB_HOST" \ - --db-name="$DB_NAME" \ - --db-user="$DB_USER" \ - --db-pass="$DB_PASS" \ - --db-prefix="$DB_PREFIX" \ - --db-encryption="0" \ - --public-folder="" - -# --- 5. Configure Joomla --- -echo "--> Configuring Joomla..." -php cli/joomla.php config:set debug=true error_reporting=maximum - -php cli/joomla.php config:set mailer=smtp -php cli/joomla.php config:set smtphost=mailpit -php cli/joomla.php config:set smtpport=1025 -php cli/joomla.php config:set smtpauth=0 -php cli/joomla.php config:set smtpsecure=none - -# --- 6. Install extension if present --- -ALIKONWEB_PKG="${WORKSPACE_ROOT}/dist/pkg-alikonweb-current.zip" -if [ -f "$ALIKONWEB_PKG" ]; then - echo "--> Installing Alikonweb extension..." - php "$JOOMLA_ROOT/cli/joomla.php" extension:install --path="$ALIKONWEB_PKG" - cd "$WORKSPACE_ROOT" && vendor/bin/robo map "$JOOMLA_ROOT" -fi - -# --- 7. phpMyAdmin (solo se profilo mysql) --- -if [ "$PROFILE" = "mysql" ]; then - PMA_ROOT="/var/www/html/phpmyadmin" - PMA_VERSION="5.2.1" - echo "--> Installing phpMyAdmin $PMA_VERSION..." - mkdir -p "$PMA_ROOT" - curl -sL -o /tmp/phpmyadmin.tar.gz \ - "https://files.phpmyadmin.net/phpMyAdmin/${PMA_VERSION}/phpMyAdmin-${PMA_VERSION}-all-languages.tar.gz" - tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C "$PMA_ROOT" - rm /tmp/phpmyadmin.tar.gz - cp "$PMA_ROOT/config.sample.inc.php" "$PMA_ROOT/config.inc.php" - # Imposta host mysql e disabilita autenticazione per sviluppo - sed -i "s/\['host'\] = 'localhost'/['host'] = 'mysql'/" "$PMA_ROOT/config.inc.php" - # Genera un blowfish secret casuale - BLOWFISH=$(openssl rand -base64 32 | tr -d '=+/' | head -c 32) - sed -i "s/\['blowfish_secret'\] = ''/['blowfish_secret'] = '$BLOWFISH'/" "$PMA_ROOT/config.inc.php" -fi +# Controlla se Joomla è già installato nel volume (rebuild del codespace) +if [ -f "$JOOMLA_ROOT/configuration.php" ]; then + echo "--> Joomla already installed in volume, skipping download." +else + echo "--> Installing Joomla..." + rm -f "$JOOMLA_ROOT/index.html" + cd "$JOOMLA_ROOT" + + echo "--> Downloading Joomla nightly..." + curl -o joomla.tar.zst -L https://developer.joomla.org/download-nightly.php/stable/debug/full/joomla.tar.zst + tar xfa joomla.tar.zst + rm joomla.tar.zst + + echo "--> Running Joomla installer..." + php installation/joomla.php install \ + --site-name="Joomla CMS Test" \ + --admin-user="$ADMIN_REAL_NAME" \ + --admin-username="$ADMIN_USER" \ + --admin-password="$ADMIN_PASS" \ + --admin-email="$ADMIN_EMAIL" \ + --db-type="$DB_TYPE" \ + --db-host="$DB_HOST" \ + --db-name="$DB_NAME" \ + --db-user="$DB_USER" \ + --db-pass="$DB_PASS" \ + --db-prefix="$DB_PREFIX" \ + --db-encryption="0" \ + --public-folder="" + + # --- 5. Configure Joomla --- + echo "--> Configuring Joomla..." + php cli/joomla.php config:set debug=true error_reporting=maximum + php cli/joomla.php config:set mailer=smtp + php cli/joomla.php config:set smtphost=mailpit + php cli/joomla.php config:set smtpport=1025 + php cli/joomla.php config:set smtpauth=0 + php cli/joomla.php config:set smtpsecure=none + + # --- 6. Install extension if present --- + ALIKONWEB_PKG="${WORKSPACE_ROOT}/dist/pkg-alikonweb-current.zip" + if [ -f "$ALIKONWEB_PKG" ]; then + echo "--> Installing Alikonweb extension..." + php "$JOOMLA_ROOT/cli/joomla.php" extension:install --path="$ALIKONWEB_PKG" + cd "$WORKSPACE_ROOT" && vendor/bin/robo map "$JOOMLA_ROOT" + fi -# --- 8. Codespaces proxy fix --- -echo "--> Applying Codespaces reverse-proxy fix..." + # --- 7. phpMyAdmin (solo mysql) --- + if [ "$PROFILE" = "mysql" ]; then + PMA_ROOT="/var/www/html/phpmyadmin" + PMA_VERSION="5.2.1" + echo "--> Installing phpMyAdmin $PMA_VERSION..." + mkdir -p "$PMA_ROOT" + curl -sL -o /tmp/phpmyadmin.tar.gz \ + "https://files.phpmyadmin.net/phpMyAdmin/${PMA_VERSION}/phpMyAdmin-${PMA_VERSION}-all-languages.tar.gz" + tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C "$PMA_ROOT" + rm /tmp/phpmyadmin.tar.gz + cp "$PMA_ROOT/config.sample.inc.php" "$PMA_ROOT/config.inc.php" + sed -i "s/\['host'\] = 'localhost'/['host'] = 'mysql'/" "$PMA_ROOT/config.inc.php" + BLOWFISH=$(openssl rand -base64 32 | tr -d '=+/' | head -c 32) + sed -i "s/\['blowfish_secret'\] = ''/['blowfish_secret'] = '$BLOWFISH'/" "$PMA_ROOT/config.inc.php" + fi -cat > "$JOOMLA_ROOT/fix.php" << 'EOF' + # --- 8. Codespaces proxy fix --- + echo "--> Applying Codespaces reverse-proxy fix..." + cat > "$JOOMLA_ROOT/fix.php" << 'EOF' Setting permissions..." -chown -R www-data:www-data "$JOOMLA_ROOT" -chmod -R 755 "$JOOMLA_ROOT" + # --- 9. Permessi --- + echo "--> Setting permissions..." + chown -R www-data:www-data "$JOOMLA_ROOT" + chmod -R 755 "$JOOMLA_ROOT" +fi # --- 10. Cypress --- echo "--> Setting up Cypress..." @@ -214,13 +184,12 @@ npx cypress install cp cypress.config.dist.js cypress.config.js -# URL base: usa l'URL pubblico del Codespace se disponibile, altrimenti localhost if [ -n "$CODESPACE_NAME" ] && [ -n "$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN" ]; then BASE_URL="https://${CODESPACE_NAME}-80.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}" - echo "--> Codespace detected, using baseUrl: $BASE_URL" + echo "--> Codespace detected, baseUrl: $BASE_URL" else BASE_URL="http://localhost" - echo "--> Local environment, using baseUrl: $BASE_URL" + echo "--> Local environment, baseUrl: $BASE_URL" fi sed -i "s|baseUrl: 'http://localhost[^']*'|baseUrl: '${BASE_URL}'|" cypress.config.js @@ -252,10 +221,10 @@ DETAILS_FILE="${WORKSPACE_ROOT}/codespace-details.txt" echo " Password: $DB_PASS" echo "" fi - echo "Mailpit Web UI: porta 8025" - echo "Cypress: pronto" - echo "Xdebug: porta 9003" + echo "Mailpit: porta 8025" + echo "Cypress: pronto" + echo "Xdebug: porta 9003" echo "================================================" } | tee "$DETAILS_FILE" -cat "$DETAILS_FILE" \ No newline at end of file +cat "$DETAILS_FILE" diff --git a/.devcontainer/xdebug.ini b/.devcontainer/xdebug.ini index 1953f877..90c7962b 100644 --- a/.devcontainer/xdebug.ini +++ b/.devcontainer/xdebug.ini @@ -1,6 +1,8 @@ -[xdebug] zend_extension=xdebug + xdebug.mode=debug xdebug.start_with_request=yes xdebug.client_port=9003 -xdebug.client_host=localhost +xdebug.client_host=host.docker.internal +xdebug.idekey=VSCODE +xdebug.log_level=0 \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..1b2d313d --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Listen for Xdebug", + "type": "php", + "request": "launch", + "port": 9003, + "pathMappings": { + "/var/www/html": "/var/www/html", + "/workspaces/testcom": "${workspaceFolder}" + }, + "ignore": [ + "**/vendor/**/*.php" + ], + "log": false + }, + { + "name": "Listen for Xdebug (verbose)", + "type": "php", + "request": "launch", + "port": 9003, + "pathMappings": { + "/var/www/html": "/var/www/html", + "/workspaces/testcom": "${workspaceFolder}" + }, + "ignore": [ + "**/vendor/**/*.php" + ], + "log": true + } + ] +} \ No newline at end of file diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..b25c56ae --- /dev/null +++ b/composer.lock @@ -0,0 +1,6100 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "206ea0e8ca5705bc5e6e3c0dc079a44d", + "packages": [], + "packages-dev": [ + { + "name": "clue/ndjson-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.5.10", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.10" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-12-08T15:06:51+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "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.2" + }, + "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-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+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": "consolidation/annotated-command", + "version": "4.10.4", + "source": { + "type": "git", + "url": "https://github.com/consolidation/annotated-command.git", + "reference": "69d29da4acac31a43caa4cea13b6b948f4e5c56d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/69d29da4acac31a43caa4cea13b6b948f4e5c56d", + "reference": "69d29da4acac31a43caa4cea13b6b948f4e5c56d", + "shasum": "" + }, + "require": { + "consolidation/output-formatters": "^4.3.1", + "php": ">=7.1.3", + "psr/log": "^1 || ^2 || ^3", + "symfony/console": "^4.4.8 || ^5 || ^6 || ^7", + "symfony/event-dispatcher": "^4.4.8 || ^5 || ^6 || ^7", + "symfony/finder": "^4.4.8 || ^5 || ^6 || ^7" + }, + "require-dev": { + "composer-runtime-api": "^2.0", + "phpunit/phpunit": "^7.5.20 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3", + "yoast/phpunit-polyfills": "^0.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Consolidation\\AnnotatedCommand\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Initialize Symfony Console commands from annotated command class methods.", + "support": { + "issues": "https://github.com/consolidation/annotated-command/issues", + "source": "https://github.com/consolidation/annotated-command/tree/4.10.4" + }, + "time": "2025-11-14T22:57:49+00:00" + }, + { + "name": "consolidation/config", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/consolidation/config.git", + "reference": "797652cd5ac870f02eb3ca1a7169d3dbbe6e5f84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/config/zipball/797652cd5ac870f02eb3ca1a7169d3dbbe6e5f84", + "reference": "797652cd5ac870f02eb3ca1a7169d3dbbe6e5f84", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3", + "grasmash/expander": "^3", + "php": ">=8.2.0", + "symfony/event-dispatcher": "^6 || ^7" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3", + "symfony/console": "^7", + "symfony/yaml": "^7", + "yoast/phpunit-polyfills": "^1" + }, + "suggest": { + "symfony/event-dispatcher": "Required to inject configuration into Command options", + "symfony/yaml": "Required to use Consolidation\\Config\\Loader\\YamlConfigLoader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Consolidation\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Provide configuration services for a commandline tool.", + "support": { + "issues": "https://github.com/consolidation/config/issues", + "source": "https://github.com/consolidation/config/tree/3.2.0" + }, + "time": "2025-11-14T18:44:25+00:00" + }, + { + "name": "consolidation/log", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/consolidation/log.git", + "reference": "c1a87a94c01957697ec347fd67404d7f0030d1aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/log/zipball/c1a87a94c01957697ec347fd67404d7f0030d1aa", + "reference": "c1a87a94c01957697ec347fd67404d7f0030d1aa", + "shasum": "" + }, + "require": { + "php": ">=8.0.0", + "psr/log": "^3", + "symfony/console": "^5 || ^6 || ^7" + }, + "require-dev": { + "phpunit/phpunit": "^7.5.20 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3", + "yoast/phpunit-polyfills": "^0.2.0" + }, + "type": "library", + "extra": { + "platform": { + "php": "8.2.17" + } + }, + "autoload": { + "psr-4": { + "Consolidation\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", + "support": { + "issues": "https://github.com/consolidation/log/issues", + "source": "https://github.com/consolidation/log/tree/3.1.1" + }, + "time": "2025-11-14T21:11:00+00:00" + }, + { + "name": "consolidation/output-formatters", + "version": "4.7.0", + "source": { + "type": "git", + "url": "https://github.com/consolidation/output-formatters.git", + "reference": "dfc464c4d4a47594cac5eac01ce265e04b70cb94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/dfc464c4d4a47594cac5eac01ce265e04b70cb94", + "reference": "dfc464c4d4a47594cac5eac01ce265e04b70cb94", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^1.1.0 || ^2 || ^3", + "php": ">=7.1.3", + "symfony/console": "^4 || ^5 || ^6 || ^7", + "symfony/finder": "^4 || ^5 || ^6 || ^7" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.4.2", + "phpunit/phpunit": "^7 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3", + "symfony/var-dumper": "^4 || ^5 || ^6 || ^7", + "symfony/yaml": "^4 || ^5 || ^6 || ^7", + "yoast/phpunit-polyfills": "^1" + }, + "suggest": { + "symfony/var-dumper": "For using the var_dump formatter" + }, + "type": "library", + "autoload": { + "psr-4": { + "Consolidation\\OutputFormatters\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Format text by applying transformations provided by plug-in formatters.", + "support": { + "issues": "https://github.com/consolidation/output-formatters/issues", + "source": "https://github.com/consolidation/output-formatters/tree/4.7.0" + }, + "time": "2025-11-14T21:06:10+00:00" + }, + { + "name": "consolidation/robo", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/consolidation/robo.git", + "reference": "6d02c7d800b5e1a3a8977ae74d23bce723486025" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/robo/zipball/6d02c7d800b5e1a3a8977ae74d23bce723486025", + "reference": "6d02c7d800b5e1a3a8977ae74d23bce723486025", + "shasum": "" + }, + "require": { + "consolidation/annotated-command": "^4.8.1", + "consolidation/config": "^3", + "consolidation/log": "^3", + "consolidation/output-formatters": "^4.1.2", + "league/container": "^3.3.1 || ^4.0", + "php": ">=8.2", + "phpowermove/docblock": "^4.0", + "symfony/console": "^6 || ^7", + "symfony/event-dispatcher": "^6 || ^7", + "symfony/filesystem": "^6 || ^7", + "symfony/finder": "^6 || ^7", + "symfony/process": "^6 || ^7", + "symfony/yaml": "^6 || ^7" + }, + "conflict": { + "codegyre/robo": "*" + }, + "require-dev": { + "natxet/cssmin": "3.0.4", + "patchwork/jsqueeze": "^2", + "pear/archive_tar": "^1.4.4", + "phpunit/phpunit": "^7.5.20 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.6", + "yoast/phpunit-polyfills": "^0.2.0" + }, + "suggest": { + "consolidation/self-update": "For self-updating a phar-based app built with Robo", + "natxet/cssmin": "For minifying CSS files in taskMinify", + "patchwork/jsqueeze": "For minifying JS files in taskMinify", + "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively.", + "totten/lurkerlite": "For monitoring filesystem changes in taskWatch" + }, + "bin": [ + "robo" + ], + "type": "library", + "autoload": { + "psr-4": { + "Robo\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + } + ], + "description": "Modern task runner", + "support": { + "issues": "https://github.com/consolidation/robo/issues", + "source": "https://github.com/consolidation/robo/tree/5.1.1" + }, + "time": "2025-11-14T23:30:05+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2025-08-14T07:29:31+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.94.2", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7787ceff91365ba7d623ec410b8f429cdebb4f63", + "reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.3", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.5", + "ext-filter": "*", + "ext-hash": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.3", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.6", + "react/event-loop": "^1.5", + "react/socket": "^1.16", + "react/stream": "^1.4", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0", + "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.33", + "symfony/polyfill-php80": "^1.33", + "symfony/polyfill-php81": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0", + "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3.1 || ^2.7.1", + "infection/infection": "^0.32.3", + "justinrainbow/json-schema": "^6.6.4", + "keradus/cli-executor": "^2.3", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.9.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.7", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.7", + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.51", + "symfony/polyfill-php85": "^1.33", + "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.4", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.1" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/**/Internal/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.2" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2026-02-20T16:13:53+00:00" + }, + { + "name": "grasmash/expander", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/grasmash/expander.git", + "reference": "eea11b9afb0c32483b18b9009f4ca07b770e39f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grasmash/expander/zipball/eea11b9afb0c32483b18b9009f4ca07b770e39f4", + "reference": "eea11b9afb0c32483b18b9009f4ca07b770e39f4", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.0", + "php": ">=8.0", + "psr/log": "^2 | ^3" + }, + "require-dev": { + "greg-1-anderson/composer-test-scenarios": "^1", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Grasmash\\Expander\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Grasmick" + } + ], + "description": "Expands internal property references in PHP arrays file.", + "support": { + "issues": "https://github.com/grasmash/expander/issues", + "source": "https://github.com/grasmash/expander/tree/3.0.1" + }, + "time": "2024-11-25T23:28:05+00:00" + }, + { + "name": "joomla-projects/jorobo", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/joomla-projects/jorobo.git", + "reference": "3c6a900f56ec4c1408f0f6c097d43282886da087" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-projects/jorobo/zipball/3c6a900f56ec4c1408f0f6c097d43282886da087", + "reference": "3c6a900f56ec4c1408f0f6c097d43282886da087", + "shasum": "" + }, + "require": { + "consolidation/robo": "^5.1.0", + "ext-simplexml": "*", + "joomla/github": "~2|~3", + "php": "~8.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.73.1", + "phan/phan": "^5.4.5", + "phpstan/phpstan": "^2.1.11", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpunit/phpunit": "^11.5.15", + "squizlabs/php_codesniffer": "~3.10.3" + }, + "bin": [ + "bin/jorobo" + ], + "type": "library", + "autoload": { + "psr-4": { + "Joomla\\Jorobo\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Yves Hoppe", + "email": "yves@compojoom.com" + }, + { + "name": "Niels Nübel", + "email": "niels@niels-nuebel.de" + }, + { + "name": "Niels Braczek", + "email": "nbraczek@bsds.de" + }, + { + "name": "Hannes Papenberg", + "email": "info@joomlager.de" + }, + { + "name": "Harald Leithner", + "email": "harald.leithner@community.joomla.org" + } + ], + "description": "Tools and Tasks based on Robo.li for Joomla Extension Development and Releases", + "support": { + "issues": "https://github.com/joomla-projects/jorobo/issues", + "source": "https://github.com/joomla-projects/jorobo/tree/0.12.1" + }, + "time": "2025-04-05T22:07:05+00:00" + }, + { + "name": "joomla/github", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/github-api.git", + "reference": "e9663ba0e70c2773932e4f3c0263e533e9f61cb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/github-api/zipball/e9663ba0e70c2773932e4f3c0263e533e9f61cb5", + "reference": "e9663ba0e70c2773932e4f3c0263e533e9f61cb5", + "shasum": "" + }, + "require": { + "joomla/http": "^3.0", + "joomla/registry": "^3.0", + "joomla/uri": "^3.0", + "php": "^8.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.12.27", + "phpstan/phpstan-deprecation-rules": "1.2.1", + "phpunit/phpunit": "^9.5.28", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "type": "joomla-package", + "extra": { + "branch-alias": { + "dev-2.0-dev": "2.0-dev", + "dev-3.x-dev": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Joomla\\Github\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Github Package", + "homepage": "https://github.com/joomla-framework/github-api", + "keywords": [ + "framework", + "github", + "joomla" + ], + "support": { + "issues": "https://github.com/joomla-framework/github-api/issues", + "source": "https://github.com/joomla-framework/github-api/tree/3.0.1" + }, + "time": "2025-07-19T19:05:52+00:00" + }, + { + "name": "joomla/http", + "version": "3.1.4", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/http.git", + "reference": "493dc254d9fa9277c7ab3488573ddb4f3bbfa9bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/http/zipball/493dc254d9fa9277c7ab3488573ddb4f3bbfa9bc", + "reference": "493dc254d9fa9277c7ab3488573ddb4f3bbfa9bc", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.3.5", + "joomla/uri": "^3.0", + "laminas/laminas-diactoros": "^2.24.0", + "php": "^8.1.0", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "joomla/test": "^3.0", + "phpstan/phpstan": "1.12.27", + "phpstan/phpstan-deprecation-rules": "1.2.1", + "phpunit/phpunit": "^9.5.28", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "suggest": { + "ext-curl": "To use cURL for HTTP connections" + }, + "type": "joomla-package", + "extra": { + "branch-alias": { + "dev-2.0-dev": "2.0-dev", + "dev-3.x-dev": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Joomla\\Http\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla HTTP Package", + "homepage": "https://github.com/joomla-framework/http", + "keywords": [ + "framework", + "http", + "joomla" + ], + "support": { + "issues": "https://github.com/joomla-framework/http/issues", + "source": "https://github.com/joomla-framework/http/tree/3.1.4" + }, + "time": "2026-01-07T16:36:43+00:00" + }, + { + "name": "joomla/registry", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/registry.git", + "reference": "4452de9c66abfec59b535e27c62af3528a539311" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/registry/zipball/4452de9c66abfec59b535e27c62af3528a539311", + "reference": "4452de9c66abfec59b535e27c62af3528a539311", + "shasum": "" + }, + "require": { + "joomla/utilities": "^3.0", + "php": "^8.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.12.27", + "phpstan/phpstan-deprecation-rules": "1.2.1", + "phpunit/phpunit": "^9.5.28", + "squizlabs/php_codesniffer": "^3.7.2", + "symfony/yaml": "^5.0" + }, + "suggest": { + "ext-json": "ext-json is needed for JSON support", + "ext-simplexml": "ext-simplexml is needed for XML support", + "symfony/yaml": "Install symfony/yaml if you require YAML support." + }, + "type": "joomla-package", + "extra": { + "branch-alias": { + "dev-2.0-dev": "2.0-dev", + "dev-3.x-dev": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Joomla\\Registry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Registry Package", + "homepage": "https://github.com/joomla-framework/registry", + "keywords": [ + "framework", + "joomla", + "registry" + ], + "support": { + "issues": "https://github.com/joomla-framework/registry/issues", + "source": "https://github.com/joomla-framework/registry/tree/3.0.2" + }, + "time": "2025-07-19T16:26:22+00:00" + }, + { + "name": "joomla/string", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/string.git", + "reference": "0b3d33564db389e27346f7e275c694897c939434" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/string/zipball/0b3d33564db389e27346f7e275c694897c939434", + "reference": "0b3d33564db389e27346f7e275c694897c939434", + "shasum": "" + }, + "require": { + "php": "^8.1.0", + "symfony/deprecation-contracts": "^2|^3" + }, + "conflict": { + "doctrine/inflector": "<1.2" + }, + "require-dev": { + "doctrine/inflector": "^1.2", + "joomla/test": "^3.0", + "phpstan/phpstan": "1.12.27", + "phpstan/phpstan-deprecation-rules": "1.2.1", + "phpunit/phpunit": "^9.5.28", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "suggest": { + "doctrine/inflector": "To use the string inflector", + "ext-mbstring": "For improved processing" + }, + "type": "joomla-package", + "extra": { + "branch-alias": { + "dev-2.0-dev": "2.0-dev", + "dev-3.x-dev": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/phputf8/utf8.php", + "src/phputf8/ord.php", + "src/phputf8/str_ireplace.php", + "src/phputf8/str_pad.php", + "src/phputf8/str_split.php", + "src/phputf8/strcasecmp.php", + "src/phputf8/strcspn.php", + "src/phputf8/stristr.php", + "src/phputf8/strrev.php", + "src/phputf8/strspn.php", + "src/phputf8/trim.php", + "src/phputf8/ucfirst.php", + "src/phputf8/ucwords.php", + "src/phputf8/utils/ascii.php", + "src/phputf8/utils/validation.php" + ], + "psr-4": { + "Joomla\\String\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla String Package", + "homepage": "https://github.com/joomla-framework/string", + "keywords": [ + "framework", + "joomla", + "string" + ], + "support": { + "issues": "https://github.com/joomla-framework/string/issues", + "source": "https://github.com/joomla-framework/string/tree/3.0.4" + }, + "time": "2025-07-19T15:25:56+00:00" + }, + { + "name": "joomla/uri", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/uri.git", + "reference": "ac18b410b58c5d2cb652eac7c13acb4971cb5e0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/uri/zipball/ac18b410b58c5d2cb652eac7c13acb4971cb5e0d", + "reference": "ac18b410b58c5d2cb652eac7c13acb4971cb5e0d", + "shasum": "" + }, + "require": { + "php": "^8.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.12.27", + "phpstan/phpstan-deprecation-rules": "1.2.1", + "phpunit/phpunit": "^9.5.28", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "suggest": { + "ext-mbstring": "Used to speed up url parsing" + }, + "type": "joomla-package", + "extra": { + "branch-alias": { + "dev-2.0-dev": "2.0-dev", + "dev-3.x-dev": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Joomla\\Uri\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Uri Package", + "homepage": "https://github.com/joomla-framework/uri", + "keywords": [ + "framework", + "joomla", + "uri" + ], + "support": { + "issues": "https://github.com/joomla-framework/uri/issues", + "source": "https://github.com/joomla-framework/uri/tree/3.0.2" + }, + "time": "2025-07-12T12:01:42+00:00" + }, + { + "name": "joomla/utilities", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/utilities.git", + "reference": "bec074fa469cfdb30fae168899cf65159bf7890d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/utilities/zipball/bec074fa469cfdb30fae168899cf65159bf7890d", + "reference": "bec074fa469cfdb30fae168899cf65159bf7890d", + "shasum": "" + }, + "require": { + "joomla/string": "^3.0", + "php": "^8.1.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^9.5.28", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "type": "joomla-package", + "extra": { + "branch-alias": { + "dev-2.0-dev": "2.0-dev", + "dev-3.x-dev": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Joomla\\Utilities\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Utilities Package", + "homepage": "https://github.com/joomla-framework/utilities", + "keywords": [ + "framework", + "joomla", + "utilities" + ], + "support": { + "issues": "https://github.com/joomla-framework/utilities/issues", + "source": "https://github.com/joomla-framework/utilities/tree/3.0.2" + }, + "time": "2025-07-19T16:29:29+00:00" + }, + { + "name": "laminas/laminas-diactoros", + "version": "2.26.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-diactoros.git", + "reference": "6584d44eb8e477e89d453313b858daac6183cddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/6584d44eb8e477e89d453313b858daac6183cddc", + "reference": "6584d44eb8e477e89d453313b858daac6183cddc", + "shasum": "" + }, + "require": { + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1" + }, + "conflict": { + "zendframework/zend-diactoros": "*" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-libxml": "*", + "http-interop/http-factory-tests": "^0.9.0", + "laminas/laminas-coding-standard": "^2.5", + "php-http/psr7-integration-tests": "^1.2", + "phpunit/phpunit": "^9.5.28", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.6" + }, + "type": "library", + "extra": { + "laminas": { + "module": "Laminas\\Diactoros", + "config-provider": "Laminas\\Diactoros\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php", + "src/functions/create_uploaded_file.legacy.php", + "src/functions/marshal_headers_from_sapi.legacy.php", + "src/functions/marshal_method_from_sapi.legacy.php", + "src/functions/marshal_protocol_version_from_sapi.legacy.php", + "src/functions/marshal_uri_from_sapi.legacy.php", + "src/functions/normalize_server.legacy.php", + "src/functions/normalize_uploaded_files.legacy.php", + "src/functions/parse_cookie_header.legacy.php" + ], + "psr-4": { + "Laminas\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://laminas.dev", + "keywords": [ + "http", + "laminas", + "psr", + "psr-17", + "psr-7" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-diactoros/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-diactoros/issues", + "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", + "source": "https://github.com/laminas/laminas-diactoros" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-10-29T16:17:44+00:00" + }, + { + "name": "league/container", + "version": "4.2.5", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/container.git", + "reference": "d3cebb0ff4685ff61c749e54b27db49319e2ec00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/container/zipball/d3cebb0ff4685ff61c749e54b27db49319e2ec00", + "reference": "d3cebb0ff4685ff61c749e54b27db49319e2ec00", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "psr/container": "^1.1 || ^2.0" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "replace": { + "orno/di": "~2.0" + }, + "require-dev": { + "nette/php-generator": "^3.4", + "nikic/php-parser": "^4.10", + "phpstan/phpstan": "^0.12.47", + "phpunit/phpunit": "^8.5.17", + "roave/security-advisories": "dev-latest", + "scrutinizer/ocular": "^1.8", + "squizlabs/php_codesniffer": "^3.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev", + "dev-3.x": "3.x-dev", + "dev-4.x": "4.x-dev", + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Container\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Phil Bennett", + "email": "mail@philbennett.co.uk", + "role": "Developer" + } + ], + "description": "A fast and intuitive dependency injection container.", + "homepage": "https://github.com/thephpleague/container", + "keywords": [ + "container", + "dependency", + "di", + "injection", + "league", + "provider", + "service" + ], + "support": { + "issues": "https://github.com/thephpleague/container/issues", + "source": "https://github.com/thephpleague/container/tree/4.2.5" + }, + "funding": [ + { + "url": "https://github.com/philipobenito", + "type": "github" + } + ], + "time": "2025-05-20T12:55:37+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phootwork/collection", + "version": "v3.2.3", + "source": { + "type": "git", + "url": "https://github.com/phootwork/collection.git", + "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phootwork/collection/zipball/46dde20420fba17766c89200bc3ff91d3e58eafa", + "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa", + "shasum": "" + }, + "require": { + "phootwork/lang": "^3.0", + "php": ">=8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "phootwork\\collection\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Gossmann", + "homepage": "http://gos.si" + } + ], + "description": "The phootwork library fills gaps in the php language and provides better solutions than the existing ones php offers.", + "homepage": "https://phootwork.github.io/collection/", + "keywords": [ + "Array object", + "Text object", + "collection", + "collections", + "json", + "list", + "map", + "queue", + "set", + "stack", + "xml" + ], + "support": { + "issues": "https://github.com/phootwork/phootwork/issues", + "source": "https://github.com/phootwork/collection/tree/v3.2.3" + }, + "time": "2022-08-27T12:51:24+00:00" + }, + { + "name": "phootwork/lang", + "version": "v3.2.3", + "source": { + "type": "git", + "url": "https://github.com/phootwork/lang.git", + "reference": "52ec8cce740ce1c424eef02f43b43d5ddfec7b5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phootwork/lang/zipball/52ec8cce740ce1c424eef02f43b43d5ddfec7b5e", + "reference": "52ec8cce740ce1c424eef02f43b43d5ddfec7b5e", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/polyfill-php81": "^1.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "phootwork\\lang\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Gossmann", + "homepage": "http://gos.si" + } + ], + "description": "Missing PHP language constructs", + "homepage": "https://phootwork.github.io/lang/", + "keywords": [ + "array", + "comparator", + "comparison", + "string" + ], + "support": { + "issues": "https://github.com/phootwork/phootwork/issues", + "source": "https://github.com/phootwork/lang/tree/v3.2.3" + }, + "time": "2024-10-03T13:43:19+00:00" + }, + { + "name": "phpowermove/docblock", + "version": "v4.0", + "source": { + "type": "git", + "url": "https://github.com/phpowermove/docblock.git", + "reference": "a73f6e17b7d4e1b92ca5378c248c952c9fae7826" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpowermove/docblock/zipball/a73f6e17b7d4e1b92ca5378c248c952c9fae7826", + "reference": "a73f6e17b7d4e1b92ca5378c248c952c9fae7826", + "shasum": "" + }, + "require": { + "phootwork/collection": "^3.0", + "phootwork/lang": "^3.0", + "php": ">=8.0" + }, + "require-dev": { + "phootwork/php-cs-fixer-config": "^0.4", + "phpunit/phpunit": "^9.0", + "psalm/phar": "^4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "phpowermove\\docblock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Gossmann", + "homepage": "http://gos.si" + } + ], + "description": "PHP Docblock parser and generator. An API to read and write Docblocks.", + "keywords": [ + "docblock", + "generator", + "parser" + ], + "support": { + "issues": "https://github.com/phpowermove/docblock/issues", + "source": "https://github.com/phpowermove/docblock/tree/v4.0" + }, + "time": "2021-09-22T16:57:06+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.1.40", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "reference": "9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2026-02-23T15:04:35+00:00" + }, + { + "name": "phpstan/phpstan-deprecation-rules", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", + "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/6b5571001a7f04fa0422254c30a0017ec2f2cacc", + "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.1.39" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.4" + }, + "time": "2026-02-09T13:21:14+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.34", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "b36f02317466907a230d3aa1d34467041271ef4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b36f02317466907a230d3aa1d34467041271ef4a", + "reference": "b36f02317466907a230d3aa1d34467041271ef4a", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.10", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.8", + "sebastian/global-state": "^5.0.8", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.34" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2026-01-27T05:45:00+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/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "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.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.7", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.7" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-12-23T15:25:20+00:00" + }, + { + "name": "react/dns", + "version": "v1.14.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.14.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-11-18T19:34:28+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.6.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-11-17T20:46:25+00:00" + }, + { + "name": "react/promise", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.12.28 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-08-19T18:57:03+00:00" + }, + { + "name": "react/socket", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.17.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-11-19T20:47:34+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d", + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-01-24T09:22:56+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:03:27+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" + } + ], + "time": "2025-08-10T07:10:35+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-10T06:57:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.13.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-04T16:30:35+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "6d643a93b47398599124022eb24d97c153c12f27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/6d643a93b47398599124022eb24d97c153c12f27", + "reference": "6d643a93b47398599124022eb24d97c153c12f27", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "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": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-25T17:02:47+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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 tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T11:45:34+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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 dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.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-09-25T14:21:43+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3ebc794fa5315e59fd122561623c2e2e4280538e", + "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0|^8.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.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-25T16:50:00+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" + }, + "type": "library", + "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" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-29T09:40:50+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "b38026df55197f9e39a44f3215788edf83187b80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80", + "reference": "b38026df55197f9e39a44f3215788edf83187b80", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "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 an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T15:39:26+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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 polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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 polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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 polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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 polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/process", + "version": "v7.4.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "608476f4604102976d687c483ac63a79ba18cc97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97", + "reference": "608476f4604102976d687c483ac63a79ba18cc97", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "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": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-26T15:07:59+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "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": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "8a24af0a2e8a872fb745047180649b8418303084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8a24af0a2e8a872fb745047180649b8418303084", + "reference": "8a24af0a2e8a872fb745047180649b8418303084", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T07:05:15+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b", + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-09T09:33:46+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-09T09:33:46+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^8.3" + }, + "platform-dev": {}, + "platform-overrides": { + "php": "8.3" + }, + "plugin-api-version": "2.9.0" +} diff --git a/package-lock.json b/package-lock.json index dde8d9c1..5eec5a16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "joomla-alikonweb", + "name": "joomla-testcom", "version": "5.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "joomla-alikonweb", + "name": "joomla-testcom", "version": "5.0.0", "license": "GPL-2.0-or-later", "devDependencies": { From ff2ef3a7da06b6af890711cc9c55fae14c876cfe Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 14:02:01 +0000 Subject: [PATCH 18/20] xdebug --- .devcontainer/devcontainer.json | 10 ++++---- .devcontainer/post-create.sh | 41 ++++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c0a47904..562e1460 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,7 +4,7 @@ "service": "app", "workspaceFolder": "/workspaces/testcom", - // Per MySQL: + // Per MySQL (default): "runServices": ["app", "mysql", "mailpit"], "containerEnv": { "PROFILE": "mysql" @@ -19,11 +19,11 @@ }, "portsAttributes": { - "80": { "label": "Web Server", "onAutoForward": "silent" }, + "80": { "label": "Web Server", "onAutoForward": "silent" }, "443": { "label": "Web Server HTTPS", "onAutoForward": "silent" }, - "6080": { "label": "Cypress GUI", "onAutoForward": "silent" }, - "8025": { "label": "Mailpit", "onAutoForward": "openPreview" }, - "9003": { "label": "Xdebug", "onAutoForward": "silent" } + "6080": { "label": "Cypress GUI", "onAutoForward": "silent" }, + "8025": { "label": "Mailpit", "onAutoForward": "openPreview" }, + "9003": { "label": "Xdebug", "onAutoForward": "silent" } }, "forwardPorts": [80, 443, 6080, 8025, 9003], diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index d0bfe46a..70e4639c 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -87,9 +87,8 @@ else fi # --- 4. Install Joomla --- -# Controlla se Joomla è già installato nel volume (rebuild del codespace) if [ -f "$JOOMLA_ROOT/configuration.php" ]; then - echo "--> Joomla already installed in volume, skipping download." + echo "--> Joomla already installed in volume, skipping." else echo "--> Installing Joomla..." rm -f "$JOOMLA_ROOT/index.html" @@ -171,7 +170,36 @@ EOF chmod -R 755 "$JOOMLA_ROOT" fi -# --- 10. Cypress --- +# --- 10. Xdebug: trova il gateway e scrivi xdebug.ini corretto --- +echo "--> Configuring Xdebug client host..." + +GATEWAY_HEX=$(awk 'NR>1 && $2=="00000000" {print $3; exit}' /proc/net/route) +if [ -n "$GATEWAY_HEX" ]; then + XDEBUG_HOST=$(printf '%d.%d.%d.%d' \ + $((16#${GATEWAY_HEX:6:2})) \ + $((16#${GATEWAY_HEX:4:2})) \ + $((16#${GATEWAY_HEX:2:2})) \ + $((16#${GATEWAY_HEX:0:2}))) + echo "--> Gateway trovato: $XDEBUG_HOST" +else + XDEBUG_HOST="host.docker.internal" + echo "--> Gateway non trovato, fallback: $XDEBUG_HOST" +fi + +cat > /usr/local/etc/php/conf.d/99-xdebug.ini << EOF +zend_extension=xdebug + +xdebug.mode=debug +xdebug.start_with_request=yes +xdebug.client_port=9003 +xdebug.client_host=${XDEBUG_HOST} +xdebug.idekey=VSCODE +xdebug.log_level=0 +EOF + +echo "--> xdebug.ini scritto con host: $XDEBUG_HOST" + +# --- 11. Cypress --- echo "--> Setting up Cypress..." cd "$WORKSPACE_ROOT" @@ -195,7 +223,7 @@ fi sed -i "s|baseUrl: 'http://localhost[^']*'|baseUrl: '${BASE_URL}'|" cypress.config.js sed -i "/db_prefix: process.env.DB_PREFIX/a \ cmsPath: '${JOOMLA_ROOT}'," cypress.config.js -# --- 11. Restart Apache --- +# --- 12. Restart Apache --- echo "--> Restarting Apache..." service apache2 restart || apache2ctl restart || true @@ -207,7 +235,8 @@ DETAILS_FILE="${WORKSPACE_ROOT}/codespace-details.txt" echo "✅ Setup complete! Your environment is ready." echo "================================================" echo "" - echo "Profile attivo: $PROFILE" + echo "Profile attivo: $PROFILE" + echo "Xdebug host: $XDEBUG_HOST" echo "" echo "Joomla Admin:" echo " URL: ${BASE_URL}/administrator" @@ -223,7 +252,7 @@ DETAILS_FILE="${WORKSPACE_ROOT}/codespace-details.txt" fi echo "Mailpit: porta 8025" echo "Cypress: pronto" - echo "Xdebug: porta 9003" + echo "Xdebug: porta 9003 → $XDEBUG_HOST" echo "================================================" } | tee "$DETAILS_FILE" From 63e4149e51279b032ce57138853a59724722f88a Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 14:36:45 +0000 Subject: [PATCH 19/20] full-debug --- .devcontainer/post-create.sh | 4 +++- testcom.code-workspace | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 testcom.code-workspace diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 70e4639c..9d713b3d 100644 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -226,7 +226,9 @@ sed -i "/db_prefix: process.env.DB_PREFIX/a \ cmsPath: '${JOOMLA_ROOT}'," cyp # --- 12. Restart Apache --- echo "--> Restarting Apache..." service apache2 restart || apache2ctl restart || true - +# --- Apri il multi-root workspace --- +echo "--> Opening multi-root workspace..." +code /workspaces/testcom/testcom.code-workspace 2>/dev/null || true # --- Done --- DETAILS_FILE="${WORKSPACE_ROOT}/codespace-details.txt" { diff --git a/testcom.code-workspace b/testcom.code-workspace new file mode 100644 index 00000000..52b38651 --- /dev/null +++ b/testcom.code-workspace @@ -0,0 +1,34 @@ +{ + "folders": [ + { + "name": "Extension (testcom)", + "path": "/workspaces/testcom" + }, + { + "name": "Joomla Core", + "path": "/var/www/html" + } + ], + "settings": { + "php.validate.executablePath": "/usr/local/bin/php" + }, + "launch": { + "version": "0.2.0", + "configurations": [ + { + "name": "Listen for Xdebug", + "type": "php", + "request": "launch", + "port": 9003, + "pathMappings": { + "/var/www/html": "/var/www/html", + "/workspaces/testcom": "/workspaces/testcom" + }, + "ignore": [ + "**/vendor/**/*.php" + ], + "log": false + } + ] + } +} \ No newline at end of file From be08ec1c505f0dd0dc7cb1134624175ced8735c4 Mon Sep 17 00:00:00 2001 From: Nicola Galgano Date: Fri, 27 Feb 2026 15:56:02 +0100 Subject: [PATCH 20/20] Add database client extension to devcontainer Dbeaver --- .devcontainer/devcontainer.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 562e1460..99f83f93 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -34,9 +34,10 @@ "extensions": [ "xdebug.php-debug", "bmewburn.vscode-intelephense-client", - "esbenp.prettier-vscode" + "esbenp.prettier-vscode", + "cweijan.vscode-database-client2" ] } }, "remoteUser": "root" -} \ No newline at end of file +}