From f59ce0e4e2aecc27e1f72f6c11841a271925358b Mon Sep 17 00:00:00 2001 From: Tresor Muco Date: Fri, 6 Dec 2024 14:29:33 +0200 Subject: [PATCH] chore: setup install laravel octane package --- .fly/nginx/nginx.conf | 1 + .fly/nginx/sites-available/default | 88 +- .fly/scripts/caches.sh | 12 - .fly/supervisor/octane-swoole.conf | 12 + .gitignore | 4 + Dockerfile | 21 +- bun.lockb | Bin 253299 -> 252560 bytes composer.json | 8 +- composer.lock | 1405 +++++++++++------ config/octane.php | 224 +++ draft.fly/entrypoint.sh | 15 + draft.fly/fpm/pool.d/www.conf | 528 +++++++ draft.fly/nginx/conf.d/access-log.conf | 14 + draft.fly/nginx/conf.d/websockets.conf | 5 + draft.fly/nginx/nginx.conf | 67 + draft.fly/nginx/sites-available/default | 60 + .../nginx/sites-available/default-octane | 78 + draft.fly/php/ondrej_ubuntu_php.gpg | Bin 0 -> 360 bytes draft.fly/php/packages/7.4.txt | 17 + draft.fly/php/packages/8.0.txt | 16 + draft.fly/php/packages/8.1.txt | 16 + draft.fly/php/packages/8.2.txt | 16 + draft.fly/php/packages/8.3.txt | 16 + {.fly => draft.fly}/php/packages/8.4.txt | 0 draft.fly/scripts/1_storage_init.sh | 14 + draft.fly/scripts/caches.sh | 17 + draft.fly/start-nginx.sh | 3 + draft.fly/supervisor/conf.d/fpm.conf | 11 + draft.fly/supervisor/conf.d/nginx.conf | 11 + draft.fly/supervisor/supervisord.conf | 30 + package.json | 2 +- 31 files changed, 2120 insertions(+), 591 deletions(-) create mode 100644 .fly/supervisor/octane-swoole.conf create mode 100644 config/octane.php create mode 100644 draft.fly/entrypoint.sh create mode 100644 draft.fly/fpm/pool.d/www.conf create mode 100644 draft.fly/nginx/conf.d/access-log.conf create mode 100644 draft.fly/nginx/conf.d/websockets.conf create mode 100644 draft.fly/nginx/nginx.conf create mode 100644 draft.fly/nginx/sites-available/default create mode 100644 draft.fly/nginx/sites-available/default-octane create mode 100644 draft.fly/php/ondrej_ubuntu_php.gpg create mode 100644 draft.fly/php/packages/7.4.txt create mode 100644 draft.fly/php/packages/8.0.txt create mode 100644 draft.fly/php/packages/8.1.txt create mode 100644 draft.fly/php/packages/8.2.txt create mode 100644 draft.fly/php/packages/8.3.txt rename {.fly => draft.fly}/php/packages/8.4.txt (100%) create mode 100644 draft.fly/scripts/1_storage_init.sh create mode 100644 draft.fly/scripts/caches.sh create mode 100644 draft.fly/start-nginx.sh create mode 100644 draft.fly/supervisor/conf.d/fpm.conf create mode 100644 draft.fly/supervisor/conf.d/nginx.conf create mode 100644 draft.fly/supervisor/supervisord.conf diff --git a/.fly/nginx/nginx.conf b/.fly/nginx/nginx.conf index 8f61bbd..e457fbf 100644 --- a/.fly/nginx/nginx.conf +++ b/.fly/nginx/nginx.conf @@ -65,3 +65,4 @@ http { include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } + diff --git a/.fly/nginx/sites-available/default b/.fly/nginx/sites-available/default index 0398316..26f4ac5 100644 --- a/.fly/nginx/sites-available/default +++ b/.fly/nginx/sites-available/default @@ -1,60 +1,60 @@ server { -listen 8080 default_server; -listen [::]:8080 default_server; + listen 8080 default_server; + listen [::]:8080 default_server; -root /var/www/html/public; + root /var/www/html/public; -index index.html index.htm index.php; + index index.html index.htm index.php; -server_name _; + server_name _; -charset utf-8; + charset utf-8; -client_max_body_size 2048M; + client_max_body_size 2048M; -access_log /dev/stdout fly; + access_log /dev/stdout fly; -location / { -try_files $uri $uri/ /index.php?$query_string; -} + location / { + try_files $uri $uri/ /index.php?$query_string; + } -location ~ \.php$ { -include snippets/fastcgi-php.conf; -fastcgi_param HTTP_X_FORWARDED_FOR $http_fly_client_ip; -fastcgi_pass unix:/var/run/php/php-fpm.sock; -fastcgi_buffers 16 16k; -fastcgi_buffer_size 32k; -} + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_param HTTP_X_FORWARDED_FOR $http_fly_client_ip; + fastcgi_pass unix:/var/run/php/php-fpm.sock; + fastcgi_buffers 16 16k; + fastcgi_buffer_size 32k; + } -location = /favicon.ico { -log_not_found off; -access_log off; -} + location = /favicon.ico { + log_not_found off; + access_log off; + } -location = /robots.txt { -log_not_found off; -access_log off; -} + location = /robots.txt { + log_not_found off; + access_log off; + } -location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { -expires 7d; -access_log off; -log_not_found off; -# Pass to PHP to ensure PHP apps can handle routes that end in these filetypes -try_files $uri /index.php?$query_string; -} + location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { + expires 7d; + access_log off; + log_not_found off; + # Pass to PHP to ensure PHP apps can handle routes that end in these filetypes + try_files $uri /index.php?$query_string; + } -location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { -add_header Access-Control-Allow-Origin "*"; -expires 7d; -access_log off; -} + location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { + add_header Access-Control-Allow-Origin "*"; + expires 7d; + access_log off; + } -location ~ /\.(?!well-known) { -deny all; -} + location ~ /\.(?!well-known) { + deny all; + } -add_header X-Frame-Options "SAMEORIGIN" always; -add_header X-Content-Type-Options "nosniff" always; -add_header Referrer-Policy "no-referrer-when-downgrade" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; } diff --git a/.fly/scripts/caches.sh b/.fly/scripts/caches.sh index c887e31..7ab868a 100644 --- a/.fly/scripts/caches.sh +++ b/.fly/scripts/caches.sh @@ -1,17 +1,5 @@ #!/usr/bin/env bash -set -e # Exit immediately if a command exits with a non-zero status - -echo "Caching config..." /usr/bin/php /var/www/html/artisan config:cache --no-ansi -q - -echo "Caching routes..." /usr/bin/php /var/www/html/artisan route:cache --no-ansi -q - -echo "Caching views..." /usr/bin/php /var/www/html/artisan view:cache --no-ansi -q - -echo "Running database migrations..." -/usr/bin/php /var/www/html/artisan migrate --force --no-ansi -q - -echo "Deployment script completed successfully." diff --git a/.fly/supervisor/octane-swoole.conf b/.fly/supervisor/octane-swoole.conf new file mode 100644 index 0000000..487ac1f --- /dev/null +++ b/.fly/supervisor/octane-swoole.conf @@ -0,0 +1,12 @@ +[program:octane] +priority=5 +command=php -d variables_order=EGPCS /var/www/html/artisan octane:start --server=swoole --host=0.0.0.0 --port=8000 +user=www-data +autostart=true +autorestart=true +stdout_events_enabled=true +stderr_events_enabled=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/.gitignore b/.gitignore index 48c58ee..411662b 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,7 @@ yarn-error.log /.zed /database/backups/*.sql debugbar + +**/caddy +frankenphp +frankenphp-worker.php diff --git a/Dockerfile b/Dockerfile index 876e6fe..dffef97 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,12 @@ # syntax = docker/dockerfile:experimental -ARG PHP_VERSION=8.4 -ARG NODE_VERSION=22.12 +ARG PHP_VERSION=8.2 +ARG NODE_VERSION=18 FROM ubuntu:22.04 as base LABEL fly_launch_runtime="laravel" -# Re-define PHP_VERSION after FROM +# PHP_VERSION needs to be repeated here +# See https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact ARG PHP_VERSION ENV DEBIAN_FRONTEND=noninteractive \ COMPOSER_ALLOW_SUPERUSER=1 \ @@ -31,10 +32,11 @@ COPY .fly/php/ondrej_ubuntu_php.gpg /etc/apt/trusted.gpg.d/ondrej_ubuntu_php.gpg ADD .fly/php/packages/${PHP_VERSION}.txt /tmp/php-packages.txt RUN apt-get update \ - && apt-get install -y --no-install-recommends gnupg2 ca-certificates git-core curl zip unzip rsync vim-tiny htop sqlite3 nginx supervisor cron \ + && apt-get install -y --no-install-recommends gnupg2 ca-certificates git-core curl zip unzip \ + rsync vim-tiny htop sqlite3 nginx supervisor cron \ && ln -sf /usr/bin/vim.tiny /etc/alternatives/vim \ && ln -sf /etc/alternatives/vim /usr/bin/vim \ - && echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ondrej-ubuntu-php.list \ + && echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ondrej-ubuntu-php-focal.list \ && apt-get update \ && apt-get -y --no-install-recommends install $(cat /tmp/php-packages.txt) \ && ln -sf /usr/sbin/php-fpm${PHP_VERSION} /usr/sbin/php-fpm \ @@ -42,7 +44,7 @@ RUN apt-get update \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* -# 2. Copy config files +# 2. Copy config files to proper locations COPY .fly/nginx/ /etc/nginx/ COPY .fly/fpm/ /etc/php/${PHP_VERSION}/fpm/ COPY .fly/supervisor/ /etc/supervisor/ @@ -50,7 +52,7 @@ COPY .fly/entrypoint.sh /entrypoint COPY .fly/start-nginx.sh /usr/local/bin/start-nginx RUN chmod 754 /usr/local/bin/start-nginx -# 3. Copy application code +# 3. Copy application code, skipping files based on .dockerignore COPY . /var/www/html WORKDIR /var/www/html @@ -61,7 +63,7 @@ RUN composer install --optimize-autoloader --no-dev \ && chown -R www-data:www-data /var/www/html \ && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ && sed -i='' '/->withMiddleware(function (Middleware \$middleware) {/a\ - $middleware->trustProxies(at: "*");\ + \$middleware->trustProxies(at: "*");\ ' bootstrap/app.php; \ if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; @@ -71,6 +73,7 @@ RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ ln -sf /etc/nginx/sites-available/default-octane /etc/nginx/sites-enabled/default; + ############################################## # Multi-stage build: Use Bun for JS packages # ############################################## @@ -109,5 +112,7 @@ RUN rsync -ar /var/www/html/public-bun/ /var/www/html/public/ \ && rm -rf /var/www/html/public-bun \ && chown -R www-data:www-data /var/www/html/public +# 5. Setup Entrypoint EXPOSE 8080 + ENTRYPOINT ["/entrypoint"] diff --git a/bun.lockb b/bun.lockb index e68e72f24ecfb9ce3c4e9c88dc7ca8b3685222f2..23bc529f0150d7f2d6c201ab3e76f448f019ab2c 100755 GIT binary patch delta 43638 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 vD~`GS4dRU5?S|09?+J*#$Y^FpI&NZV_=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, "conflict": { "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4" + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4|^7.0", + "symfony/cache": "^6.4.12|^7.1.5", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -6102,7 +6285,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.0" }, "funding": [ { @@ -6118,20 +6301,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-11-13T18:58:46+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" + "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", - "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d", + "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d", "shasum": "" }, "require": { @@ -6160,7 +6343,7 @@ "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", "symfony/var-dumper": "<6.4", - "twig/twig": "<3.0.4" + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" @@ -6188,7 +6371,7 @@ "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", "symfony/var-exporter": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -6216,7 +6399,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.0" }, "funding": [ { @@ -6232,20 +6415,20 @@ "type": "tidelift" } ], - "time": "2024-09-21T06:09:21+00:00" + "time": "2024-11-29T08:42:40+00:00" }, { "name": "symfony/mailer", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b" + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b", - "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc", + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc", "shasum": "" }, "require": { @@ -6254,7 +6437,7 @@ "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", + "symfony/mime": "^7.2", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -6296,7 +6479,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.5" + "source": "https://github.com/symfony/mailer/tree/v7.2.0" }, "funding": [ { @@ -6312,20 +6495,20 @@ "type": "tidelift" } ], - "time": "2024-09-08T12:32:26+00:00" + "time": "2024-11-25T15:21:05+00:00" }, { "name": "symfony/mime", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" + "reference": "cc84a4b81f62158c3846ac7ff10f696aae2b524d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", + "url": "https://api.github.com/repos/symfony/mime/zipball/cc84a4b81f62158c3846ac7ff10f696aae2b524d", + "reference": "cc84a4b81f62158c3846ac7ff10f696aae2b524d", "shasum": "" }, "require": { @@ -6380,7 +6563,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.5" + "source": "https://github.com/symfony/mime/tree/v7.2.0" }, "funding": [ { @@ -6396,7 +6579,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-11-23T09:19:39+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7036,16 +7219,16 @@ }, { "name": "symfony/process", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "5c03ee6369281177f07f7c68252a280beccba847" + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", - "reference": "5c03ee6369281177f07f7c68252a280beccba847", + "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", "shasum": "" }, "require": { @@ -7077,7 +7260,90 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.5" + "source": "https://github.com/symfony/process/tree/v7.2.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-11-06T14:24:19+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/03f2f72319e7acaf2a9f6fcbe30ef17eec51594f", + "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/http-message": "^1.0|^2.0", + "symfony/http-foundation": "^6.4|^7.0" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "php-http/discovery": "^1.15", + "psr/log": "^1.1.4|^2|^3", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "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": "PSR HTTP message bridge", + "homepage": "https://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.2.0" }, "funding": [ { @@ -7093,20 +7359,20 @@ "type": "tidelift" } ], - "time": "2024-09-19T21:48:23+00:00" + "time": "2024-09-26T08:57:56+00:00" }, { "name": "symfony/routing", - "version": "v7.1.4", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", - "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e", "shasum": "" }, "require": { @@ -7158,7 +7424,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.4" + "source": "https://github.com/symfony/routing/tree/v7.2.0" }, "funding": [ { @@ -7174,20 +7440,20 @@ "type": "tidelift" } ], - "time": "2024-08-29T08:16:25+00:00" + "time": "2024-11-25T11:08:51+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { @@ -7241,7 +7507,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -7257,20 +7523,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/string", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", "shasum": "" }, "require": { @@ -7328,7 +7594,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.5" + "source": "https://github.com/symfony/string/tree/v7.2.0" }, "funding": [ { @@ -7344,24 +7610,25 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-11-13T13:31:26+00:00" }, { "name": "symfony/translation", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" + "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", - "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "url": "https://api.github.com/repos/symfony/translation/zipball/dc89e16b44048ceecc879054e5b7f38326ab6cc5", + "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, @@ -7422,7 +7689,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.5" + "source": "https://github.com/symfony/translation/tree/v7.2.0" }, "funding": [ { @@ -7438,20 +7705,20 @@ "type": "tidelift" } ], - "time": "2024-09-16T06:30:38+00:00" + "time": "2024-11-12T20:47:56+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { @@ -7500,7 +7767,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { @@ -7516,20 +7783,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/uid", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "8c7bb8acb933964055215d89f9a9871df0239317" + "reference": "2d294d0c48df244c71c105a169d0190bfb080426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/8c7bb8acb933964055215d89f9a9871df0239317", - "reference": "8c7bb8acb933964055215d89f9a9871df0239317", + "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426", "shasum": "" }, "require": { @@ -7574,7 +7841,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.1.5" + "source": "https://github.com/symfony/uid/tree/v7.2.0" }, "funding": [ { @@ -7590,20 +7857,20 @@ "type": "tidelift" } ], - "time": "2024-09-17T09:16:35+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d" + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", "shasum": "" }, "require": { @@ -7619,7 +7886,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -7657,7 +7924,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" }, "funding": [ { @@ -7673,20 +7940,20 @@ "type": "tidelift" } ], - "time": "2024-09-16T10:07:02+00:00" + "time": "2024-11-08T15:48:14+00:00" }, { "name": "tightenco/ziggy", - "version": "v2.3.0", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/tighten/ziggy.git", - "reference": "5395ba7c6d6ea1709acf5435694c4732c2912b5e" + "reference": "8e002298678fd4d61155bb1d6e3837048235bff7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tighten/ziggy/zipball/5395ba7c6d6ea1709acf5435694c4732c2912b5e", - "reference": "5395ba7c6d6ea1709acf5435694c4732c2912b5e", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/8e002298678fd4d61155bb1d6e3837048235bff7", + "reference": "8e002298678fd4d61155bb1d6e3837048235bff7", "shasum": "" }, "require": { @@ -7741,9 +8008,9 @@ ], "support": { "issues": "https://github.com/tighten/ziggy/issues", - "source": "https://github.com/tighten/ziggy/tree/v2.3.0" + "source": "https://github.com/tighten/ziggy/tree/v2.4.1" }, - "time": "2024-07-21T16:18:39+00:00" + "time": "2024-11-21T15:51:20+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7884,16 +8151,16 @@ }, { "name": "voku/portable-ascii", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "b56450eed252f6801410d810c8e1727224ae0743" + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", - "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", "shasum": "" }, "require": { @@ -7918,7 +8185,7 @@ "authors": [ { "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" + "homepage": "https://www.moelleken.org/" } ], "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", @@ -7930,7 +8197,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" }, "funding": [ { @@ -7954,7 +8221,7 @@ "type": "tidelift" } ], - "time": "2022-03-08T17:03:00+00:00" + "time": "2024-11-21T01:49:47+00:00" }, { "name": "webmozart/assert", @@ -8018,16 +8285,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.14.6", + "version": "v3.14.9", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "14e4517bd49130d6119228107eb21ae47ae120ab" + "reference": "2e805a6bd4e1aa83774316bb062703c65d0691ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/14e4517bd49130d6119228107eb21ae47ae120ab", - "reference": "14e4517bd49130d6119228107eb21ae47ae120ab", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/2e805a6bd4e1aa83774316bb062703c65d0691ef", + "reference": "2e805a6bd4e1aa83774316bb062703c65d0691ef", "shasum": "" }, "require": { @@ -8086,7 +8353,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.6" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.9" }, "funding": [ { @@ -8098,41 +8365,41 @@ "type": "github" } ], - "time": "2024-10-18T13:15:12+00:00" + "time": "2024-11-25T14:51:20+00:00" }, { "name": "barryvdh/laravel-ide-helper", - "version": "v3.1.0", + "version": "v3.2.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "591e7d665fbab8a3b682e451641706341573eb80" + "reference": "07e3bd8796f3d1414801a03d3783f9d3ec9efc08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/591e7d665fbab8a3b682e451641706341573eb80", - "reference": "591e7d665fbab8a3b682e451641706341573eb80", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/07e3bd8796f3d1414801a03d3783f9d3ec9efc08", + "reference": "07e3bd8796f3d1414801a03d3783f9d3ec9efc08", "shasum": "" }, "require": { - "barryvdh/reflection-docblock": "^2.1.1", + "barryvdh/reflection-docblock": "^2.1.2", "composer/class-map-generator": "^1.0", "ext-json": "*", - "illuminate/console": "^10 || ^11", - "illuminate/database": "^10.38 || ^11", - "illuminate/filesystem": "^10 || ^11", - "illuminate/support": "^10 || ^11", + "illuminate/console": "^11.15", + "illuminate/database": "^11.15", + "illuminate/filesystem": "^11.15", + "illuminate/support": "^11.15", "nikic/php-parser": "^4.18 || ^5", - "php": "^8.1", + "php": "^8.2", "phpdocumentor/type-resolver": "^1.1.0" }, "require-dev": { "ext-pdo_sqlite": "*", "friendsofphp/php-cs-fixer": "^3", - "illuminate/config": "^9 || ^10 || ^11", - "illuminate/view": "^9 || ^10 || ^11", + "illuminate/config": "^11.15", + "illuminate/view": "^11.15", "mockery/mockery": "^1.4", - "orchestra/testbench": "^8 || ^9", + "orchestra/testbench": "^9.2", "phpunit/phpunit": "^10.5", "spatie/phpunit-snapshot-assertions": "^4 || ^5", "vimeo/psalm": "^5.4" @@ -8143,7 +8410,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "3.2-dev" }, "laravel": { "providers": [ @@ -8180,7 +8447,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.1.0" + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.2.2" }, "funding": [ { @@ -8192,20 +8459,20 @@ "type": "github" } ], - "time": "2024-07-12T14:20:51+00:00" + "time": "2024-10-29T14:00:16+00:00" }, { "name": "barryvdh/reflection-docblock", - "version": "v2.1.1", + "version": "v2.1.3", "source": { "type": "git", "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "e6811e927f0ecc37cc4deaa6627033150343e597" + "reference": "c6fad15f7c878be21650c51e1f841bca7e49752e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/e6811e927f0ecc37cc4deaa6627033150343e597", - "reference": "e6811e927f0ecc37cc4deaa6627033150343e597", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/c6fad15f7c878be21650c51e1f841bca7e49752e", + "reference": "c6fad15f7c878be21650c51e1f841bca7e49752e", "shasum": "" }, "require": { @@ -8242,22 +8509,22 @@ } ], "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.1.1" + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.1.3" }, - "time": "2023-06-14T05:06:27+00:00" + "time": "2024-10-23T11:41:03+00:00" }, { "name": "brianium/paratest", - "version": "v7.6.0", + "version": "v7.6.1", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254" + "reference": "9ac8eda68f17acda4dad4aa02ecdcc327d7e6675" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/68ff89a8de47d086588e391a516d2a5b5fde6254", - "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/9ac8eda68f17acda4dad4aa02ecdcc327d7e6675", + "reference": "9ac8eda68f17acda4dad4aa02ecdcc327d7e6675", "shasum": "" }, "require": { @@ -8266,26 +8533,26 @@ "ext-reflection": "*", "ext-simplexml": "*", "fidry/cpu-core-counter": "^1.2.0", - "jean85/pretty-package-versions": "^2.0.6", + "jean85/pretty-package-versions": "^2.1.0", "php": "~8.2.0 || ~8.3.0 || ~8.4.0", "phpunit/php-code-coverage": "^11.0.7", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-timer": "^7.0.1", - "phpunit/phpunit": "^11.4.1", + "phpunit/phpunit": "^11.4.4", "sebastian/environment": "^7.2.0", - "symfony/console": "^6.4.11 || ^7.1.5", - "symfony/process": "^6.4.8 || ^7.1.5" + "symfony/console": "^6.4.14 || ^7.1.7", + "symfony/process": "^6.4.14 || ^7.1.7" }, "require-dev": { "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^1.12.6", - "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.1", - "squizlabs/php_codesniffer": "^3.10.3", - "symfony/filesystem": "^6.4.9 || ^7.1.5" + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "squizlabs/php_codesniffer": "^3.11.1", + "symfony/filesystem": "^6.4.13 || ^7.1.6" }, "bin": [ "bin/paratest", @@ -8325,7 +8592,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.6.0" + "source": "https://github.com/paratestphp/paratest/tree/v7.6.1" }, "funding": [ { @@ -8337,20 +8604,20 @@ "type": "paypal" } ], - "time": "2024-10-15T12:38:31+00:00" + "time": "2024-12-05T10:55:39+00:00" }, { "name": "composer/class-map-generator", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783" + "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783", - "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", + "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", "shasum": "" }, "require": { @@ -8359,10 +8626,10 @@ "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", "phpunit/phpunit": "^8", "symfony/filesystem": "^5.4 || ^6" }, @@ -8394,7 +8661,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.4.0" + "source": "https://github.com/composer/class-map-generator/tree/1.5.0" }, "funding": [ { @@ -8410,20 +8677,20 @@ "type": "tidelift" } ], - "time": "2024-10-03T18:14:00+00:00" + "time": "2024-11-25T16:11:06+00:00" }, { "name": "composer/pcre", - "version": "3.3.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { @@ -8433,8 +8700,8 @@ "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11.10", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", "phpunit/phpunit": "^8 || ^9" }, "type": "library", @@ -8473,7 +8740,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.1" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -8489,20 +8756,20 @@ "type": "tidelift" } ], - "time": "2024-08-27T18:44:43+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "fakerphp/faker", - "version": "v1.23.1", + "version": "v1.24.1", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", - "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", "shasum": "" }, "require": { @@ -8550,9 +8817,9 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" }, - "time": "2024-01-02T13:46:09+00:00" + "time": "2024-11-21T13:46:39+00:00" }, { "name": "fidry/cpu-core-counter", @@ -8807,28 +9074,28 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.0.6", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", "shasum": "" }, "require": { - "composer-runtime-api": "^2.0.0", - "php": "^7.1|^8.0" + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "vimeo/psalm": "^4.3" + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "vimeo/psalm": "^4.3 || ^5.0" }, "type": "library", "extra": { @@ -8860,42 +9127,45 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" }, - "time": "2024-03-08T09:58:59+00:00" + "time": "2024-11-18T16:19:46+00:00" }, { "name": "larastan/larastan", - "version": "v2.9.8", + "version": "v2.9.12", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7" + "reference": "19012b39fbe4dede43dbe0c126d9681827a5e908" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/340badd89b0eb5bddbc503a4829c08cf9a2819d7", - "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7", + "url": "https://api.github.com/repos/larastan/larastan/zipball/19012b39fbe4dede43dbe0c126d9681827a5e908", + "reference": "19012b39fbe4dede43dbe0c126d9681827a5e908", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.16", "php": "^8.0.2", "phpmyadmin/sql-parser": "^5.9.0", - "phpstan/phpstan": "^1.11.2" + "phpstan/phpstan": "^1.12.11" }, "require-dev": { "doctrine/coding-standard": "^12.0", + "laravel/framework": "^9.52.16 || ^10.28.0 || ^11.16", + "mockery/mockery": "^1.5.1", "nikic/php-parser": "^4.19.1", "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.2", - "orchestra/testbench": "^7.33.0 || ^8.13.0 || ^9.0.3", + "orchestra/testbench-core": "^7.33.0 || ^8.13.0 || ^9.0.9", + "phpstan/phpstan-deprecation-rules": "^1.2", "phpunit/phpunit": "^9.6.13 || ^10.5.16" }, "suggest": { @@ -8903,13 +9173,13 @@ }, "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - }, "phpstan": { "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-master": "2.0-dev" } }, "autoload": { @@ -8931,7 +9201,7 @@ "email": "enunomaduro@gmail.com" } ], - "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan wrapper for Laravel", + "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel", "keywords": [ "PHPStan", "code analyse", @@ -8944,40 +9214,28 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.8" + "source": "https://github.com/larastan/larastan/tree/v2.9.12" }, "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, { "url": "https://github.com/canvural", "type": "github" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" } ], - "time": "2024-07-06T17:46:02+00:00" + "time": "2024-11-26T23:09:02+00:00" }, { "name": "laravel/breeze", - "version": "v2.2.2", + "version": "v2.2.6", "source": { "type": "git", "url": "https://github.com/laravel/breeze.git", - "reference": "1dd612eb9e1c2632a39e6aa6df4e69cd45129dca" + "reference": "907b12160d1b8b8213e7e2e011987fffb5567edc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/breeze/zipball/1dd612eb9e1c2632a39e6aa6df4e69cd45129dca", - "reference": "1dd612eb9e1c2632a39e6aa6df4e69cd45129dca", + "url": "https://api.github.com/repos/laravel/breeze/zipball/907b12160d1b8b8213e7e2e011987fffb5567edc", + "reference": "907b12160d1b8b8213e7e2e011987fffb5567edc", "shasum": "" }, "require": { @@ -8989,8 +9247,9 @@ "symfony/console": "^7.0" }, "require-dev": { - "orchestra/testbench": "^9.0", - "phpstan/phpstan": "^1.10" + "laravel/framework": "^11.0", + "orchestra/testbench-core": "^9.0", + "phpstan/phpstan": "^2.0" }, "type": "library", "extra": { @@ -9024,20 +9283,20 @@ "issues": "https://github.com/laravel/breeze/issues", "source": "https://github.com/laravel/breeze" }, - "time": "2024-10-06T21:13:27+00:00" + "time": "2024-11-20T15:01:15+00:00" }, { "name": "laravel/pail", - "version": "v1.1.5", + "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/laravel/pail.git", - "reference": "b33ad8321416fe86efed7bf398f3306c47b4871b" + "reference": "353ac12134b98e2e7c3333d916bd3e523931e583" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/b33ad8321416fe86efed7bf398f3306c47b4871b", - "reference": "b33ad8321416fe86efed7bf398f3306c47b4871b", + "url": "https://api.github.com/repos/laravel/pail/zipball/353ac12134b98e2e7c3333d916bd3e523931e583", + "reference": "353ac12134b98e2e7c3333d916bd3e523931e583", "shasum": "" }, "require": { @@ -9052,8 +9311,9 @@ "symfony/console": "^6.0|^7.0" }, "require-dev": { + "laravel/framework": "^10.24|^11.0", "laravel/pint": "^1.13", - "orchestra/testbench": "^8.12|^9.0", + "orchestra/testbench-core": "^8.12|^9.0", "pestphp/pest": "^2.20", "pestphp/pest-plugin-type-coverage": "^2.3", "phpstan/phpstan": "^1.10", @@ -9101,20 +9361,20 @@ "issues": "https://github.com/laravel/pail/issues", "source": "https://github.com/laravel/pail" }, - "time": "2024-10-15T20:06:24+00:00" + "time": "2024-10-23T12:56:23+00:00" }, { "name": "laravel/pint", - "version": "v1.18.1", + "version": "v1.18.3", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9" + "reference": "cef51821608239040ab841ad6e1c6ae502ae3026" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9", - "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "url": "https://api.github.com/repos/laravel/pint/zipball/cef51821608239040ab841ad6e1c6ae502ae3026", + "reference": "cef51821608239040ab841ad6e1c6ae502ae3026", "shasum": "" }, "require": { @@ -9125,13 +9385,13 @@ "php": "^8.1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.64.0", - "illuminate/view": "^10.48.20", - "larastan/larastan": "^2.9.8", + "friendsofphp/php-cs-fixer": "^3.65.0", + "illuminate/view": "^10.48.24", + "larastan/larastan": "^2.9.11", "laravel-zero/framework": "^10.4.0", "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.35.1" + "nunomaduro/termwind": "^1.17.0", + "pestphp/pest": "^2.36.0" }, "bin": [ "builds/pint" @@ -9167,20 +9427,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2024-09-24T17:22:50+00:00" + "time": "2024-11-26T15:34:00+00:00" }, { "name": "laravel/sail", - "version": "v1.36.0", + "version": "v1.39.1", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "f184d3d687155d06bc8cb9ff6dc48596a138460c" + "reference": "1a3c7291bc88de983b66688919a4d298d68ddec7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/f184d3d687155d06bc8cb9ff6dc48596a138460c", - "reference": "f184d3d687155d06bc8cb9ff6dc48596a138460c", + "url": "https://api.github.com/repos/laravel/sail/zipball/1a3c7291bc88de983b66688919a4d298d68ddec7", + "reference": "1a3c7291bc88de983b66688919a4d298d68ddec7", "shasum": "" }, "require": { @@ -9230,20 +9490,20 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-10-10T13:26:02+00:00" + "time": "2024-11-27T15:42:28+00:00" }, { "name": "maximebf/debugbar", - "version": "v1.23.2", + "version": "v1.23.4", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "689720d724c771ac4add859056744b7b3f2406da" + "reference": "0815f47bdd867b816b4bf2ca1c7bd7f89e1527ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/689720d724c771ac4add859056744b7b3f2406da", - "reference": "689720d724c771ac4add859056744b7b3f2406da", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/0815f47bdd867b816b4bf2ca1c7bd7f89e1527ca", + "reference": "0815f47bdd867b816b4bf2ca1c7bd7f89e1527ca", "shasum": "" }, "require": { @@ -9296,9 +9556,9 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.2" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.4" }, - "time": "2024-09-16T11:23:09+00:00" + "time": "2024-12-05T10:36:51+00:00" }, { "name": "mockery/mockery", @@ -9385,16 +9645,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -9433,7 +9693,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -9441,7 +9701,7 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "nunomaduro/collision", @@ -9542,38 +9802,38 @@ }, { "name": "pestphp/pest", - "version": "v3.4.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "67f217852ce153134fbea8857487a3829904c086" + "reference": "918a8fc16996849937e281482bd34f236881ce96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/67f217852ce153134fbea8857487a3829904c086", - "reference": "67f217852ce153134fbea8857487a3829904c086", + "url": "https://api.github.com/repos/pestphp/pest/zipball/918a8fc16996849937e281482bd34f236881ce96", + "reference": "918a8fc16996849937e281482bd34f236881ce96", "shasum": "" }, "require": { "brianium/paratest": "^7.6.0", "nunomaduro/collision": "^8.5.0", - "nunomaduro/termwind": "^2.2.0", + "nunomaduro/termwind": "^2.3.0", "pestphp/pest-plugin": "^3.0.0", "pestphp/pest-plugin-arch": "^3.0.0", "pestphp/pest-plugin-mutate": "^3.0.5", "php": "^8.2.0", - "phpunit/phpunit": "^11.4.1" + "phpunit/phpunit": "^11.4.4" }, "conflict": { "filp/whoops": "<2.16.0", - "phpunit/phpunit": ">11.4.1", + "phpunit/phpunit": ">11.4.4", "sebastian/exporter": "<6.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { "pestphp/pest-dev-tools": "^3.3.0", - "pestphp/pest-plugin-type-coverage": "^3.1.0", - "symfony/process": "^7.1.5" + "pestphp/pest-plugin-type-coverage": "^3.2.0", + "symfony/process": "^7.1.8" }, "bin": [ "bin/pest" @@ -9638,7 +9898,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.4.1" + "source": "https://github.com/pestphp/pest/tree/v3.6.0" }, "funding": [ { @@ -9650,7 +9910,7 @@ "type": "github" } ], - "time": "2024-10-15T16:17:09+00:00" + "time": "2024-12-01T22:46:00+00:00" }, { "name": "pestphp/pest-plugin", @@ -10058,16 +10318,16 @@ }, { "name": "phpmyadmin/sql-parser", - "version": "5.10.0", + "version": "5.10.2", "source": { "type": "git", "url": "https://github.com/phpmyadmin/sql-parser.git", - "reference": "91d980ab76c3f152481e367f62b921adc38af451" + "reference": "72afbce7e4b421593b60d2eb7281e37a50734df8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/91d980ab76c3f152481e367f62b921adc38af451", - "reference": "91d980ab76c3f152481e367f62b921adc38af451", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/72afbce7e4b421593b60d2eb7281e37a50734df8", + "reference": "72afbce7e4b421593b60d2eb7281e37a50734df8", "shasum": "" }, "require": { @@ -10141,20 +10401,20 @@ "type": "other" } ], - "time": "2024-08-29T20:56:34+00:00" + "time": "2024-12-05T15:04:09+00:00" }, { "name": "phpstan/phpstan", - "version": "1.12.6", + "version": "1.12.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae" + "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae", - "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0", + "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0", "shasum": "" }, "require": { @@ -10199,7 +10459,7 @@ "type": "github" } ], - "time": "2024-10-06T15:03:59+00:00" + "time": "2024-11-28T22:13:23+00:00" }, { "name": "phpunit/php-code-coverage", @@ -10526,16 +10786,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.4.1", + "version": "11.4.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "7875627f15f4da7e7f0823d1f323f7295a77334e" + "reference": "f9ba7bd3c9f3ff54ec379d7a1c2e3f13fe0bbde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7875627f15f4da7e7f0823d1f323f7295a77334e", - "reference": "7875627f15f4da7e7f0823d1f323f7295a77334e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f9ba7bd3c9f3ff54ec379d7a1c2e3f13fe0bbde4", + "reference": "f9ba7bd3c9f3ff54ec379d7a1c2e3f13fe0bbde4", "shasum": "" }, "require": { @@ -10545,25 +10805,25 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.0", + "myclabs/deep-copy": "^1.12.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.6", + "phpunit/php-code-coverage": "^11.0.7", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", "sebastian/code-unit": "^3.0.1", - "sebastian/comparator": "^6.1.0", + "sebastian/comparator": "^6.2.1", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.0", "sebastian/exporter": "^6.1.3", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", "sebastian/type": "^5.1.0", - "sebastian/version": "^5.0.1" + "sebastian/version": "^5.0.2" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -10606,7 +10866,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.1" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.4" }, "funding": [ { @@ -10622,7 +10882,7 @@ "type": "tidelift" } ], - "time": "2024-10-08T15:38:37+00:00" + "time": "2024-11-27T10:44:52+00:00" }, { "name": "sebastian/cli-parser", @@ -10796,16 +11056,16 @@ }, { "name": "sebastian/comparator", - "version": "6.1.0", + "version": "6.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa37b9e2ca618cb051d71b60120952ee8ca8b03d" + "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa37b9e2ca618cb051d71b60120952ee8ca8b03d", - "reference": "fa37b9e2ca618cb051d71b60120952ee8ca8b03d", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/43d129d6a0f81c78bee378b46688293eb7ea3739", + "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739", "shasum": "" }, "require": { @@ -10816,12 +11076,12 @@ "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^11.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "6.2-dev" } }, "autoload": { @@ -10861,7 +11121,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.1.0" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.2.1" }, "funding": [ { @@ -10869,7 +11129,7 @@ "type": "github" } ], - "time": "2024-09-11T15:42:56+00:00" + "time": "2024-10-31T05:30:08+00:00" }, { "name": "sebastian/complexity", @@ -11062,16 +11322,16 @@ }, { "name": "sebastian/exporter", - "version": "6.1.3", + "version": "6.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e" + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", - "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", "shasum": "" }, "require": { @@ -11080,7 +11340,7 @@ "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^11.2" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { @@ -11128,7 +11388,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.1.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" }, "funding": [ { @@ -11136,7 +11396,7 @@ "type": "github" } ], - "time": "2024-07-03T04:56:19+00:00" + "time": "2024-12-05T09:17:50+00:00" }, { "name": "sebastian/global-state", @@ -11547,6 +11807,69 @@ ], "time": "2024-10-09T05:16:32+00:00" }, + { + "name": "spatie/backtrace", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "0f2477c520e3729de58e061b8192f161c99f770b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b", + "reference": "0f2477c520e3729de58e061b8192f161c99f770b", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3 || ^2.0", + "phpunit/phpunit": "^9.3 || ^11.4.3", + "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6", + "symfony/var-dumper": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.7.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-12-02T13:28:15+00:00" + }, { "name": "spatie/error-solutions", "version": "1.1.1", @@ -11623,21 +11946,22 @@ }, { "name": "spatie/laravel-error-solutions", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-error-solutions.git", - "reference": "63d9a82399e0966433fe58e4548e899f2189ea01" + "reference": "305296bc4019372a5821a379ce11a9d51819bfe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-error-solutions/zipball/63d9a82399e0966433fe58e4548e899f2189ea01", - "reference": "63d9a82399e0966433fe58e4548e899f2189ea01", + "url": "https://api.github.com/repos/spatie/laravel-error-solutions/zipball/305296bc4019372a5821a379ce11a9d51819bfe1", + "reference": "305296bc4019372a5821a379ce11a9d51819bfe1", "shasum": "" }, "require": { "illuminate/contracts": "^11.13.0", "php": "^8.2", + "spatie/backtrace": "^1.6", "spatie/error-solutions": "^1.0.4", "spatie/laravel-package-tools": "^1.16.4" }, @@ -11692,7 +12016,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-error-solutions/issues", - "source": "https://github.com/spatie/laravel-error-solutions/tree/1.0.0" + "source": "https://github.com/spatie/laravel-error-solutions/tree/1.0.1" }, "funding": [ { @@ -11700,24 +12024,57 @@ "type": "github" } ], - "time": "2024-07-01T09:22:37+00:00" + "time": "2024-11-07T13:41:28+00:00" + }, + { + "name": "swoole/ide-helper", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/swoole/ide-helper.git", + "reference": "4b6e615cb27c251b6248b8bd9501edbd02a45c18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swoole/ide-helper/zipball/4b6e615cb27c251b6248b8bd9501edbd02a45c18", + "reference": "4b6e615cb27c251b6248b8bd9501edbd02a45c18", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Team Swoole", + "email": "team@swoole.com" + } + ], + "description": "IDE help files for Swoole.", + "support": { + "issues": "https://github.com/swoole/ide-helper/issues", + "source": "https://github.com/swoole/ide-helper/tree/5.0.3" + }, + "time": "2023-04-28T22:20:18+00:00" }, { "name": "symfony/yaml", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + "reference": "099581e99f557e9f16b43c5916c26380b54abb22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -11755,7 +12112,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.5" + "source": "https://github.com/symfony/yaml/tree/v7.2.0" }, "funding": [ { @@ -11771,7 +12128,7 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:49:58+00:00" + "time": "2024-10-23T06:56:12+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", @@ -11885,7 +12242,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "inertiajs/inertia-laravel": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { diff --git a/config/octane.php b/config/octane.php new file mode 100644 index 0000000..8cfba01 --- /dev/null +++ b/config/octane.php @@ -0,0 +1,224 @@ + env('OCTANE_SERVER', 'roadrunner'), + + /* + |-------------------------------------------------------------------------- + | Force HTTPS + |-------------------------------------------------------------------------- + | + | When this configuration value is set to "true", Octane will inform the + | framework that all absolute links must be generated using the HTTPS + | protocol. Otherwise your links may be generated using plain HTTP. + | + */ + + 'https' => env('OCTANE_HTTPS', false), + + /* + |-------------------------------------------------------------------------- + | Octane Listeners + |-------------------------------------------------------------------------- + | + | All of the event listeners for Octane's events are defined below. These + | listeners are responsible for resetting your application's state for + | the next request. You may even add your own listeners to the list. + | + */ + + 'listeners' => [ + WorkerStarting::class => [ + EnsureUploadedFilesAreValid::class, + EnsureUploadedFilesCanBeMoved::class, + ], + + RequestReceived::class => [ + ...Octane::prepareApplicationForNextOperation(), + ...Octane::prepareApplicationForNextRequest(), + // + ], + + RequestHandled::class => [ + // + ], + + RequestTerminated::class => [ + // FlushUploadedFiles::class, + ], + + TaskReceived::class => [ + ...Octane::prepareApplicationForNextOperation(), + // + ], + + TaskTerminated::class => [ + // + ], + + TickReceived::class => [ + ...Octane::prepareApplicationForNextOperation(), + // + ], + + TickTerminated::class => [ + // + ], + + OperationTerminated::class => [ + FlushOnce::class, + FlushTemporaryContainerInstances::class, + // DisconnectFromDatabases::class, + // CollectGarbage::class, + ], + + WorkerErrorOccurred::class => [ + ReportException::class, + StopWorkerIfNecessary::class, + ], + + WorkerStopping::class => [ + CloseMonologHandlers::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Warm / Flush Bindings + |-------------------------------------------------------------------------- + | + | The bindings listed below will either be pre-warmed when a worker boots + | or they will be flushed before every new request. Flushing a binding + | will force the container to resolve that binding again when asked. + | + */ + + 'warm' => [ + ...Octane::defaultServicesToWarm(), + ], + + 'flush' => [ + // + ], + + /* + |-------------------------------------------------------------------------- + | Octane Swoole Tables + |-------------------------------------------------------------------------- + | + | While using Swoole, you may define additional tables as required by the + | application. These tables can be used to store data that needs to be + | quickly accessed by other workers on the particular Swoole server. + | + */ + + 'tables' => [ + 'example:1000' => [ + 'name' => 'string:1000', + 'votes' => 'int', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Octane Swoole Cache Table + |-------------------------------------------------------------------------- + | + | While using Swoole, you may leverage the Octane cache, which is powered + | by a Swoole table. You may set the maximum number of rows as well as + | the number of bytes per row using the configuration options below. + | + */ + + 'cache' => [ + 'rows' => 1000, + 'bytes' => 10000, + ], + + /* + |-------------------------------------------------------------------------- + | File Watching + |-------------------------------------------------------------------------- + | + | The following list of files and directories will be watched when using + | the --watch option offered by Octane. If any of the directories and + | files are changed, Octane will automatically reload your workers. + | + */ + + 'watch' => [ + 'app', + 'bootstrap', + 'config/**/*.php', + 'database/**/*.php', + 'public/**/*.php', + 'resources/**/*.php', + 'routes', + 'composer.lock', + '.env', + ], + + /* + |-------------------------------------------------------------------------- + | Garbage Collection Threshold + |-------------------------------------------------------------------------- + | + | When executing long-lived PHP scripts such as Octane, memory can build + | up before being cleared by PHP. You can force Octane to run garbage + | collection if your application consumes this amount of megabytes. + | + */ + + 'garbage' => 50, + + /* + |-------------------------------------------------------------------------- + | Maximum Execution Time + |-------------------------------------------------------------------------- + | + | The following setting configures the maximum execution time for requests + | being handled by Octane. You may set this value to 0 to indicate that + | there isn't a specific time limit on Octane request execution time. + | + */ + + 'max_execution_time' => 30, + +]; diff --git a/draft.fly/entrypoint.sh b/draft.fly/entrypoint.sh new file mode 100644 index 0000000..0d11ba8 --- /dev/null +++ b/draft.fly/entrypoint.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env sh + +# Run user scripts, if they exist +for f in /var/www/html/.fly/scripts/*.sh; do + # Bail out this loop if any script exits with non-zero status code + bash "$f" -e +done +chown -R www-data:www-data /var/www/html + +if [ $# -gt 0 ]; then + # If we passed a command, run it as root + exec "$@" +else + exec supervisord -c /etc/supervisor/supervisord.conf +fi diff --git a/draft.fly/fpm/pool.d/www.conf b/draft.fly/fpm/pool.d/www.conf new file mode 100644 index 0000000..de8bf0b --- /dev/null +++ b/draft.fly/fpm/pool.d/www.conf @@ -0,0 +1,528 @@ +; @fly +[global] +; Avoid logs being sent to syslog +error_log = /proc/self/fd/2 + +; Do not daemonize (eg send process to the background) +daemonize = no + +; Start a new pool named 'www'. +; the variable $pool can be used in any directive and will be replaced by the +; pool name ('www' here) +[www] + +; Per pool prefix +; It only applies on the following directives: +; - 'access.log' +; - 'slowlog' +; - 'listen' (unixsocket) +; - 'chroot' +; - 'chdir' +; - 'php_values' +; - 'php_admin_values' +; When not set, the global prefix (or /usr) applies instead. +; Note: This directive can also be relative to the global prefix. +; Default Value: none +;prefix = /path/to/pools/$pool + +; Unix user/group of processes +; Note: The user is mandatory. If the group is not set, the default user's group +; will be used. +user = www-data +group = www-data + +; The address on which to accept FastCGI requests. +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Note: This value is mandatory. +; @fly +listen = /var/run/php/php-fpm.sock + +; Set listen(2) backlog. +; Default Value: 511 (-1 on Linux, FreeBSD and OpenBSD) +;listen.backlog = 511 + +; Set permissions for unix socket, if one is used. In Linux, read/write +; permissions must be set in order to allow connections from a web server. Many +; BSD-derived systems allow connections regardless of permissions. The owner +; and group can be specified either by name or by their numeric IDs. +; Default Values: user and group are set as the running user +; mode is set to 0660 +listen.owner = www-data +listen.group = www-data +;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = + +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. +; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original +; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address +; must be separated by a comma. If this value is left blank, connections will be +; accepted from any ip address. +; Default Value: any +;listen.allowed_clients = 127.0.0.1 + +; Set the associated the route table (FIB). FreeBSD only +; Default Value: -1 +;listen.setfib = 1 + +; Specify the nice(2) priority to apply to the pool processes (only if set) +; The value can vary from -19 (highest priority) to 20 (lower priority) +; Note: - It will only work if the FPM master process is launched as root +; - The pool processes will inherit the master process priority +; unless it specified otherwise +; Default Value: no set +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl for Linux or +; PROC_TRACE_CTL procctl for FreeBSD) even if the process user +; or group is different than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes + +; Choose how the process manager will control the number of child processes. +; Possible Values: +; static - a fixed number (pm.max_children) of child processes; +; dynamic - the number of child processes are set dynamically based on the +; following directives. With this process management, there will be +; always at least 1 children. +; pm.max_children - the maximum number of children that can +; be alive at the same time. +; pm.start_servers - the number of children created on startup. +; pm.min_spare_servers - the minimum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is less than this +; number then some children will be created. +; pm.max_spare_servers - the maximum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is greater than this +; number then some children will be killed. +; pm.max_spawn_rate - the maximum number of rate to spawn child +; processes at once. +; ondemand - no children are created at startup. Children will be forked when +; new requests will connect. The following parameter are used: +; pm.max_children - the maximum number of children that +; can be alive at the same time. +; pm.process_idle_timeout - The number of seconds after which +; an idle process will be killed. +; Note: This value is mandatory. +pm = dynamic + +; The number of child processes to be created when pm is set to 'static' and the +; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +; This value sets the limit on the number of simultaneous requests that will be +; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. +; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP +; CGI. The below defaults are based on a server without much resources. Don't +; forget to tweak pm.* to fit your needs. +; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' +; Note: This value is mandatory. +; default: 5 +; @fly +pm.max_children = ${PHP_PM_MAX_CHILDREN} + +; The number of child processes created on startup. +; Note: Used only when pm is set to 'dynamic' +; Default Value: (min_spare_servers + max_spare_servers) / 2 +; default: 2 +; @fly +pm.start_servers = ${PHP_PM_START_SERVERS} + +; The desired minimum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +; default: 1 +; @fly +pm.min_spare_servers = ${PHP_MIN_SPARE_SERVERS} + +; The desired maximum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +; default: 3 +; @fly +pm.max_spare_servers = ${PHP_MAX_SPARE_SERVERS} + +; The number of rate to spawn child processes at once. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +; Default Value: 32 +;pm.max_spawn_rate = 32 + +; The number of seconds after which an idle process will be killed. +; Note: Used only when pm is set to 'ondemand' +; Default Value: 10s +;pm.process_idle_timeout = 10s; + +; The number of requests each child process should execute before respawning. +; This can be useful to work around memory leaks in 3rd party libraries. For +; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. +; Default Value: 0 +;pm.max_requests = 500 + +; The URI to view the FPM status page. If this value is not set, no URI will be +; recognized as a status page. It shows the following information: +; pool - the name of the pool; +; process manager - static, dynamic or ondemand; +; start time - the date and time FPM has started; +; start since - number of seconds since FPM has started; +; accepted conn - the number of request accepted by the pool; +; listen queue - the number of request in the queue of pending +; connections (see backlog in listen(2)); +; max listen queue - the maximum number of requests in the queue +; of pending connections since FPM has started; +; listen queue len - the size of the socket queue of pending connections; +; idle processes - the number of idle processes; +; active processes - the number of active processes; +; total processes - the number of idle + active processes; +; max active processes - the maximum number of active processes since FPM +; has started; +; max children reached - number of times, the process limit has been reached, +; when pm tries to start more children (works only for +; pm 'dynamic' and 'ondemand'); +; Value are updated in real time. +; Example output: +; pool: www +; process manager: static +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 62636 +; accepted conn: 190460 +; listen queue: 0 +; max listen queue: 1 +; listen queue len: 42 +; idle processes: 4 +; active processes: 11 +; total processes: 15 +; max active processes: 12 +; max children reached: 0 +; +; By default the status page output is formatted as text/plain. Passing either +; 'html', 'xml' or 'json' in the query string will return the corresponding +; output syntax. Example: +; http://www.foo.bar/status +; http://www.foo.bar/status?json +; http://www.foo.bar/status?html +; http://www.foo.bar/status?xml +; +; By default the status page only outputs short status. Passing 'full' in the +; query string will also return status for each pool process. +; Example: +; http://www.foo.bar/status?full +; http://www.foo.bar/status?json&full +; http://www.foo.bar/status?html&full +; http://www.foo.bar/status?xml&full +; The Full status returns for each process: +; pid - the PID of the process; +; state - the state of the process (Idle, Running, ...); +; start time - the date and time the process has started; +; start since - the number of seconds since the process has started; +; requests - the number of requests the process has served; +; request duration - the duration in µs of the requests; +; request method - the request method (GET, POST, ...); +; request URI - the request URI with the query string; +; content length - the content length of the request (only with POST); +; user - the user (PHP_AUTH_USER) (or '-' if not set); +; script - the main script called (or '-' if not set); +; last request cpu - the %cpu the last request consumed +; it's always 0 if the process is not in Idle state +; because CPU calculation is done when the request +; processing has terminated; +; last request memory - the max amount of memory the last request consumed +; it's always 0 if the process is not in Idle state +; because memory calculation is done when the request +; processing has terminated; +; If the process is in Idle state, then informations are related to the +; last request the process has served. Otherwise informations are related to +; the current request being served. +; Example output: +; ************************ +; pid: 31330 +; state: Running +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 63087 +; requests: 12808 +; request duration: 1250261 +; request method: GET +; request URI: /test_mem.php?N=10000 +; content length: 0 +; user: - +; script: /home/fat/web/docs/php/test_mem.php +; last request cpu: 0.00 +; last request memory: 0 +; +; Note: There is a real-time FPM status monitoring sample web page available +; It's available in: /usr/share/php/8.2/fpm/status.html +; +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;pm.status_path = /status + +; The address on which to accept FastCGI status request. This creates a new +; invisible pool that can handle requests independently. This is useful +; if the main pool is busy with long running requests because it is still possible +; to get the status before finishing the long running requests. +; +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Default Value: value of the listen option +;pm.status_listen = 127.0.0.1:9001 + +; The ping URI to call the monitoring page of FPM. If this value is not set, no +; URI will be recognized as a ping page. This could be used to test from outside +; that FPM is alive and responding, or to +; - create a graph of FPM availability (rrd or such); +; - remove a server from a group if it is not responding (load balancing); +; - trigger alerts for the operating team (24/7). +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;ping.path = /ping + +; This directive may be used to customize the response of a ping request. The +; response is formatted as text/plain with a 200 response code. +; Default Value: pong +;ping.response = pong + +; The access log file +; Default: not set +; @fly +access.log = /proc/self/fd/1 + +; The access log format. +; The following syntax is allowed +; %%: the '%' character +; %C: %CPU used by the request +; it can accept the following format: +; - %{user}C for user CPU only +; - %{system}C for system CPU only +; - %{total}C for user + system CPU (default) +; %d: time taken to serve the request +; it can accept the following format: +; - %{seconds}d (default) +; - %{milliseconds}d +; - %{milli}d +; - %{microseconds}d +; - %{micro}d +; %e: an environment variable (same as $_ENV or $_SERVER) +; it must be associated with embraces to specify the name of the env +; variable. Some examples: +; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e +; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e +; %f: script filename +; %l: content-length of the request (for POST request only) +; %m: request method +; %M: peak of memory allocated by PHP +; it can accept the following format: +; - %{bytes}M (default) +; - %{kilobytes}M +; - %{kilo}M +; - %{megabytes}M +; - %{mega}M +; %n: pool name +; %o: output header +; it must be associated with embraces to specify the name of the header: +; - %{Content-Type}o +; - %{X-Powered-By}o +; - %{Transfert-Encoding}o +; - .... +; %p: PID of the child that serviced the request +; %P: PID of the parent of the child that serviced the request +; %q: the query string +; %Q: the '?' character if query string exists +; %r: the request URI (without the query string, see %q and %Q) +; %R: remote IP address +; %s: status (response code) +; %t: server time the request was received +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsulated in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %T: time the log has been written (the request has finished) +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsulated in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %u: remote user +; +; Default: "%R - %u %t \"%m %r\" %s" +;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%" + +; A list of request_uri values which should be filtered from the access log. +; +; As a security precuation, this setting will be ignored if: +; - the request method is not GET or HEAD; or +; - there is a request body; or +; - there are query parameters; or +; - the response code is outwith the successful range of 200 to 299 +; +; Note: The paths are matched against the output of the access.format tag "%r". +; On common configurations, this may look more like SCRIPT_NAME than the +; expected pre-rewrite URI. +; +; Default Value: not set +;access.suppress_path[] = /ping +;access.suppress_path[] = /health_check.php + +; The log file for slow requests +; Default Value: not set +; Note: slowlog is mandatory if request_slowlog_timeout is set +;slowlog = log/$pool.log.slow + +; The timeout for serving a single request after which a PHP backtrace will be +; dumped to the 'slowlog' file. A value of '0s' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_slowlog_timeout = 0 + +; Depth of slow log stack trace. +; Default Value: 20 +;request_slowlog_trace_depth = 20 + +; The timeout for serving a single request after which the worker process will +; be killed. This option should be used when the 'max_execution_time' ini option +; does not stop script execution for some reason. A value of '0' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_terminate_timeout = 0 + +; The timeout set by 'request_terminate_timeout' ini option is not engaged after +; application calls 'fastcgi_finish_request' or when application has finished and +; shutdown functions are being called (registered via register_shutdown_function). +; This option will enable timeout limit to be applied unconditionally +; even in such cases. +; Default Value: no +;request_terminate_timeout_track_finished = no + +; Set open file descriptor rlimit. +; Default Value: system defined value +;rlimit_files = 1024 + +; Set max core size rlimit. +; Possible Values: 'unlimited' or an integer greater or equal to 0 +; Default Value: system defined value +;rlimit_core = 0 + +; Chroot to this directory at the start. This value must be defined as an +; absolute path. When this value is not set, chroot is not used. +; Note: you can prefix with '$prefix' to chroot to the pool prefix or one +; of its subdirectories. If the pool prefix is not set, the global prefix +; will be used instead. +; Note: chrooting is a great security feature and should be used whenever +; possible. However, all PHP paths will be relative to the chroot +; (error_log, sessions.save_path, ...). +; Default Value: not set +;chroot = + +; Chdir to this directory at the start. +; Note: relative path can be used. +; Default Value: current directory or / when chroot +;chdir = /var/www + +; Redirect worker stdout and stderr into main error log. If not set, stdout and +; stderr will be redirected to /dev/null according to FastCGI specs. +; Note: on highloaded environment, this can cause some delay in the page +; process time (several ms). +; Default Value: no +; @fly +catch_workers_output = yes + +; Decorate worker output with prefix and suffix containing information about +; the child that writes to the log and if stdout or stderr is used as well as +; log level and time. This options is used only if catch_workers_output is yes. +; Settings to "no" will output data as written to the stdout or stderr. +; Default value: yes +; @fly +decorate_workers_output = no + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +; @fly +clear_env = no + +; Limits the extensions of the main script FPM will allow to parse. This can +; prevent configuration mistakes on the web server side. You should only limit +; FPM to .php extensions to prevent malicious users to use other extensions to +; execute php code. +; Note: set an empty value to allow all extensions. +; Default Value: .php +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + +; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from +; the current environment. +; Default Value: clean env +;env[HOSTNAME] = $HOSTNAME +;env[PATH] = /usr/local/bin:/usr/bin:/bin +;env[TMP] = /tmp +;env[TMPDIR] = /tmp +;env[TEMP] = /tmp + +; Additional php.ini defines, specific to this pool of workers. These settings +; overwrite the values previously defined in the php.ini. The directives are the +; same as the PHP SAPI: +; php_value/php_flag - you can set classic ini defines which can +; be overwritten from PHP call 'ini_set'. +; php_admin_value/php_admin_flag - these directives won't be overwritten by +; PHP call 'ini_set' +; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. + +; Defining 'extension' will load the corresponding shared extension from +; extension_dir. Defining 'disable_functions' or 'disable_classes' will not +; overwrite previously defined php.ini values, but will append the new value +; instead. + +; Note: path INI options can be relative and will be expanded with the prefix +; (pool, global or /usr) + +; Default Value: nothing is defined by default except the values in php.ini and +; specified at startup with the -d argument +;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com +;php_flag[display_errors] = off +;php_admin_value[error_log] = /var/log/fpm-php.www.log +;php_admin_flag[log_errors] = on +;php_admin_value[memory_limit] = 32M + +; @fly settings: +; Security measures +php_admin_value[open_basedir] = /var/www/html:/dev/stdout:/tmp +php_admin_flag[session.cookie_secure] = true + +; Regional settings +php_value[date.timezone] = ${PHP_DATE_TIMEZONE} + +; Error reporting settings +php_admin_value[display_errors] = ${PHP_DISPLAY_ERRORS} +php_admin_value[error_reporting] = ${PHP_ERROR_REPORTING} + +; Performance settings +php_admin_value[memory_limit] = ${PHP_MEMORY_LIMIT} +php_admin_value[max_execution_time] = ${PHP_MAX_EXECUTION_TIME} + +; Upload settings +php_admin_value[post_max_size] = ${PHP_POST_MAX_SIZE} +php_admin_value[upload_max_filesize] = ${PHP_UPLOAD_MAX_FILE_SIZE} + +; Allow remote file access settings +php_admin_value[allow_url_fopen] = ${PHP_ALLOW_URL_FOPEN} diff --git a/draft.fly/nginx/conf.d/access-log.conf b/draft.fly/nginx/conf.d/access-log.conf new file mode 100644 index 0000000..83212e7 --- /dev/null +++ b/draft.fly/nginx/conf.d/access-log.conf @@ -0,0 +1,14 @@ +# If Fly-Client-Ip is empty, set $forwarded_header_value to +# value of X-Forwarded-For, else set +# $forwarded_header_value to value of Fly-Client-Ip +map $http_fly_client_ip $forwarded_header_value { + default $http_fly_client_ip; + "" $http_x_forwarded_for; +} + +# Use variable $forwarded_header_value in place where we'd normally +# see $http_x_forwarded_For. We prefer the value of Fly-Client-Ip +# if it's available +log_format fly '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$forwarded_header_value"'; diff --git a/draft.fly/nginx/conf.d/websockets.conf b/draft.fly/nginx/conf.d/websockets.conf new file mode 100644 index 0000000..de0dbfb --- /dev/null +++ b/draft.fly/nginx/conf.d/websockets.conf @@ -0,0 +1,5 @@ +# See https://laravel.com/docs/9.x/octane#serving-your-application-via-nginx +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} diff --git a/draft.fly/nginx/nginx.conf b/draft.fly/nginx/nginx.conf new file mode 100644 index 0000000..8f61bbd --- /dev/null +++ b/draft.fly/nginx/nginx.conf @@ -0,0 +1,67 @@ +user www-data; +worker_processes auto; +pid /run/nginx.pid; +include /etc/nginx/modules-enabled/*.conf; +daemon off; + +events { + worker_connections 768; + # multi_accept on; +} + +http { + + ## + # Basic Settings + ## + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + server_tokens off; + + # server_names_hash_bucket_size 64; + # server_name_in_redirect off; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + ## + # SSL Settings + ## + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers on; + + ## + # Logging Settings + ## + + access_log /dev/stdout; + error_log /dev/stderr; + + ## + # Increase header size for better support on Laravel APIs + ## + http2_max_field_size 16k; + http2_max_header_size 32k; + + ## + # Gzip Settings + ## + + gzip on; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml; + + ## + # Virtual Host Configs + ## + + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; +} diff --git a/draft.fly/nginx/sites-available/default b/draft.fly/nginx/sites-available/default new file mode 100644 index 0000000..0398316 --- /dev/null +++ b/draft.fly/nginx/sites-available/default @@ -0,0 +1,60 @@ +server { +listen 8080 default_server; +listen [::]:8080 default_server; + +root /var/www/html/public; + +index index.html index.htm index.php; + +server_name _; + +charset utf-8; + +client_max_body_size 2048M; + +access_log /dev/stdout fly; + +location / { +try_files $uri $uri/ /index.php?$query_string; +} + +location ~ \.php$ { +include snippets/fastcgi-php.conf; +fastcgi_param HTTP_X_FORWARDED_FOR $http_fly_client_ip; +fastcgi_pass unix:/var/run/php/php-fpm.sock; +fastcgi_buffers 16 16k; +fastcgi_buffer_size 32k; +} + +location = /favicon.ico { +log_not_found off; +access_log off; +} + +location = /robots.txt { +log_not_found off; +access_log off; +} + +location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { +expires 7d; +access_log off; +log_not_found off; +# Pass to PHP to ensure PHP apps can handle routes that end in these filetypes +try_files $uri /index.php?$query_string; +} + +location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { +add_header Access-Control-Allow-Origin "*"; +expires 7d; +access_log off; +} + +location ~ /\.(?!well-known) { +deny all; +} + +add_header X-Frame-Options "SAMEORIGIN" always; +add_header X-Content-Type-Options "nosniff" always; +add_header Referrer-Policy "no-referrer-when-downgrade" always; +} diff --git a/draft.fly/nginx/sites-available/default-octane b/draft.fly/nginx/sites-available/default-octane new file mode 100644 index 0000000..5afd28e --- /dev/null +++ b/draft.fly/nginx/sites-available/default-octane @@ -0,0 +1,78 @@ +server { + listen 8080 default_server; + listen [::]:8080 default_server; + + root /var/www/html/public; + + index index.html index.htm index.php; + + server_name _; + + charset utf-8; + + client_max_body_size 2048M; + + access_log /dev/stdout fly; + + location /index.php { + try_files /not_exists @octane; + } + + location / { + try_files $uri $uri/ @octane; + } + + location @octane { + set $suffix ""; + + if ($uri = /index.php) { + set $suffix ?$query_string; + } + + proxy_http_version 1.1; + proxy_set_header Host $http_host; + proxy_set_header Scheme $scheme; + proxy_set_header SERVER_PORT $server_port; + proxy_set_header REMOTE_ADDR $remote_addr; + proxy_set_header X-Forwarded-For $http_fly_client_ip; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + proxy_buffers 16 16k; + proxy_buffer_size 32k; + + proxy_pass http://127.0.0.1:8000$suffix; + } + + location = /favicon.ico { + log_not_found off; + access_log off; + } + + location = /robots.txt { + log_not_found off; + access_log off; + } + + location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { + expires 7d; + access_log off; + log_not_found off; + # Pass to PHP to ensure PHP apps can handle routes that end in these filetypes + try_files $uri @octane; + } + + location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { + add_header Access-Control-Allow-Origin "*"; + expires 7d; + access_log off; + } + + location ~ /\.(?!well-known) { + deny all; + } + + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; +} diff --git a/draft.fly/php/ondrej_ubuntu_php.gpg b/draft.fly/php/ondrej_ubuntu_php.gpg new file mode 100644 index 0000000000000000000000000000000000000000..82ef42b08cd94b2944e73af8c16fad296ad9a8a2 GIT binary patch literal 360 zcmV-u0hj)mjRZ-3`J4d+0J4J#K-FIPmiB*>|Lw-qIn$%n}5`Po1Hf*FNak#Awd|4UVGNDlnmns{I%0={+EnmwAK-9N=MgOdZaJMeU`N6ls? zm-dLl=KY)D^VV#b{j4GeZUGpY9*-r)gwihAieAGv7Q$7Q>oR)*-vAK-00FcgOks6y zV`y+;WFSybK_F&tav)D`WW||fY9Lc}a>KodwgeLa0stTd0!e-OoB|sI1`7!Y2Ll2G z6#@tY1Qr4V0RkQY0vCV)3JDNTPN1sgCVFf_HUs`OwKh@(0#y1E@pi@aTapnGiZ4uR znA%drtfPg?2uYcAL6_%&kkeZ)UV7rc3Elolp(^~b3aE`NHa~Rcitxg}{jkXDYMm-! zyj`>QzQ=6F7@ssRh9C2=XfyAhRPtaRx!z1NuHc3iF((SQnN7r0yJ`VLDkV7(<@gze G;5f_TDWV?$ literal 0 HcmV?d00001 diff --git a/draft.fly/php/packages/7.4.txt b/draft.fly/php/packages/7.4.txt new file mode 100644 index 0000000..bb73888 --- /dev/null +++ b/draft.fly/php/packages/7.4.txt @@ -0,0 +1,17 @@ +php7.4-bcmath +php7.4-cli +php7.4-common +php7.4-curl +php7.4-gd +php7.4-intl +php7.4-json +php7.4-mbstring +php7.4-mysql +php7.4-pgsql +php7.4-redis +php7.4-soap +php7.4-sqlite3 +php7.4-xml +php7.4-zip +php7.4-swoole +php7.4-fpm diff --git a/draft.fly/php/packages/8.0.txt b/draft.fly/php/packages/8.0.txt new file mode 100644 index 0000000..1416d1c --- /dev/null +++ b/draft.fly/php/packages/8.0.txt @@ -0,0 +1,16 @@ +php8.0-bcmath +php8.0-cli +php8.0-common +php8.0-curl +php8.0-gd +php8.0-intl +php8.0-mbstring +php8.0-mysql +php8.0-pgsql +php8.0-redis +php8.0-soap +php8.0-sqlite3 +php8.0-xml +php8.0-zip +php8.0-swoole +php8.0-fpm diff --git a/draft.fly/php/packages/8.1.txt b/draft.fly/php/packages/8.1.txt new file mode 100644 index 0000000..07e5391 --- /dev/null +++ b/draft.fly/php/packages/8.1.txt @@ -0,0 +1,16 @@ +php8.1-bcmath +php8.1-cli +php8.1-common +php8.1-curl +php8.1-gd +php8.1-intl +php8.1-mbstring +php8.1-mysql +php8.1-pgsql +php8.1-redis +php8.1-soap +php8.1-sqlite3 +php8.1-xml +php8.1-zip +php8.1-swoole +php8.1-fpm diff --git a/draft.fly/php/packages/8.2.txt b/draft.fly/php/packages/8.2.txt new file mode 100644 index 0000000..f45672f --- /dev/null +++ b/draft.fly/php/packages/8.2.txt @@ -0,0 +1,16 @@ +php8.2-bcmath +php8.2-cli +php8.2-common +php8.2-curl +php8.2-gd +php8.2-intl +php8.2-mbstring +php8.2-mysql +php8.2-pgsql +php8.2-redis +php8.2-soap +php8.2-sqlite3 +php8.2-xml +php8.2-zip +php8.2-swoole +php8.2-fpm diff --git a/draft.fly/php/packages/8.3.txt b/draft.fly/php/packages/8.3.txt new file mode 100644 index 0000000..370e554 --- /dev/null +++ b/draft.fly/php/packages/8.3.txt @@ -0,0 +1,16 @@ +php8.3-bcmath +php8.3-cli +php8.3-common +php8.3-curl +php8.3-gd +php8.3-intl +php8.3-mbstring +php8.3-mysql +php8.3-pgsql +php8.3-redis +php8.3-soap +php8.3-sqlite3 +php8.3-xml +php8.3-zip +php8.3-swoole +php8.3-fpm diff --git a/.fly/php/packages/8.4.txt b/draft.fly/php/packages/8.4.txt similarity index 100% rename from .fly/php/packages/8.4.txt rename to draft.fly/php/packages/8.4.txt diff --git a/draft.fly/scripts/1_storage_init.sh b/draft.fly/scripts/1_storage_init.sh new file mode 100644 index 0000000..5e2460c --- /dev/null +++ b/draft.fly/scripts/1_storage_init.sh @@ -0,0 +1,14 @@ +FOLDER=/var/www/html/storage/app +if [ ! -d "$FOLDER" ]; then + echo "$FOLDER is not a directory, copying storage_ content to storage" + cp -r /var/www/html/storage_/. /var/www/html/storage + echo "deleting storage_..." + rm -rf /var/www/html/storage_ +fi + +FOLDER=/var/www/html/storage/database +if [ ! -d "$FOLDER" ]; then + echo "$FOLDER is not a directory, initializing database" + mkdir /var/www/html/storage/database + touch /var/www/html/storage/database/database.sqlite +fi diff --git a/draft.fly/scripts/caches.sh b/draft.fly/scripts/caches.sh new file mode 100644 index 0000000..c887e31 --- /dev/null +++ b/draft.fly/scripts/caches.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -e # Exit immediately if a command exits with a non-zero status + +echo "Caching config..." +/usr/bin/php /var/www/html/artisan config:cache --no-ansi -q + +echo "Caching routes..." +/usr/bin/php /var/www/html/artisan route:cache --no-ansi -q + +echo "Caching views..." +/usr/bin/php /var/www/html/artisan view:cache --no-ansi -q + +echo "Running database migrations..." +/usr/bin/php /var/www/html/artisan migrate --force --no-ansi -q + +echo "Deployment script completed successfully." diff --git a/draft.fly/start-nginx.sh b/draft.fly/start-nginx.sh new file mode 100644 index 0000000..c4057e0 --- /dev/null +++ b/draft.fly/start-nginx.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +sleep 0.25 && exec nginx diff --git a/draft.fly/supervisor/conf.d/fpm.conf b/draft.fly/supervisor/conf.d/fpm.conf new file mode 100644 index 0000000..20bdd09 --- /dev/null +++ b/draft.fly/supervisor/conf.d/fpm.conf @@ -0,0 +1,11 @@ +[program:php] +priority=5 +autostart=true +autorestart=true +stdout_events_enabled=true +stderr_events_enabled=true +command=php-fpm +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/draft.fly/supervisor/conf.d/nginx.conf b/draft.fly/supervisor/conf.d/nginx.conf new file mode 100644 index 0000000..270aae9 --- /dev/null +++ b/draft.fly/supervisor/conf.d/nginx.conf @@ -0,0 +1,11 @@ +[program:nginx] +priority=10 +autostart=true +autorestart=true +stdout_events_enabled=true +stderr_events_enabled=true +command=/usr/local/bin/start-nginx +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/draft.fly/supervisor/supervisord.conf b/draft.fly/supervisor/supervisord.conf new file mode 100644 index 0000000..6f587d0 --- /dev/null +++ b/draft.fly/supervisor/supervisord.conf @@ -0,0 +1,30 @@ +; supervisor config file + +[unix_http_server] +file=/var/run/supervisor.sock ; (the path to the socket file) +chmod=0700 ; sockef file mode (default 0700) + +[supervisord] +logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) +pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) +childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) +; @fly +nodaemon=true + +; the below section must remain in the config file for RPC +; (supervisorctl/web interface) to work, additional interfaces may be +; added by defining them in separate rpcinterface: sections +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket + +; The [include] section can just contain the "files" setting. This +; setting can list multiple files (separated by whitespace or +; newlines). It can also contain wildcards. The filenames are +; interpreted as relative to this file. Included files *cannot* +; include files themselves. + +[include] +files = /etc/supervisor/conf.d/*.conf diff --git a/package.json b/package.json index 4845261..910318a 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "icons:build": "tsx ./scripts/build_icons" }, "dependencies": { - "@inertiajs/react": "^1.2.0", + "@inertiajs/react": "^2.0.0-beta.3", "@mantine/core": "^7.14.3", "@mantine/hooks": "^7.14.3", "axios": "^1.7.9",