From 3280e38ee1202383c2ae8d5f4ab822952446d930 Mon Sep 17 00:00:00 2001 From: Julien Nahum Date: Mon, 5 Aug 2024 12:06:20 +0200 Subject: [PATCH] Docker compose setup (#513) * fix password reset bug * self hosted mode middleware changes on pages * fix lint * wip: self hosted changes * wip: self hosted frontend changes * wip self hosted mode changes * typo correction * remove commented logic * fix env variable names * fix lint issues * fix minor updates * #445 Switched from single monolithic docker image to a docker-compose orchestrated network of services * Automatically configures shared secret * Working through some issues * Use local file storage * Moved the dockerfiles * Fixed some issues when building from clean * Corrected workflow * Hopefully schedules everything correctly now * Prep storage for worker process as well * .env files are required * Pinned dependency versions * Disable self hosted in the client as well * Removed double defaulting logic * Using regexs is more succinct * Added FRONT_URL environment variable * Merge 236e4-self-hosted-mode-changes * Improve inital user setup * Finalized the new docker-compose setup * Fix back-end formatting issues --------- Co-authored-by: Frank Co-authored-by: Don Benjamin --- .dockerignore | 1 + .env.docker | 16 +- .github/workflows/dockerhub.yml | 25 +- .gitignore | 2 +- Dockerfile | 98 - README.md | 130 +- app/Console/Commands/InitProjectCommand.php | 48 + .../Controllers/Auth/RegisterController.php | 2 +- .../Forms/PublicFormController.php | 8 +- .../Settings/ProfileController.php | 43 +- app/Http/Controllers/TemplateController.php | 28 +- app/Http/Kernel.php | 2 + .../SelfHostedCredentialsMiddleware.php | 66 + client/.dockerignore | 2 + client/components/global/Navbar.vue | 23 +- client/components/pages/OpenFormFooter.vue | 3 + .../pages/auth/components/LoginForm.vue | 12 +- client/middleware/guest.js | 2 - client/middleware/self-hosted-credentials.js | 9 + client/middleware/self-hosted.js | 14 + client/opnform.config.js | 3 +- client/package-lock.json | 14655 +++++++++------- client/package.json | 2 + client/pages/ai-form-builder.vue | 7 +- client/pages/forms/[slug]/index.vue | 1 - client/pages/forms/create/guest.vue | 2 +- client/pages/home.vue | 2 +- client/pages/pricing.vue | 8 +- client/pages/privacy-policy.vue | 5 + client/pages/register.vue | 13 +- client/pages/terms-conditions.vue | 5 + client/pages/update-credentials.vue | 96 + client/stores/app.js | 7 + composer.lock | 1172 +- config/filesystems.php | 3 + docker-compose.yml | 68 + docker/Dockerfile.api | 49 + docker/Dockerfile.client | 34 + docker/generate-api-secret.sh | 19 +- docker/nginx.conf | 29 +- docker/node-entrypoint | 30 + docker/nuxt-wrapper.sh | 27 - docker/php-fpm-entrypoint | 115 + docker/php-fpm-wrapper.sh | 45 - docker/php-fpm.conf | 18 - docker/postgres-wrapper.sh | 48 - docker/redis-wrapper.sh | 7 - docker/supervisord.conf | 44 - routes/api.php | 5 +- 49 files changed, 9887 insertions(+), 7166 deletions(-) delete mode 100644 Dockerfile create mode 100644 app/Console/Commands/InitProjectCommand.php create mode 100644 app/Http/Middleware/SelfHostedCredentialsMiddleware.php create mode 100644 client/.dockerignore create mode 100644 client/middleware/self-hosted-credentials.js create mode 100644 client/middleware/self-hosted.js create mode 100644 client/pages/update-credentials.vue create mode 100644 docker-compose.yml create mode 100644 docker/Dockerfile.api create mode 100644 docker/Dockerfile.client create mode 100644 docker/node-entrypoint delete mode 100644 docker/nuxt-wrapper.sh create mode 100644 docker/php-fpm-entrypoint delete mode 100644 docker/php-fpm-wrapper.sh delete mode 100644 docker/php-fpm.conf delete mode 100644 docker/postgres-wrapper.sh delete mode 100644 docker/redis-wrapper.sh delete mode 100644 docker/supervisord.conf diff --git a/.dockerignore b/.dockerignore index d339a28f0..2be37254e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,4 @@ /.git /Dockerfile /data +\.env diff --git a/.env.docker b/.env.docker index 3cc14420d..55b4bb46a 100644 --- a/.env.docker +++ b/.env.docker @@ -2,21 +2,12 @@ APP_NAME="OpnForm" APP_ENV=local APP_KEY= APP_DEBUG=false -APP_LOG_LEVEL=debug APP_URL=http://localhost LOG_CHANNEL=errorlog LOG_LEVEL=debug -DB_CONNECTION=pgsql -DB_HOST=127.0.0.1 -DB_PORT=5432 -DB_DATABASE=postgres -DB_USERNAME=postgres -DB_PASSWORD=postgres - -FILESYSTEM_DRIVER=s3 -FILESYSTEM_DISK=s3 +FILESYSTEM_DRIVER=local BROADCAST_CONNECTION=log CACHE_STORE=redis @@ -24,10 +15,6 @@ QUEUE_CONNECTION=redis SESSION_DRIVER=file SESSION_LIFETIME=120 -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - MAIL_MAILER=log MAIL_HOST= MAIL_PORT= @@ -57,3 +44,4 @@ MUX_WORKSPACE_ID= MUX_API_TOKEN= OPEN_AI_API_KEY= +SELF_HOSTED=true \ No newline at end of file diff --git a/.github/workflows/dockerhub.yml b/.github/workflows/dockerhub.yml index 9bf6e3fd8..8922b4d6e 100644 --- a/.github/workflows/dockerhub.yml +++ b/.github/workflows/dockerhub.yml @@ -11,16 +11,27 @@ jobs: runs-on: ubuntu-latest steps: - name: Get tag name - run: ( echo "TAG_NAME=${GITHUB_REF#refs/*/v}"; echo "DOCKER_REPO=${{secrets.DOCKER_REPO}}") >> $GITHUB_ENV + run: | + ( + echo "TAG_NAME=${GITHUB_REF#refs/*/v}"; + echo "DOCKER_UI_REPO=${{secrets.DOCKER_UI_REPO}}" + echo "DOCKER_API_REPO=${{secrets.DOCKER_API_REPO}}" + ) >> $GITHUB_ENV - name: Check out the repo uses: actions/checkout@v3 - name: Log in to Docker Hub run: docker login -u "${{ secrets.DOCKER_USERNAME }}" -p "${{ secrets.DOCKER_ACCESS_TOKEN }}" - - - name: Build docker image - run: docker build . -t $DOCKER_REPO:latest -t $DOCKER_REPO:$TAG_NAME - - - name: Push Docker image - run: docker push $DOCKER_REPO:latest && docker push $DOCKER_REPO:$TAG_NAME + + - name: Build docker api image + run: docker build -f docker/Dockerfile.api . -t $DOCKER_API_REPO:latest -t $DOCKER_API_REPO:$TAG_NAME + + - name: Build docker ui image + run: docker build -f docker/Dockerfile.client . -t $DOCKER_UI_REPO:latest -t $DOCKER_UI_REPO:$TAG_NAME + + - name: Push Docker api image + run: docker push $DOCKER_API_REPO:latest && docker push $DOCKER_API_REPO:$TAG_NAME + + - name: Push Docker ui image + run: docker push $DOCKER_UI_REPO:latest && docker push $DOCKER_UI_REPO:$TAG_NAME diff --git a/.gitignore b/.gitignore index 3fd19b8ce..49ee0c7be 100644 --- a/.gitignore +++ b/.gitignore @@ -29,5 +29,5 @@ public/.DS_Store .env.production .env.staging _ide_helper.php - +docker-compose.override.yml /.make.* diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 21500eda3..000000000 --- a/Dockerfile +++ /dev/null @@ -1,98 +0,0 @@ -ARG PHP_PACKAGES="php8.1 composer php8.1-common php8.1-pgsql php8.1-redis php8.1-mbstring\ - php8.1-simplexml php8.1-bcmath php8.1-gd php8.1-curl php8.1-zip\ - php8.1-imagick php8.1-bz2 php8.1-gmp php8.1-int php8.1-pcov php8.1-soap php8.1-xsl" - -FROM node:20-alpine AS javascript-builder -WORKDIR /app - -# It's best to add as few files as possible before running the build commands -# as they will be re-run everytime one of those files changes. -# -# It's possible to run npm install with only the package.json and package-lock.json file. - -ADD client/package.json client/package-lock.json ./ -RUN npm install - -ADD client /app/ -RUN cp .env.docker .env -RUN npm run build - -# syntax=docker/dockerfile:1.3-labs -FROM --platform=linux/amd64 ubuntu:23.04 AS php-dependency-installer - -ARG PHP_PACKAGES - -RUN apt-get update \ - && apt-get install -y $PHP_PACKAGES composer - -WORKDIR /app -ADD composer.json composer.lock artisan ./ - -# NOTE: The project would build more reliably if all php files were added before running -# composer install. This would though introduce a dependency which would cause every -# dependency to be re-installed each time any php file is edited. It may be necessary in -# future to remove this 'optimisation' by moving the `RUN composer install` line after all -# the following ADD commands. - -# Running artisan requires the full php app to be installed so we need to remove the -# post-autoload command from the composer file if we want to run composer without -# adding a dependency to all the php files. -RUN sed 's_@php artisan package:discover_/bin/true_;' -i composer.json -ADD app/helpers.php /app/app/helpers.php -RUN composer install --ignore-platform-req=php - -ADD app /app/app -ADD bootstrap /app/bootstrap -ADD config /app/config -ADD database /app/database -ADD public public -ADD routes routes -ADD tests tests - -# Manually run the command we deleted from composer.json earlier -RUN php artisan package:discover --ansi - - -FROM --platform=linux/amd64 ubuntu:23.04 - -# supervisord is a process manager which will be responsible for managing the -# various server processes. These are configured in docker/supervisord.conf -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] - -WORKDIR /app - -ARG PHP_PACKAGES - -RUN apt-get update \ - && apt-get install -y \ - supervisor nginx sudo postgresql-15 redis\ - $PHP_PACKAGES php8.1-fpm wget\ - && apt-get clean - -RUN useradd nuxt && mkdir ~nuxt && chown nuxt ~nuxt -RUN wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.39.3/install.sh | sudo -u nuxt bash -RUN sudo -u nuxt bash -c ". ~nuxt/.nvm/nvm.sh && nvm install --no-progress 20" - -ADD docker/postgres-wrapper.sh docker/php-fpm-wrapper.sh docker/redis-wrapper.sh docker/nuxt-wrapper.sh docker/generate-api-secret.sh /usr/local/bin/ -ADD docker/php-fpm.conf /etc/php/8.1/fpm/pool.d/ -ADD docker/nginx.conf /etc/nginx/sites-enabled/default -ADD docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf - -ADD . . -ADD .env.docker .env -ADD client/.env.docker client/.env - -COPY --from=javascript-builder /app/.output/ ./nuxt/ -RUN cp -r nuxt/public . -COPY --from=php-dependency-installer /app/vendor/ ./vendor/ - -RUN chmod a+x /usr/local/bin/*.sh /app/artisan \ - && ln -s /app/artisan /usr/local/bin/artisan \ - && useradd opnform \ - && echo "daemon off;" >> /etc/nginx/nginx.conf\ - && echo "daemonize no" >> /etc/redis/redis.conf\ - && echo "appendonly yes" >> /etc/redis/redis.conf\ - && echo "dir /persist/redis/data" >> /etc/redis/redis.conf - - -EXPOSE 80 diff --git a/README.md b/README.md index a763bda04..1c66d77bd 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ Github Stars Commits per month - - + + License Report a bug @@ -66,94 +66,90 @@ It takes 1 minute to try out the builder for free. You'll have high availability ## Installation +### Docker Installation ๐Ÿณ -### Docker installation ๐Ÿณ +OpnForm can be easily set up using Docker. Pre-built images are available on Docker Hub, which is the recommended method for most users. -This can be built and run locally but is also hosted publicly on docker hub at `jhumanj/opnform` and is generally best run directly from there. +#### Prerequisites +- Docker +- Docker Compose -#### Running from docker hub +#### Quick Start -``` -docker run --name opnform -v $PWD/my-opnform-data:/persist -p 80:80 jhumanj/opnform -``` - -You should now be able to access the application by visiting http://localhost in a web browser. - -> ๐Ÿ‘€ **Server Deployment**: If you are deploying OpnForm on a server (not locally), then you will [need to use 2 .env files](https://github.com/JhumanJ/opnform?tab=readme-ov-file#using-custom-env-files) to configure the app URLs (`APP_URL` in `.env` and both `NUXT_PUBLIC_APP_URL` & `NUXT_PUBLIC_API_BASE` in `client/.env`). +1. Clone the repository: + ``` + git clone https://github.com/JhumanJ/OpnForm.git + cd OpnForm + ``` +2. Set up environment files: + ``` + cp .env.docker .env + cp client/.env.docker client/.env + ``` -The `-v` argument creates a local directory called `my-opnform-data` which will store your database and files so that your work is not lost when you restart the container. +3. Start the application: + ``` + docker-compose up -d + ``` -The `--name` argument names the running container so that you can refer back to it later, with e.g. `docker stop opnform`. You can use any name you'd like. +4. Access OpnForm at http://localhost +> ๐ŸŒ **Server Deployment Note**: When deploying to a server, configure the app URLs in both `.env` and `client/.env` files. Set `APP_URL` in `.env`, and both `NUXT_PUBLIC_APP_URL` & `NUXT_PUBLIC_API_BASE` in `client/.env`. -#### Using custom .env files +#### Customization -If you have custom env file you can use them like so: - -Custom Laravel .env file: -``` -docker run --name opnform -v $PWD/custom-laravel-env-file.env:/app/.env -v $PWD/my-opnform-data:/persist -p 80:80 jhumanj/opnform -``` +- **Environment Variables**: Modify `.env` and `client/.env` files to customize your setup. For example, to enable email features, configure a [supported mail driver](https://laravel.com/docs/11.x/mail) in the `.env` file. -Custom Nuxt .env file: -``` -docker run --name opnform -v $PWD/custom-nuxt-env-file.env:/app/client/.env -v $PWD/my-opnform-data:/persist -p 80:80 jhumanj/opnform -``` +#### Upgrading -This would load load in the env file located at `my-custom-env-file.env`, note that if you are creating a .env file for use like this it's best to start from the `.env.docker` example file as there are slightly different defaults for the dockerized setup. +1. Check the upgrade instructions for your target version in the documentation. +2. Update your `docker-compose.yml` file if necessary. +3. Apply changes: + ``` + docker-compose up -d + ``` -#### Using a custom HTTP port +### Initial Login -To run on port 8080 +After installation, use these credentials to access the admin panel: +- Email: `admin@opnform.com` +- Password: `password` -``` -docker run --name opnform -v $PWD/my-opnform-data:/persist -p 8080:80 jhumanj/opnform -``` +โš ๏ธ Change these credentials immediately after your first login. -#### Building a custom docker image +Note: Public registration is disabled in the self-hosted version. Use the admin account to invite additional users. -To build a custom docker image from your local source code use this command from the root of the source repository: +### Building from Source -``` -docker build . -t my-docker-image-name -``` +For development or customization, you can build the Docker images locally: -This should create a new docker image tagged `my-docker-image-name` which can be run as follows: +1. Build the images: + ``` + docker build -t opnform-ui:local -f docker/Dockerfile.client . + docker build -t opnform-api:local -f docker/Dockerfile.api . + ``` -``` -docker run --name opnform -v $PWD/my-opnform-data:/persist -p 80:80 my-docker-image-name +2. Create a docker-compose override file: + ``` + cp docker-compose.override.yml.example docker-compose.override.yml + ``` -``` - -#### Upgrading docker installations - -**Please consult the upgrade instructions for the latest opnform version**, e.g. if upgrading from v1 to v2 please check the v2 instructions as the process may change in future releases. - -Normal upgrade procedure would be to stop the running container, back up your data directory (you will need this backup if you want to rollback to the old version) and then start a container running the new image with the same arguments. - -e.g. if you're running from a specific opnform version with - -```docker run --name opnform -v $PWD/my-opnform-data:/persist -p 80:80 jhumanj/opnform:1.0.0``` - -You could run: - -``` -# stop the running container -docker stop opnform -# backup the data directory -cp -r my-opnform-data my-opnform-backup -# start the new container -docker run --name opnform-2 -v $PWD/my-opnform-data:/persist -p 80:80 jhumanj/opnform:2.0.0 -``` - -Then if everything is running smoothly you can delete the old container with: -``` -docker rm opnform -``` + Edit the `docker-compose.override.yml` file to use your locally built images: + ```yaml + services: + api: + image: opnform-api:local + ui: + image: opnform-ui:local + ``` -If you haven't specified a version e.g. if you are using the image `jhumanj/opnform` or `jhumanj/opnform:latest` you will need to run `docker pull jhumanj/opnform` or `docker pull jhumanj/opnform:latest` before starting the new container. +3. Start the application: + ``` + docker-compose up -d + ``` +This method allows you to make changes to the source code and rebuild the images as needed. ### Using Laravel Valet This section explains how to get started locally with the project. It's most likely relevant if you're trying to work on the project. diff --git a/app/Console/Commands/InitProjectCommand.php b/app/Console/Commands/InitProjectCommand.php new file mode 100644 index 000000000..3f6f55d04 --- /dev/null +++ b/app/Console/Commands/InitProjectCommand.php @@ -0,0 +1,48 @@ +error('This command can only be run in self-hosted mode.'); + return; + } + + // Check if there are any existing users or if the ID increment is not at 0 + if (User::max('id') !== null) { + $this->error('Users already exist in the database or the User table is not empty. Aborting initialization.'); + return; + } + + User::create([ + 'name' => 'Admin', + 'email' => 'admin@opnform.com', + 'password' => bcrypt('password'), + ]); + $this->info('Admin user created with default credentials: admin@opnform.com / password'); + return 0; + } +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index b9b38fae6..65b90543c 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -98,7 +98,7 @@ protected function create(array $data) private function checkRegistrationAllowed(array $data) { - if (config('app.self_hosted') && !array_key_exists('invite_token', $data)) { + if (config('app.self_hosted') && !array_key_exists('invite_token', $data) && (app()->environment() !== 'testing')) { response()->json(['message' => 'Registration is not allowed in self host mode'], 400)->throwResponse(); } } diff --git a/app/Http/Controllers/Forms/PublicFormController.php b/app/Http/Controllers/Forms/PublicFormController.php index 479c0ca85..e1c27fc69 100644 --- a/app/Http/Controllers/Forms/PublicFormController.php +++ b/app/Http/Controllers/Forms/PublicFormController.php @@ -75,7 +75,13 @@ public function showAsset($assetFileName) ]); } - return redirect()->to(Storage::temporaryUrl($path, now()->addMinutes(5))); + $internal_url = Storage::temporaryUrl($path, now()->addMinutes(5)); + + foreach(config('filesystems.disks.s3.temporary_url_rewrites') as $from => $to) { + $internal_url = str_replace($from, $to, $internal_url); + } + + return redirect()->to($internal_url); } public function answer(AnswerFormRequest $request) diff --git a/app/Http/Controllers/Settings/ProfileController.php b/app/Http/Controllers/Settings/ProfileController.php index 368fd7678..e562c7045 100644 --- a/app/Http/Controllers/Settings/ProfileController.php +++ b/app/Http/Controllers/Settings/ProfileController.php @@ -3,7 +3,9 @@ namespace App\Http\Controllers\Settings; use App\Http\Controllers\Controller; +use App\Models\Workspace; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Cache; class ProfileController extends Controller { @@ -18,7 +20,7 @@ public function update(Request $request) $this->validate($request, [ 'name' => 'required', - 'email' => 'required|email|unique:users,email,'.$user->id, + 'email' => 'required|email|unique:users,email,' . $user->id, ]); return tap($user)->update([ @@ -26,4 +28,43 @@ public function update(Request $request) 'email' => strtolower($request->email), ]); } + + // For self-hosted mode, only admin can update their credentials + public function updateAdminCredentials(Request $request) + { + $request->validate([ + 'email' => 'required|email|not_in:admin@opnform.com', + 'password' => 'required|min:6|confirmed|not_in:password', + ], [ + 'email.not_in' => "Please provide email address other than 'admin@opnform.com'", + 'password.not_in' => "Please another password other than 'password'." + ]); + + ray('in', $request->password); + $user = $request->user(); + $user->update([ + 'email' => $request->email, + 'password' => bcrypt($request->password), + ]); + ray($user); + + Cache::forget('initial_user_setup_complete'); + Cache::forget('max_user_id'); + + $workspace = Workspace::create([ + 'name' => 'My Workspace', + 'icon' => '๐Ÿงช', + ]); + + $user->workspaces()->sync([ + $workspace->id => [ + 'role' => 'admin', + ], + ], false); + + return $this->success([ + 'message' => 'Congratulations, your account credentials have been updated successfully.', + 'user' => $user, + ]); + } } diff --git a/app/Http/Controllers/TemplateController.php b/app/Http/Controllers/TemplateController.php index 5cad51b1d..4389703c7 100644 --- a/app/Http/Controllers/TemplateController.php +++ b/app/Http/Controllers/TemplateController.php @@ -15,24 +15,26 @@ public function index(Request $request) $limit = (int) $request->get('limit', 0); $onlyMy = (bool) $request->get('onlymy', false); - $templates = Template::when(Auth::check(), function ($query) use ($onlyMy) { + $query = Template::query(); + + if (Auth::check()) { if ($onlyMy) { $query->where('creator_id', Auth::id()); } else { - $query->where(function ($query) { - $query->where('publicly_listed', true) - ->orWhere('creator_id', Auth::id()); + $query->where(function ($q) { + $q->where('publicly_listed', true) + ->orWhere('creator_id', Auth::id()); }); } - }) - ->when(! Auth::check(), function ($query) { - $query->where('publicly_listed', true); - }) - ->when($limit > 0, function ($query) use ($limit) { - $query->limit($limit); - }) - ->orderByDesc('created_at') - ->get(); + } else { + $query->where('publicly_listed', true); + } + + if ($limit > 0) { + $query->limit($limit); + } + + $templates = $query->orderByDesc('created_at')->get(); return FormTemplateResource::collection($templates); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 449bab65c..167493d69 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -10,6 +10,7 @@ use App\Http\Middleware\IsModerator; use App\Http\Middleware\IsNotSubscribed; use App\Http\Middleware\IsSubscribed; +use App\Http\Middleware\SelfHostedCredentialsMiddleware; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel @@ -60,6 +61,7 @@ class Kernel extends HttpKernel \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Session\Middleware\StartSession::class, + SelfHostedCredentialsMiddleware::class, ImpersonationMiddleware::class, ], ]; diff --git a/app/Http/Middleware/SelfHostedCredentialsMiddleware.php b/app/Http/Middleware/SelfHostedCredentialsMiddleware.php new file mode 100644 index 000000000..49f8ffc97 --- /dev/null +++ b/app/Http/Middleware/SelfHostedCredentialsMiddleware.php @@ -0,0 +1,66 @@ +environment('testing')) { + return $next($request); + } + + if (in_array($request->route()->getName(), self::ALLOWED_ROUTES)) { + return $next($request); + } + + if ( + config('app.self_hosted') && + $request->user() && + !$this->isInitialSetupComplete() + ) { + return response()->json([ + 'message' => 'You must change your credentials when in self-hosted mode', + 'type' => 'error', + ], Response::HTTP_FORBIDDEN); + } + + return $next($request); + } + + private function isInitialSetupComplete(): bool + { + return (bool) Cache::remember('initial_user_setup_complete', 60 * 60, function () { + $maxUserId = $this->getMaxUserId(); + if ($maxUserId === 0) { + return false; + } + return !User::where('email', 'admin@opnform.com')->exists(); + }); + } + + private function getMaxUserId(): int + { + return (int) Cache::remember('max_user_id', 60 * 60, function () { + return User::max('id') ?? 0; + }); + } +} diff --git a/client/.dockerignore b/client/.dockerignore new file mode 100644 index 000000000..6169efbdc --- /dev/null +++ b/client/.dockerignore @@ -0,0 +1,2 @@ +/Dockerfile +/.dockerignore diff --git a/client/components/global/Navbar.vue b/client/components/global/Navbar.vue index 64218fa64..71bbf413b 100644 --- a/client/components/global/Navbar.vue +++ b/client/components/global/Navbar.vue @@ -32,7 +32,7 @@ > Templates - \ No newline at end of file diff --git a/client/stores/app.js b/client/stores/app.js index 37016c448..93af44708 100644 --- a/client/stores/app.js +++ b/client/stores/app.js @@ -20,6 +20,13 @@ export const useAppStore = defineStore("app", { _cut: null, }, }), + getters: { + paidPlansEnabled: () => useRuntimeConfig().public.paidPlansEnabled, + featureBaseEnabled: () => useRuntimeConfig().public.featureBaseOrganization !== null, + selfHosted: () => useRuntimeConfig().public.selfHosted, + aiFeaturesEnabled: () => useRuntimeConfig().public.aiFeaturesEnabled, + crispEnabled: () => useRuntimeConfig().public.crispWebsiteId !== null && useRuntimeConfig().public.crispWebsiteId !== '', + }, actions: { hideNavbar() { this.navbarHidden = true diff --git a/composer.lock b/composer.lock index 1204c173d..329b672fc 100644 --- a/composer.lock +++ b/composer.lock @@ -463,16 +463,16 @@ }, { "name": "amphp/pipeline", - "version": "v1.2.0", + "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/amphp/pipeline.git", - "reference": "f1c2ce35d27ae86ead018adb803eccca7421dd9b" + "reference": "66c095673aa5b6e689e63b52d19e577459129ab3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/f1c2ce35d27ae86ead018adb803eccca7421dd9b", - "reference": "f1c2ce35d27ae86ead018adb803eccca7421dd9b", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/66c095673aa5b6e689e63b52d19e577459129ab3", + "reference": "66c095673aa5b6e689e63b52d19e577459129ab3", "shasum": "" }, "require": { @@ -518,7 +518,7 @@ ], "support": { "issues": "https://github.com/amphp/pipeline/issues", - "source": "https://github.com/amphp/pipeline/tree/v1.2.0" + "source": "https://github.com/amphp/pipeline/tree/v1.2.1" }, "funding": [ { @@ -526,7 +526,7 @@ "type": "github" } ], - "time": "2024-03-10T14:48:16+00:00" + "time": "2024-07-04T00:56:47+00:00" }, { "name": "amphp/process", @@ -867,16 +867,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.5", + "version": "v1.2.6", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b" + "reference": "a63485b65b6b3367039306496d49737cf1995408" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", - "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/a63485b65b6b3367039306496d49737cf1995408", + "reference": "a63485b65b6b3367039306496d49737cf1995408", "shasum": "" }, "require": { @@ -915,22 +915,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.6" }, - "time": "2024-04-19T21:30:56+00:00" + "time": "2024-06-13T17:21:28+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.314.3", + "version": "3.317.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "c9e8a31cfa07f47b7ab9ecc741845a3a9d50fc61" + "reference": "dc1e3031c2721a25beb2e8fbb175b576e3d60ab9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c9e8a31cfa07f47b7ab9ecc741845a3a9d50fc61", - "reference": "c9e8a31cfa07f47b7ab9ecc741845a3a9d50fc61", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/dc1e3031c2721a25beb2e8fbb175b576e3d60ab9", + "reference": "dc1e3031c2721a25beb2e8fbb175b576e3d60ab9", "shasum": "" }, "require": { @@ -1010,9 +1010,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.314.3" + "source": "https://github.com/aws/aws-sdk-php/tree/3.317.1" }, - "time": "2024-06-17T18:13:22+00:00" + "time": "2024-08-02T18:09:42+00:00" }, { "name": "brick/math", @@ -1145,16 +1145,16 @@ }, { "name": "composer/semver", - "version": "3.4.0", + "version": "3.4.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", "shasum": "" }, "require": { @@ -1206,7 +1206,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" + "source": "https://github.com/composer/semver/tree/3.4.2" }, "funding": [ { @@ -1222,7 +1222,7 @@ "type": "tidelift" } ], - "time": "2023-08-31T09:50:34+00:00" + "time": "2024-07-12T11:35:52+00:00" }, { "name": "daverandom/libdns", @@ -1270,16 +1270,16 @@ }, { "name": "dflydev/dot-access-data", - "version": "v3.0.2", + "version": "v3.0.3", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "f41715465d65213d644d3141a6a93081be5d3549" + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", - "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, "require": { @@ -1339,22 +1339,22 @@ ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" }, - "time": "2022-10-27T11:44:00+00:00" + "time": "2024-07-08T12:26:09+00:00" }, { "name": "doctrine/dbal", - "version": "4.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "8edbce73bc1aa2251ba8c754fc440f8e02c661bc" + "reference": "50fda19f80724b55ff770bb4ff352407008e63c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/8edbce73bc1aa2251ba8c754fc440f8e02c661bc", - "reference": "8edbce73bc1aa2251ba8c754fc440f8e02c661bc", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/50fda19f80724b55ff770bb4ff352407008e63c5", + "reference": "50fda19f80724b55ff770bb4ff352407008e63c5", "shasum": "" }, "require": { @@ -1367,13 +1367,13 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "1.11.1", + "phpstan/phpstan": "1.11.5", "phpstan/phpstan-phpunit": "1.4.0", "phpstan/phpstan-strict-rules": "^1.6", - "phpunit/phpunit": "10.5.20", + "phpunit/phpunit": "10.5.22", "psalm/plugin-phpunit": "0.19.0", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.9.2", + "squizlabs/php_codesniffer": "3.10.1", "symfony/cache": "^6.3.8|^7.0", "symfony/console": "^5.4|^6.3|^7.0", "vimeo/psalm": "5.24.0" @@ -1433,7 +1433,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.0.3" + "source": "https://github.com/doctrine/dbal/tree/4.0.4" }, "funding": [ { @@ -1449,7 +1449,7 @@ "type": "tidelift" } ], - "time": "2024-06-12T06:58:42+00:00" + "time": "2024-06-19T11:57:23+00:00" }, { "name": "doctrine/deprecations", @@ -1991,16 +1991,16 @@ }, { "name": "giggsey/libphonenumber-for-php", - "version": "8.13.39", + "version": "8.13.42", "source": { "type": "git", "url": "https://github.com/giggsey/libphonenumber-for-php.git", - "reference": "5a36692616dba1ec4a24217f248021b1ec9cdade" + "reference": "b7ee848bbd1958ff7464522d5c6e3688cca2a125" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/5a36692616dba1ec4a24217f248021b1ec9cdade", - "reference": "5a36692616dba1ec4a24217f248021b1ec9cdade", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/b7ee848bbd1958ff7464522d5c6e3688cca2a125", + "reference": "b7ee848bbd1958ff7464522d5c6e3688cca2a125", "shasum": "" }, "require": { @@ -2062,7 +2062,7 @@ "issues": "https://github.com/giggsey/libphonenumber-for-php/issues", "source": "https://github.com/giggsey/libphonenumber-for-php" }, - "time": "2024-06-14T12:43:12+00:00" + "time": "2024-07-29T07:19:22+00:00" }, { "name": "giggsey/locale", @@ -2120,34 +2120,34 @@ }, { "name": "google/apiclient", - "version": "v2.16.0", + "version": "v2.17.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "017400f609c1fb71ab5ad824c50eabd4c3eaf779" + "reference": "b1f63d72c44307ec8ef7bf18f1012de35d8944ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/017400f609c1fb71ab5ad824c50eabd4c3eaf779", - "reference": "017400f609c1fb71ab5ad824c50eabd4c3eaf779", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/b1f63d72c44307ec8ef7bf18f1012de35d8944ed", + "reference": "b1f63d72c44307ec8ef7bf18f1012de35d8944ed", "shasum": "" }, "require": { - "firebase/php-jwt": "~6.0", + "firebase/php-jwt": "^6.0", "google/apiclient-services": "~0.350", "google/auth": "^1.37", - "guzzlehttp/guzzle": "^6.5.8||^7.4.5", - "guzzlehttp/psr7": "^1.9.1||^2.2.1", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.6", "monolog/monolog": "^2.9||^3.0", - "php": "^7.4|^8.0", + "php": "^8.0", "phpseclib/phpseclib": "^3.0.36" }, "require-dev": { "cache/filesystem-adapter": "^1.1", "composer/composer": "^1.10.23", "phpcompatibility/php-compatibility": "^9.2", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", "squizlabs/php_codesniffer": "^3.8", "symfony/css-selector": "~2.1", "symfony/dom-crawler": "~2.1" @@ -2183,22 +2183,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client/issues", - "source": "https://github.com/googleapis/google-api-php-client/tree/v2.16.0" + "source": "https://github.com/googleapis/google-api-php-client/tree/v2.17.0" }, - "time": "2024-04-24T00:59:47+00:00" + "time": "2024-07-10T14:57:54+00:00" }, { "name": "google/apiclient-services", - "version": "v0.360.0", + "version": "v0.366.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "e48813050e660c7dcbe48cb6556461efe6381a54" + "reference": "edc08087aa3ca63d3b74f24d59f1d2caab39b5d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/e48813050e660c7dcbe48cb6556461efe6381a54", - "reference": "e48813050e660c7dcbe48cb6556461efe6381a54", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/edc08087aa3ca63d3b74f24d59f1d2caab39b5d9", + "reference": "edc08087aa3ca63d3b74f24d59f1d2caab39b5d9", "shasum": "" }, "require": { @@ -2227,22 +2227,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.360.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.366.0" }, - "time": "2024-06-17T01:06:20+00:00" + "time": "2024-07-11T01:08:44+00:00" }, { "name": "google/auth", - "version": "v1.40.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "bff9f2d01677e71a98394b5ac981b99523df5178" + "reference": "1043ea18fe7f5dfbf5b208ce3ee6d6b6ab8cb038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/bff9f2d01677e71a98394b5ac981b99523df5178", - "reference": "bff9f2d01677e71a98394b5ac981b99523df5178", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/1043ea18fe7f5dfbf5b208ce3ee6d6b6ab8cb038", + "reference": "1043ea18fe7f5dfbf5b208ce3ee6d6b6ab8cb038", "shasum": "" }, "require": { @@ -2287,9 +2287,9 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.40.0" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.41.0" }, - "time": "2024-05-31T19:16:15+00:00" + "time": "2024-07-10T15:21:07+00:00" }, { "name": "graham-campbell/manager", @@ -2363,24 +2363,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.1.2", + "version": "v1.1.3", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2" + "phpoption/phpoption": "^1.9.3" }, "require-dev": { - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", "autoload": { @@ -2409,7 +2409,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" }, "funding": [ { @@ -2421,26 +2421,26 @@ "type": "tidelift" } ], - "time": "2023-11-12T22:16:48+00:00" + "time": "2024-07-20T21:45:45+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -2451,9 +2451,9 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -2531,7 +2531,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -2547,20 +2547,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "shasum": "" }, "require": { @@ -2568,7 +2568,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { @@ -2614,7 +2614,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "source": "https://github.com/guzzle/promises/tree/2.0.3" }, "funding": [ { @@ -2630,20 +2630,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2024-07-18T10:29:17+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -2658,8 +2658,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2730,7 +2730,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -2746,7 +2746,7 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "guzzlehttp/uri-template", @@ -3072,16 +3072,16 @@ }, { "name": "laravel/cashier", - "version": "v15.3.2", + "version": "v15.4.1", "source": { "type": "git", "url": "https://github.com/laravel/cashier-stripe.git", - "reference": "f468fb187b2229a0f1b7d20e2a619369eb4a36e7" + "reference": "4fee4a7716a465ff9d96cc17f0bf66a98953d25f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/cashier-stripe/zipball/f468fb187b2229a0f1b7d20e2a619369eb4a36e7", - "reference": "f468fb187b2229a0f1b7d20e2a619369eb4a36e7", + "url": "https://api.github.com/repos/laravel/cashier-stripe/zipball/4fee4a7716a465ff9d96cc17f0bf66a98953d25f", + "reference": "4fee4a7716a465ff9d96cc17f0bf66a98953d25f", "shasum": "" }, "require": { @@ -3156,20 +3156,20 @@ "issues": "https://github.com/laravel/cashier/issues", "source": "https://github.com/laravel/cashier" }, - "time": "2024-04-12T09:45:48+00:00" + "time": "2024-07-09T15:42:33+00:00" }, { "name": "laravel/framework", - "version": "v11.10.0", + "version": "v11.19.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "99b4255194912044b75ab72329f8c19e6345720e" + "reference": "5e103d499e9ee5bcfc184412d034c4e516b87085" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/99b4255194912044b75ab72329f8c19e6345720e", - "reference": "99b4255194912044b75ab72329f8c19e6345720e", + "url": "https://api.github.com/repos/laravel/framework/zipball/5e103d499e9ee5bcfc184412d034c4e516b87085", + "reference": "5e103d499e9ee5bcfc184412d034c4e516b87085", "shasum": "" }, "require": { @@ -3222,6 +3222,7 @@ }, "provide": { "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", "psr/simple-cache-implementation": "1.0|2.0|3.0" }, "replace": { @@ -3272,9 +3273,9 @@ "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.6", "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^9.0.15", + "orchestra/testbench-core": "^9.1.5", "pda/pheanstalk": "^5.0", - "phpstan/phpstan": "^1.4.7", + "phpstan/phpstan": "^1.11.5", "phpunit/phpunit": "^10.5|^11.0", "predis/predis": "^2.0.2", "resend/resend-php": "^0.10.0", @@ -3361,20 +3362,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-06-04T13:45:55+00:00" + "time": "2024-07-30T15:22:41+00:00" }, { "name": "laravel/horizon", - "version": "v5.24.5", + "version": "v5.27.0", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "3c359e3a9ebd3e3be012a15eedf2d64ef8b82540" + "reference": "8830039251591d1af353f571b40fe0c774dfda20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/3c359e3a9ebd3e3be012a15eedf2d64ef8b82540", - "reference": "3c359e3a9ebd3e3be012a15eedf2d64ef8b82540", + "url": "https://api.github.com/repos/laravel/horizon/zipball/8830039251591d1af353f571b40fe0c774dfda20", + "reference": "8830039251591d1af353f571b40fe0c774dfda20", "shasum": "" }, "require": { @@ -3438,22 +3439,22 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.24.5" + "source": "https://github.com/laravel/horizon/tree/v5.27.0" }, - "time": "2024-05-31T16:18:41+00:00" + "time": "2024-07-26T05:41:51+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.23", + "version": "v0.1.24", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "9bc4df7c699b0452c6b815e64a2d84b6d7f99400" + "reference": "409b0b4305273472f3754826e68f4edbd0150149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/9bc4df7c699b0452c6b815e64a2d84b6d7f99400", - "reference": "9bc4df7c699b0452c6b815e64a2d84b6d7f99400", + "url": "https://api.github.com/repos/laravel/prompts/zipball/409b0b4305273472f3754826e68f4edbd0150149", + "reference": "409b0b4305273472f3754826e68f4edbd0150149", "shasum": "" }, "require": { @@ -3496,9 +3497,9 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.23" + "source": "https://github.com/laravel/prompts/tree/v0.1.24" }, - "time": "2024-05-27T13:53:20+00:00" + "time": "2024-06-17T13:58:22+00:00" }, { "name": "laravel/serializable-closure", @@ -3562,16 +3563,16 @@ }, { "name": "laravel/socialite", - "version": "v5.14.0", + "version": "v5.15.1", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "c7b0193a3753a29aff8ce80aa2f511917e6ed68a" + "reference": "cc02625f0bd1f95dc3688eb041cce0f1e709d029" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/c7b0193a3753a29aff8ce80aa2f511917e6ed68a", - "reference": "c7b0193a3753a29aff8ce80aa2f511917e6ed68a", + "url": "https://api.github.com/repos/laravel/socialite/zipball/cc02625f0bd1f95dc3688eb041cce0f1e709d029", + "reference": "cc02625f0bd1f95dc3688eb041cce0f1e709d029", "shasum": "" }, "require": { @@ -3630,7 +3631,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2024-05-03T20:31:38+00:00" + "time": "2024-06-28T20:09:34+00:00" }, { "name": "laravel/tinker", @@ -4049,16 +4050,16 @@ }, { "name": "league/commonmark", - "version": "2.4.2", + "version": "2.5.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" + "reference": "ac815920de0eff6de947eac0a6a94e5ed0fb147c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", - "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/ac815920de0eff6de947eac0a6a94e5ed0fb147c", + "reference": "ac815920de0eff6de947eac0a6a94e5ed0fb147c", "shasum": "" }, "require": { @@ -4071,8 +4072,8 @@ }, "require-dev": { "cebe/markdown": "^1.0", - "commonmark/cmark": "0.30.3", - "commonmark/commonmark.js": "0.30.0", + "commonmark/cmark": "0.31.0", + "commonmark/commonmark.js": "0.31.0", "composer/package-versions-deprecated": "^1.8", "embed/embed": "^4.4", "erusev/parsedown": "^1.0", @@ -4094,7 +4095,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.6-dev" } }, "autoload": { @@ -4151,7 +4152,7 @@ "type": "tidelift" } ], - "time": "2024-02-02T11:59:32+00:00" + "time": "2024-07-24T12:52:09+00:00" }, { "name": "league/config", @@ -5154,16 +5155,16 @@ }, { "name": "monolog/monolog", - "version": "3.6.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { @@ -5239,7 +5240,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -5251,7 +5252,7 @@ "type": "tidelift" } ], - "time": "2024-04-12T21:02:21+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "mtdowling/jmespath.php", @@ -5321,16 +5322,16 @@ }, { "name": "nesbot/carbon", - "version": "3.5.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "415782b7e48223342f1a616c16c45a95b15b2318" + "reference": "cb4374784c87d0a0294e8513a52eb63c0aff3139" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/415782b7e48223342f1a616c16c45a95b15b2318", - "reference": "415782b7e48223342f1a616c16c45a95b15b2318", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cb4374784c87d0a0294e8513a52eb63c0aff3139", + "reference": "cb4374784c87d0a0294e8513a52eb63c0aff3139", "shasum": "" }, "require": { @@ -5423,7 +5424,7 @@ "type": "tidelift" } ], - "time": "2024-06-03T17:25:54+00:00" + "time": "2024-07-16T22:29:20+00:00" }, { "name": "nette/schema", @@ -5629,16 +5630,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.2", + "version": "v5.1.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", "shasum": "" }, "require": { @@ -5649,7 +5650,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -5681,9 +5682,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" }, - "time": "2024-03-05T20:51:40+00:00" + "time": "2024-07-01T20:03:41+00:00" }, { "name": "nunomaduro/termwind", @@ -6413,16 +6414,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.2", + "version": "1.9.3", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", "shasum": "" }, "require": { @@ -6430,13 +6431,13 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": true + "forward-command": false }, "branch-alias": { "dev-master": "1.9-dev" @@ -6472,7 +6473,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" }, "funding": [ { @@ -6484,20 +6485,20 @@ "type": "tidelift" } ], - "time": "2023-11-12T21:59:55+00:00" + "time": "2024-07-20T21:41:07+00:00" }, { "name": "phpseclib/phpseclib", - "version": "3.0.38", + "version": "3.0.39", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "b18b8788e51156c4dd97b7f220a31149a0052067" + "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b18b8788e51156c4dd97b7f220a31149a0052067", - "reference": "b18b8788e51156c4dd97b7f220a31149a0052067", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/211ebc399c6e73c225a018435fe5ae209d1d1485", + "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485", "shasum": "" }, "require": { @@ -6578,7 +6579,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.38" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.39" }, "funding": [ { @@ -6594,7 +6595,7 @@ "type": "tidelift" } ], - "time": "2024-06-17T10:11:32+00:00" + "time": "2024-06-24T06:27:33+00:00" }, { "name": "phpstan/phpdoc-parser", @@ -6645,16 +6646,16 @@ }, { "name": "propaganistas/laravel-disposable-email", - "version": "2.4.2", + "version": "2.4.4", "source": { "type": "git", "url": "https://github.com/Propaganistas/Laravel-Disposable-Email.git", - "reference": "ba101c464527d7b019b35d7ae8ec6709dc2cb812" + "reference": "4da37844d0dfcf5f7a0a1ff0793fe2ce9bf8ea9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Propaganistas/Laravel-Disposable-Email/zipball/ba101c464527d7b019b35d7ae8ec6709dc2cb812", - "reference": "ba101c464527d7b019b35d7ae8ec6709dc2cb812", + "url": "https://api.github.com/repos/Propaganistas/Laravel-Disposable-Email/zipball/4da37844d0dfcf5f7a0a1ff0793fe2ce9bf8ea9b", + "reference": "4da37844d0dfcf5f7a0a1ff0793fe2ce9bf8ea9b", "shasum": "" }, "require": { @@ -6710,7 +6711,7 @@ ], "support": { "issues": "https://github.com/Propaganistas/Laravel-Disposable-Email/issues", - "source": "https://github.com/Propaganistas/Laravel-Disposable-Email/tree/2.4.2" + "source": "https://github.com/Propaganistas/Laravel-Disposable-Email/tree/2.4.4" }, "funding": [ { @@ -6718,7 +6719,7 @@ "type": "github" } ], - "time": "2024-06-01T00:37:46+00:00" + "time": "2024-08-01T00:41:48+00:00" }, { "name": "psr/cache", @@ -7615,16 +7616,16 @@ }, { "name": "sentry/sentry", - "version": "4.8.0", + "version": "4.8.1", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "3cf5778ff425a23f2d22ed41b423691d36f47163" + "reference": "61770efd8b7888e0bdd7d234f0ba67b066e47d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/3cf5778ff425a23f2d22ed41b423691d36f47163", - "reference": "3cf5778ff425a23f2d22ed41b423691d36f47163", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/61770efd8b7888e0bdd7d234f0ba67b066e47d04", + "reference": "61770efd8b7888e0bdd7d234f0ba67b066e47d04", "shasum": "" }, "require": { @@ -7688,7 +7689,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.8.0" + "source": "https://github.com/getsentry/sentry-php/tree/4.8.1" }, "funding": [ { @@ -7700,20 +7701,20 @@ "type": "custom" } ], - "time": "2024-06-05T13:18:43+00:00" + "time": "2024-07-16T13:45:27+00:00" }, { "name": "sentry/sentry-laravel", - "version": "4.6.0", + "version": "4.7.1", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "75c11944211ce7707bb92e717c5bda93a1759438" + "reference": "d70415f19f35806acee5bcbc7403e9cb8fb5252c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/75c11944211ce7707bb92e717c5bda93a1759438", - "reference": "75c11944211ce7707bb92e717c5bda93a1759438", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/d70415f19f35806acee5bcbc7403e9cb8fb5252c", + "reference": "d70415f19f35806acee5bcbc7403e9cb8fb5252c", "shasum": "" }, "require": { @@ -7777,7 +7778,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/4.6.0" + "source": "https://github.com/getsentry/sentry-laravel/tree/4.7.1" }, "funding": [ { @@ -7789,20 +7790,20 @@ "type": "custom" } ], - "time": "2024-06-11T12:23:24+00:00" + "time": "2024-07-17T13:27:43+00:00" }, { "name": "spatie/browsershot", - "version": "4.1.0", + "version": "4.1.3", "source": { "type": "git", "url": "https://github.com/spatie/browsershot.git", - "reference": "1fbc5955a24ec9b4dbc2620f78c03d5c043856d2" + "reference": "00ed6812b5bcb28ac13c1a17fc9d5cbf5ea19f0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/browsershot/zipball/1fbc5955a24ec9b4dbc2620f78c03d5c043856d2", - "reference": "1fbc5955a24ec9b4dbc2620f78c03d5c043856d2", + "url": "https://api.github.com/repos/spatie/browsershot/zipball/00ed6812b5bcb28ac13c1a17fc9d5cbf5ea19f0a", + "reference": "00ed6812b5bcb28ac13c1a17fc9d5cbf5ea19f0a", "shasum": "" }, "require": { @@ -7848,7 +7849,7 @@ "webpage" ], "support": { - "source": "https://github.com/spatie/browsershot/tree/4.1.0" + "source": "https://github.com/spatie/browsershot/tree/4.1.3" }, "funding": [ { @@ -7856,20 +7857,20 @@ "type": "github" } ], - "time": "2024-06-12T07:42:17+00:00" + "time": "2024-07-15T14:25:51+00:00" }, { "name": "spatie/crawler", - "version": "8.2.0", + "version": "8.2.3", "source": { "type": "git", "url": "https://github.com/spatie/crawler.git", - "reference": "807d145a3c071dc0e69bb7e6783611e2591f9773" + "reference": "c659f2fe4954249755990e42394a14d6d847a0a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/crawler/zipball/807d145a3c071dc0e69bb7e6783611e2591f9773", - "reference": "807d145a3c071dc0e69bb7e6783611e2591f9773", + "url": "https://api.github.com/repos/spatie/crawler/zipball/c659f2fe4954249755990e42394a14d6d847a0a7", + "reference": "c659f2fe4954249755990e42394a14d6d847a0a7", "shasum": "" }, "require": { @@ -7912,7 +7913,7 @@ ], "support": { "issues": "https://github.com/spatie/crawler/issues", - "source": "https://github.com/spatie/crawler/tree/8.2.0" + "source": "https://github.com/spatie/crawler/tree/8.2.3" }, "funding": [ { @@ -7924,20 +7925,20 @@ "type": "github" } ], - "time": "2024-02-15T10:40:48+00:00" + "time": "2024-07-31T10:46:19+00:00" }, { "name": "spatie/laravel-data", - "version": "4.7.0", + "version": "4.7.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "92af136b14f57c72b1b8e36cd5f7e274fb56385a" + "reference": "8980ee53f03721428c21b0b32ef662f85b277403" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/92af136b14f57c72b1b8e36cd5f7e274fb56385a", - "reference": "92af136b14f57c72b1b8e36cd5f7e274fb56385a", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/8980ee53f03721428c21b0b32ef662f85b277403", + "reference": "8980ee53f03721428c21b0b32ef662f85b277403", "shasum": "" }, "require": { @@ -8000,7 +8001,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/4.7.0" + "source": "https://github.com/spatie/laravel-data/tree/4.7.2" }, "funding": [ { @@ -8008,7 +8009,7 @@ "type": "github" } ], - "time": "2024-06-13T12:07:24+00:00" + "time": "2024-07-25T11:17:44+00:00" }, { "name": "spatie/laravel-package-tools", @@ -8604,16 +8605,16 @@ }, { "name": "symfony/console", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3" + "reference": "cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", - "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", + "url": "https://api.github.com/repos/symfony/console/zipball/cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9", + "reference": "cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9", "shasum": "" }, "require": { @@ -8677,7 +8678,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.1" + "source": "https://github.com/symfony/console/tree/v7.1.3" }, "funding": [ { @@ -8693,7 +8694,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/css-selector", @@ -8896,16 +8897,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd" + "reference": "432bb369952795c61ca1def65e078c4a80dad13c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", - "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c", "shasum": "" }, "require": { @@ -8951,7 +8952,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.1" + "source": "https://github.com/symfony/error-handler/tree/v7.1.3" }, "funding": [ { @@ -8967,7 +8968,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-26T13:02:51+00:00" }, { "name": "symfony/event-dispatcher", @@ -9127,16 +9128,16 @@ }, { "name": "symfony/finder", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6" + "reference": "717c6329886f32dc65e27461f80f2a465412fdca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6", - "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "url": "https://api.github.com/repos/symfony/finder/zipball/717c6329886f32dc65e27461f80f2a465412fdca", + "reference": "717c6329886f32dc65e27461f80f2a465412fdca", "shasum": "" }, "require": { @@ -9171,7 +9172,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.1" + "source": "https://github.com/symfony/finder/tree/v7.1.3" }, "funding": [ { @@ -9187,20 +9188,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-24T07:08:44+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa" + "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/74d171d5b6a1d9e4bfee09a41937c17a7536acfa", - "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", + "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", "shasum": "" }, "require": { @@ -9248,7 +9249,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.1" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.3" }, "funding": [ { @@ -9264,20 +9265,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f" + "reference": "db9702f3a04cc471ec8c70e881825db26ac5f186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fa8d1c75b5f33b1302afccf81811f93976c6e26f", - "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/db9702f3a04cc471ec8c70e881825db26ac5f186", + "reference": "db9702f3a04cc471ec8c70e881825db26ac5f186", "shasum": "" }, "require": { @@ -9362,7 +9363,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.1" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.3" }, "funding": [ { @@ -9378,20 +9379,20 @@ "type": "tidelift" } ], - "time": "2024-06-04T06:52:15+00:00" + "time": "2024-07-26T14:58:15+00:00" }, { "name": "symfony/mailer", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e" + "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/2eaad2e167cae930f25a3d731fec8b2ded5e751e", - "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e", + "url": "https://api.github.com/repos/symfony/mailer/zipball/8fcff0af9043c8f8a8e229437cea363e282f9aee", + "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee", "shasum": "" }, "require": { @@ -9442,7 +9443,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.1" + "source": "https://github.com/symfony/mailer/tree/v7.1.2" }, "funding": [ { @@ -9458,20 +9459,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-28T08:00:31+00:00" }, { "name": "symfony/mime", - "version": "v7.1.1", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "21027eaacc1a8a20f5e616c25c3580f5dd3a15df" + "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/21027eaacc1a8a20f5e616c25c3580f5dd3a15df", - "reference": "21027eaacc1a8a20f5e616c25c3580f5dd3a15df", + "url": "https://api.github.com/repos/symfony/mime/zipball/26a00b85477e69a4bab63b66c5dce64f18b0cbfc", + "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc", "shasum": "" }, "require": { @@ -9526,7 +9527,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.1" + "source": "https://github.com/symfony/mime/tree/v7.1.2" }, "funding": [ { @@ -9542,7 +9543,7 @@ "type": "tidelift" } ], - "time": "2024-06-04T06:40:14+00:00" + "time": "2024-06-28T10:03:55+00:00" }, { "name": "symfony/options-resolver", @@ -9613,16 +9614,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -9672,7 +9673,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -9688,20 +9689,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -9750,7 +9751,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -9766,20 +9767,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" + "reference": "e76343c631b453088e2260ac41dfebe21954de81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e76343c631b453088e2260ac41dfebe21954de81", + "reference": "e76343c631b453088e2260ac41dfebe21954de81", "shasum": "" }, "require": { @@ -9834,7 +9835,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.30.0" }, "funding": [ { @@ -9850,20 +9851,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:12:16+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "shasum": "" }, "require": { @@ -9918,7 +9919,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" }, "funding": [ { @@ -9934,20 +9935,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -9999,7 +10000,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -10015,20 +10016,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -10079,7 +10080,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -10095,20 +10096,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "reference": "10112722600777e02d2745716b70c5db4ca70442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", + "reference": "10112722600777e02d2745716b70c5db4ca70442", "shasum": "" }, "require": { @@ -10152,7 +10153,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" }, "funding": [ { @@ -10168,20 +10169,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", "shasum": "" }, "require": { @@ -10232,7 +10233,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" }, "funding": [ { @@ -10248,25 +10249,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.1" }, "type": "library", "extra": { @@ -10309,7 +10309,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" }, "funding": [ { @@ -10325,20 +10325,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:35:24+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", + "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", "shasum": "" }, "require": { @@ -10388,7 +10388,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0" }, "funding": [ { @@ -10404,20 +10404,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/process", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "febf90124323a093c7ee06fdb30e765ca3c20028" + "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028", - "reference": "febf90124323a093c7ee06fdb30e765ca3c20028", + "url": "https://api.github.com/repos/symfony/process/zipball/7f2f542c668ad6c313dc4a5e9c3321f733197eca", + "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca", "shasum": "" }, "require": { @@ -10449,7 +10449,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.1" + "source": "https://github.com/symfony/process/tree/v7.1.3" }, "funding": [ { @@ -10465,20 +10465,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-26T12:44:47+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "9a5dbb606da711f5d40a7596ad577856f9402140" + "reference": "1365d10f5476f74a27cf9c2d1eee70c069019db0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9a5dbb606da711f5d40a7596ad577856f9402140", - "reference": "9a5dbb606da711f5d40a7596ad577856f9402140", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/1365d10f5476f74a27cf9c2d1eee70c069019db0", + "reference": "1365d10f5476f74a27cf9c2d1eee70c069019db0", "shasum": "" }, "require": { @@ -10532,7 +10532,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.1.1" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.1.3" }, "funding": [ { @@ -10548,20 +10548,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-17T06:10:24+00:00" }, { "name": "symfony/routing", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" + "reference": "8a908a3f22d5a1b5d297578c2ceb41b02fa916d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", - "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", + "url": "https://api.github.com/repos/symfony/routing/zipball/8a908a3f22d5a1b5d297578c2ceb41b02fa916d0", + "reference": "8a908a3f22d5a1b5d297578c2ceb41b02fa916d0", "shasum": "" }, "require": { @@ -10613,7 +10613,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.1" + "source": "https://github.com/symfony/routing/tree/v7.1.3" }, "funding": [ { @@ -10629,7 +10629,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-17T06:10:24+00:00" }, { "name": "symfony/service-contracts", @@ -10716,16 +10716,16 @@ }, { "name": "symfony/string", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "60bc311c74e0af215101235aa6f471bcbc032df2" + "reference": "ea272a882be7f20cad58d5d78c215001617b7f07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/60bc311c74e0af215101235aa6f471bcbc032df2", - "reference": "60bc311c74e0af215101235aa6f471bcbc032df2", + "url": "https://api.github.com/repos/symfony/string/zipball/ea272a882be7f20cad58d5d78c215001617b7f07", + "reference": "ea272a882be7f20cad58d5d78c215001617b7f07", "shasum": "" }, "require": { @@ -10783,7 +10783,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.1" + "source": "https://github.com/symfony/string/tree/v7.1.3" }, "funding": [ { @@ -10799,20 +10799,20 @@ "type": "tidelift" } ], - "time": "2024-06-04T06:40:14+00:00" + "time": "2024-07-22T10:25:37+00:00" }, { "name": "symfony/translation", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3" + "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", - "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", + "url": "https://api.github.com/repos/symfony/translation/zipball/8d5e50c813ba2859a6dfc99a0765c550507934a1", + "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1", "shasum": "" }, "require": { @@ -10877,7 +10877,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.1" + "source": "https://github.com/symfony/translation/tree/v7.1.3" }, "funding": [ { @@ -10893,7 +10893,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/translation-contracts", @@ -11049,16 +11049,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.1.1", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293" + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/deb2c2b506ff6fdbb340e00b34e9901e1605f293", - "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86af4617cca75a6e28598f49ae0690f3b9d4591f", + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f", "shasum": "" }, "require": { @@ -11112,7 +11112,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.1" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.3" }, "funding": [ { @@ -11128,7 +11128,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/yaml", @@ -11407,23 +11407,23 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.6.0", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", - "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.2", + "graham-campbell/result-type": "^1.1.3", "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2", + "phpoption/phpoption": "^1.9.3", "symfony/polyfill-ctype": "^1.24", "symfony/polyfill-mbstring": "^1.24", "symfony/polyfill-php80": "^1.24" @@ -11440,7 +11440,7 @@ "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": true + "forward-command": false }, "branch-alias": { "dev-master": "5.6-dev" @@ -11475,7 +11475,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" }, "funding": [ { @@ -11487,7 +11487,7 @@ "type": "tidelift" } ], - "time": "2023-11-12T22:43:29+00:00" + "time": "2024-07-20T21:52:34+00:00" }, { "name": "voku/portable-ascii", @@ -11625,16 +11625,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-ide-helper", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "bc1d67f01ce8c77e3f97d48ba51fa1d81874f622" + "reference": "591e7d665fbab8a3b682e451641706341573eb80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/bc1d67f01ce8c77e3f97d48ba51fa1d81874f622", - "reference": "bc1d67f01ce8c77e3f97d48ba51fa1d81874f622", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/591e7d665fbab8a3b682e451641706341573eb80", + "reference": "591e7d665fbab8a3b682e451641706341573eb80", "shasum": "" }, "require": { @@ -11666,7 +11666,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "laravel": { "providers": [ @@ -11703,7 +11703,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.0.0" + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.1.0" }, "funding": [ { @@ -11715,7 +11715,7 @@ "type": "github" } ], - "time": "2024-03-01T12:53:18+00:00" + "time": "2024-07-12T14:20:51+00:00" }, { "name": "barryvdh/reflection-docblock", @@ -11938,30 +11938,38 @@ }, { "name": "composer/pcre", - "version": "3.1.4", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "04229f163664973f68f38f6f73d917799168ef24" + "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", - "reference": "04229f163664973f68f38f6f73d917799168ef24", + "url": "https://api.github.com/repos/composer/pcre/zipball/ea4ab6f9580a4fd221e0418f2c357cdd39102a90", + "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.8" + }, "require-dev": { - "phpstan/phpstan": "^1.3", + "phpstan/phpstan": "^1.11.8", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { @@ -11989,7 +11997,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.4" + "source": "https://github.com/composer/pcre/tree/3.2.0" }, "funding": [ { @@ -12005,7 +12013,7 @@ "type": "tidelift" } ], - "time": "2024-05-27T13:40:54+00:00" + "time": "2024-07-25T09:36:02+00:00" }, { "name": "fakerphp/faker", @@ -12255,16 +12263,16 @@ }, { "name": "laravel/dusk", - "version": "v8.2.0", + "version": "v8.2.2", "source": { "type": "git", "url": "https://github.com/laravel/dusk.git", - "reference": "773a12dfbd3f84174b0f26fbc2807a414a379a66" + "reference": "c7c1702324b40272eaca6519c573555a03faf3d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/773a12dfbd3f84174b0f26fbc2807a414a379a66", - "reference": "773a12dfbd3f84174b0f26fbc2807a414a379a66", + "url": "https://api.github.com/repos/laravel/dusk/zipball/c7c1702324b40272eaca6519c573555a03faf3d7", + "reference": "c7c1702324b40272eaca6519c573555a03faf3d7", "shasum": "" }, "require": { @@ -12321,22 +12329,22 @@ ], "support": { "issues": "https://github.com/laravel/dusk/issues", - "source": "https://github.com/laravel/dusk/tree/v8.2.0" + "source": "https://github.com/laravel/dusk/tree/v8.2.2" }, - "time": "2024-04-16T15:51:19+00:00" + "time": "2024-07-24T15:46:41+00:00" }, { "name": "laravel/pint", - "version": "v1.16.0", + "version": "v1.17.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98" + "reference": "b5b6f716db298671c1dfea5b1082ec2c0ae7064f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98", - "reference": "1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98", + "url": "https://api.github.com/repos/laravel/pint/zipball/b5b6f716db298671c1dfea5b1082ec2c0ae7064f", + "reference": "b5b6f716db298671c1dfea5b1082ec2c0ae7064f", "shasum": "" }, "require": { @@ -12347,13 +12355,13 @@ "php": "^8.1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.57.1", - "illuminate/view": "^10.48.10", - "larastan/larastan": "^2.9.6", + "friendsofphp/php-cs-fixer": "^3.59.3", + "illuminate/view": "^10.48.12", + "larastan/larastan": "^2.9.7", "laravel-zero/framework": "^10.4.0", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.34.7" + "pestphp/pest": "^2.34.8" }, "bin": [ "builds/pint" @@ -12389,20 +12397,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2024-05-21T18:08:25+00:00" + "time": "2024-08-01T09:06:33+00:00" }, { "name": "laravel/sail", - "version": "v1.29.2", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "a8e4e749735ba2f091856eafeb3f99db8cd6b621" + "reference": "48d89608a3bb5be763c9bb87121d31e7da27c1cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/a8e4e749735ba2f091856eafeb3f99db8cd6b621", - "reference": "a8e4e749735ba2f091856eafeb3f99db8cd6b621", + "url": "https://api.github.com/repos/laravel/sail/zipball/48d89608a3bb5be763c9bb87121d31e7da27c1cb", + "reference": "48d89608a3bb5be763c9bb87121d31e7da27c1cb", "shasum": "" }, "require": { @@ -12452,7 +12460,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-05-16T21:39:11+00:00" + "time": "2024-07-22T14:36:50+00:00" }, { "name": "mockery/mockery", @@ -12599,38 +12607,38 @@ }, { "name": "nunomaduro/collision", - "version": "v8.1.1", + "version": "v8.4.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "13e5d538b95a744d85f447a321ce10adb28e9af9" + "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/13e5d538b95a744d85f447a321ce10adb28e9af9", - "reference": "13e5d538b95a744d85f447a321ce10adb28e9af9", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/e7d1aa8ed753f63fa816932bbc89678238843b4a", + "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a", "shasum": "" }, "require": { "filp/whoops": "^2.15.4", "nunomaduro/termwind": "^2.0.1", "php": "^8.2.0", - "symfony/console": "^7.0.4" + "symfony/console": "^7.1.3" }, "conflict": { "laravel/framework": "<11.0.0 || >=12.0.0", "phpunit/phpunit": "<10.5.1 || >=12.0.0" }, "require-dev": { - "larastan/larastan": "^2.9.2", - "laravel/framework": "^11.0.0", - "laravel/pint": "^1.14.0", - "laravel/sail": "^1.28.2", - "laravel/sanctum": "^4.0.0", + "larastan/larastan": "^2.9.8", + "laravel/framework": "^11.19.0", + "laravel/pint": "^1.17.1", + "laravel/sail": "^1.31.0", + "laravel/sanctum": "^4.0.2", "laravel/tinker": "^2.9.0", - "orchestra/testbench-core": "^9.0.0", - "pestphp/pest": "^2.34.1 || ^3.0.0", - "sebastian/environment": "^6.0.1 || ^7.0.0" + "orchestra/testbench-core": "^9.2.3", + "pestphp/pest": "^2.35.0 || ^3.0.0", + "sebastian/environment": "^6.1.0 || ^7.0.0" }, "type": "library", "extra": { @@ -12692,25 +12700,25 @@ "type": "patreon" } ], - "time": "2024-03-06T16:20:09+00:00" + "time": "2024-08-03T15:32:23+00:00" }, { "name": "pestphp/pest", - "version": "v2.34.8", + "version": "v2.35.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "e8f122bf47585c06431e0056189ec6bfd6f41f57" + "reference": "d0ff2c8ec294b7aa7fcb0f3ddc4fdec864234646" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/e8f122bf47585c06431e0056189ec6bfd6f41f57", - "reference": "e8f122bf47585c06431e0056189ec6bfd6f41f57", + "url": "https://api.github.com/repos/pestphp/pest/zipball/d0ff2c8ec294b7aa7fcb0f3ddc4fdec864234646", + "reference": "d0ff2c8ec294b7aa7fcb0f3ddc4fdec864234646", "shasum": "" }, "require": { "brianium/paratest": "^7.3.1", - "nunomaduro/collision": "^7.10.0|^8.1.1", + "nunomaduro/collision": "^7.10.0|^8.3.0", "nunomaduro/termwind": "^1.15.1|^2.0.1", "pestphp/pest-plugin": "^2.1.1", "pestphp/pest-plugin-arch": "^2.7.0", @@ -12724,8 +12732,8 @@ }, "require-dev": { "pestphp/pest-dev-tools": "^2.16.0", - "pestphp/pest-plugin-type-coverage": "^2.8.3", - "symfony/process": "^6.4.0|^7.1.1" + "pestphp/pest-plugin-type-coverage": "^2.8.5", + "symfony/process": "^6.4.0|^7.1.3" }, "bin": [ "bin/pest" @@ -12788,7 +12796,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v2.34.8" + "source": "https://github.com/pestphp/pest/tree/v2.35.0" }, "funding": [ { @@ -12800,7 +12808,7 @@ "type": "github" } ], - "time": "2024-06-10T22:02:16+00:00" + "time": "2024-08-02T10:57:29+00:00" }, { "name": "pestphp/pest-plugin", @@ -13061,6 +13069,134 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "php-di/invoker", + "version": "2.3.4", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/33234b32dafa8eb69202f950a1fc92055ed76a86", + "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Invoker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", + "keywords": [ + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" + ], + "support": { + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.4" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2023-09-08T09:24:21+00:00" + }, + { + "name": "php-di/php-di", + "version": "7.0.7", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PHP-DI.git", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "shasum": "" + }, + "require": { + "laravel/serializable-closure": "^1.0", + "php": ">=8.0", + "php-di/invoker": "^2.0", + "psr/container": "^1.1 || ^2.0" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/proxy-manager-lts": "^1", + "mnapoli/phpunit-easymock": "^1.3", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.6" + }, + "suggest": { + "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "DI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The dependency injection container for humans", + "homepage": "https://php-di.org/", + "keywords": [ + "PSR-11", + "container", + "container-interop", + "dependency injection", + "di", + "ioc", + "psr11" + ], + "support": { + "issues": "https://github.com/PHP-DI/PHP-DI/issues", + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", + "type": "tidelift" + } + ], + "time": "2024-07-21T15:55:45+00:00" + }, { "name": "php-webdriver/webdriver", "version": "1.15.1", @@ -13193,16 +13329,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.5", + "version": "1.11.9", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "490f0ae1c92b082f154681d7849aee776a7c1443" + "reference": "e370bcddadaede0c1716338b262346f40d296f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/490f0ae1c92b082f154681d7849aee776a7c1443", - "reference": "490f0ae1c92b082f154681d7849aee776a7c1443", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e370bcddadaede0c1716338b262346f40d296f82", + "reference": "e370bcddadaede0c1716338b262346f40d296f82", "shasum": "" }, "require": { @@ -13247,20 +13383,20 @@ "type": "github" } ], - "time": "2024-06-17T15:10:54+00:00" + "time": "2024-08-01T16:25:18+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.14", + "version": "10.1.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", "shasum": "" }, "require": { @@ -13317,7 +13453,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" }, "funding": [ { @@ -13325,7 +13461,7 @@ "type": "github" } ], - "time": "2024-03-12T15:33:41+00:00" + "time": "2024-06-29T08:25:15+00:00" }, { "name": "phpunit/php-file-iterator", @@ -13671,71 +13807,18 @@ ], "time": "2024-04-05T04:39:01+00:00" }, - { - "name": "pimple/pimple", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", - "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1 || ^2.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^5.4@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Pimple": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Pimple, a simple Dependency Injection Container", - "homepage": "https://pimple.symfony.com", - "keywords": [ - "container", - "dependency injection" - ], - "support": { - "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" - }, - "time": "2021-10-28T11:13:42+00:00" - }, { "name": "rector/rector", - "version": "1.1.0", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "556509e2dcf527369892b7d411379c4a02f31859" + "reference": "044e6364017882d1e346da8690eeabc154da5495" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/556509e2dcf527369892b7d411379c4a02f31859", - "reference": "556509e2dcf527369892b7d411379c4a02f31859", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/044e6364017882d1e346da8690eeabc154da5495", + "reference": "044e6364017882d1e346da8690eeabc154da5495", "shasum": "" }, "require": { @@ -13773,7 +13856,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/1.1.0" + "source": "https://github.com/rectorphp/rector/tree/1.2.2" }, "funding": [ { @@ -13781,7 +13864,7 @@ "type": "github" } ], - "time": "2024-05-18T09:40:27+00:00" + "time": "2024-07-25T07:44:34+00:00" }, { "name": "sebastian/cli-parser", @@ -14701,16 +14784,16 @@ }, { "name": "spatie/backtrace", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9", "shasum": "" }, "require": { @@ -14748,7 +14831,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.6.1" + "source": "https://github.com/spatie/backtrace/tree/1.6.2" }, "funding": [ { @@ -14760,20 +14843,20 @@ "type": "other" } ], - "time": "2024-04-24T13:22:11+00:00" + "time": "2024-07-22T08:21:24+00:00" }, { "name": "spatie/error-solutions", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/spatie/error-solutions.git", - "reference": "202108314a6988ede156fba1b3ea80a784c1734a" + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/202108314a6988ede156fba1b3ea80a784c1734a", - "reference": "202108314a6988ede156fba1b3ea80a784c1734a", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/ae7393122eda72eed7cc4f176d1e96ea444f2d67", + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67", "shasum": "" }, "require": { @@ -14826,7 +14909,7 @@ ], "support": { "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.0.0" + "source": "https://github.com/spatie/error-solutions/tree/1.1.1" }, "funding": [ { @@ -14834,20 +14917,20 @@ "type": "github" } ], - "time": "2024-06-12T14:49:54+00:00" + "time": "2024-07-25T11:06:04+00:00" }, { "name": "spatie/flare-client-php", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234" + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/097040ff51e660e0f6fc863684ac4b02c93fa234", - "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", "shasum": "" }, "require": { @@ -14865,7 +14948,7 @@ "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + "spatie/pest-plugin-snapshots": "^1.0|^2.0" }, "type": "library", "extra": { @@ -14895,7 +14978,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.7.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.8.0" }, "funding": [ { @@ -14903,7 +14986,7 @@ "type": "github" } ], - "time": "2024-06-12T14:39:14+00:00" + "time": "2024-08-01T08:27:26+00:00" }, { "name": "spatie/ignition", @@ -15081,16 +15164,16 @@ }, { "name": "spatie/laravel-ray", - "version": "1.36.2", + "version": "1.37.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ray.git", - "reference": "1852faa96e5aa6778ea3401ec3176eee77268718" + "reference": "c2bedfd1172648df2c80aaceb2541d70f1d9a5b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/1852faa96e5aa6778ea3401ec3176eee77268718", - "reference": "1852faa96e5aa6778ea3401ec3176eee77268718", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/c2bedfd1172648df2c80aaceb2541d70f1d9a5b9", + "reference": "c2bedfd1172648df2c80aaceb2541d70f1d9a5b9", "shasum": "" }, "require": { @@ -15104,7 +15187,7 @@ "spatie/backtrace": "^1.0", "spatie/ray": "^1.41.1", "symfony/stopwatch": "4.2|^5.1|^6.0|^7.0", - "zbateson/mail-mime-parser": "^1.3.1|^2.0" + "zbateson/mail-mime-parser": "^1.3.1|^2.0|^3.0" }, "require-dev": { "guzzlehttp/guzzle": "^7.3", @@ -15152,7 +15235,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-ray/issues", - "source": "https://github.com/spatie/laravel-ray/tree/1.36.2" + "source": "https://github.com/spatie/laravel-ray/tree/1.37.1" }, "funding": [ { @@ -15164,7 +15247,7 @@ "type": "other" } ], - "time": "2024-05-02T08:26:02+00:00" + "time": "2024-07-12T12:35:17+00:00" }, { "name": "spatie/macroable", @@ -15303,16 +15386,16 @@ }, { "name": "symfony/polyfill-iconv", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f" + "reference": "c027e6a3c6aee334663ec21f5852e89738abc805" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", - "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/c027e6a3c6aee334663ec21f5852e89738abc805", + "reference": "c027e6a3c6aee334663ec21f5852e89738abc805", "shasum": "" }, "require": { @@ -15363,7 +15446,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.30.0" }, "funding": [ { @@ -15379,7 +15462,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/stopwatch", @@ -15554,30 +15637,31 @@ }, { "name": "zbateson/mail-mime-parser", - "version": "2.4.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/zbateson/mail-mime-parser.git", - "reference": "ff49e02f6489b38f7cc3d1bd3971adc0f872569c" + "reference": "9a240522ae5e4eaeb7bf72c9bc88fe89dfb014a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/ff49e02f6489b38f7cc3d1bd3971adc0f872569c", - "reference": "ff49e02f6489b38f7cc3d1bd3971adc0f872569c", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/9a240522ae5e4eaeb7bf72c9bc88fe89dfb014a3", + "reference": "9a240522ae5e4eaeb7bf72c9bc88fe89dfb014a3", "shasum": "" }, "require": { - "guzzlehttp/psr7": "^1.7.0|^2.0", - "php": ">=7.1", - "pimple/pimple": "^3.0", - "zbateson/mb-wrapper": "^1.0.1", - "zbateson/stream-decorators": "^1.0.6" + "guzzlehttp/psr7": "^2.5", + "php": ">=8.0", + "php-di/php-di": "^6.0|^7.0", + "psr/log": "^1|^2|^3", + "zbateson/mb-wrapper": "^2.0", + "zbateson/stream-decorators": "^2.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "*", - "mikey179/vfsstream": "^1.6.0", + "monolog/monolog": "^2|^3", "phpstan/phpstan": "*", - "phpunit/phpunit": "<10" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-iconv": "For best support/performance", @@ -15625,24 +15709,24 @@ "type": "github" } ], - "time": "2024-04-28T00:58:54+00:00" + "time": "2024-05-01T16:49:29+00:00" }, { "name": "zbateson/mb-wrapper", - "version": "1.2.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/zbateson/mb-wrapper.git", - "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f" + "reference": "9e4373a153585d12b6c621ac4a6bb143264d4619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/09a8b77eb94af3823a9a6623dcc94f8d988da67f", - "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/9e4373a153585d12b6c621ac4a6bb143264d4619", + "reference": "9e4373a153585d12b6c621ac4a6bb143264d4619", "shasum": "" }, "require": { - "php": ">=7.1", + "php": ">=8.0", "symfony/polyfill-iconv": "^1.9", "symfony/polyfill-mbstring": "^1.9" }, @@ -15686,7 +15770,7 @@ ], "support": { "issues": "https://github.com/zbateson/mb-wrapper/issues", - "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.1" + "source": "https://github.com/zbateson/mb-wrapper/tree/2.0.0" }, "funding": [ { @@ -15694,31 +15778,31 @@ "type": "github" } ], - "time": "2024-03-18T04:31:04+00:00" + "time": "2024-03-20T01:38:07+00:00" }, { "name": "zbateson/stream-decorators", - "version": "1.2.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/zbateson/stream-decorators.git", - "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9" + "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/783b034024fda8eafa19675fb2552f8654d3a3e9", - "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/32a2a62fb0f26313395c996ebd658d33c3f9c4e5", + "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5", "shasum": "" }, "require": { - "guzzlehttp/psr7": "^1.9 | ^2.0", - "php": ">=7.2", - "zbateson/mb-wrapper": "^1.0.0" + "guzzlehttp/psr7": "^2.5", + "php": ">=8.0", + "zbateson/mb-wrapper": "^2.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "*", "phpstan/phpstan": "*", - "phpunit/phpunit": "<10.0" + "phpunit/phpunit": "^9.6|^10.0" }, "type": "library", "autoload": { @@ -15749,7 +15833,7 @@ ], "support": { "issues": "https://github.com/zbateson/stream-decorators/issues", - "source": "https://github.com/zbateson/stream-decorators/tree/1.2.1" + "source": "https://github.com/zbateson/stream-decorators/tree/2.1.1" }, "funding": [ { @@ -15757,7 +15841,7 @@ "type": "github" } ], - "time": "2023-05-30T22:51:52+00:00" + "time": "2024-04-29T21:42:39+00:00" } ], "aliases": [], diff --git a/config/filesystems.php b/config/filesystems.php index 617e720ec..384e88a90 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -46,6 +46,8 @@ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), + 'visibility' => env('LOCAL_FILESYSTEM_VISIBILITY', 'private'), + 'directory_visibility' => env('LOCAL_FILESYSTEM_VISIBILITY', 'private'), ], 'public' => [ @@ -64,6 +66,7 @@ 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', true), + 'temporary_url_rewrites' => json_decode(env('AWS_TEMPORARY_URL_REWRITES', '{}'), true), ], ], diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..ea9e5dde2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,68 @@ +--- +services: + api: &api + image: jhumanj/opnform-api:latest + environment: + DB_HOST: db + REDIS_HOST: redis + + DB_DATABASE: ${DB_DATABASE:-forge} + DB_USERNAME: ${DB_USERNAME:-forge} + DB_PASSWORD: ${DB_PASSWORD:-forge} + DB_CONNECTION: ${DB_CONNECTION:-pgsql} + LOG_LEVEL: ${LOG_LEVEL:-debug} + LOG_CHANNEL: ${LOG_CHANNEL:-errorlog} + AWS_ENDPOINT: http://minio:9000 + AWS_ACCESS_KEY_ID: ${MINIO_ACCESS_KEY:-minio} + AWS_SECRET_ACCESS_KEY: ${MINIO_SECRET_KEY:-minio123} + FILESYSTEM_DISK: local + AWS_REGION: eu-west-1 + AWS_BUCKET: laravel-bucket + LOCAL_FILESYSTEM_VISIBILITY: public + FRONT_URL: ${FRONT_URL:-http://localhost} + env_file: ./.env + volumes: + - laravel-persist:/persist + - secrets-config:/secrets + + api-worker: + <<: *api + command: ./artisan queue:work + + ui: + image: jhumanj/opnform-ui:latest + environment: + NUXT_PUBLIC_APP_URL: ${NUXT_PUBLIC_APP_URL:-/} + NUXT_PUBLIC_API_BASE: ${NUXT_PUBLIC_API_BASE:-/api} + NUXT_PRIVATE_API_BASE: http://ingress/api + env_file: + - ./client/.env + volumes: + - secrets-config:/secrets + - ./client/.env:/app/.env + + + + redis: + image: redis:7 + + db: + image: postgres:16 + environment: + POSTGRES_DB: ${DB_DATABASE:-forge} + POSTGRES_USER: ${DB_USERNAME:-forge} + POSTGRES_PASSWORD: ${DB_PASSWORD:-forge} + volumes: + - postgres-data:/var/lib/postgresql/data + + ingress: + image: nginx:1 + volumes: + - ./docker/nginx.conf:/etc/nginx/templates/default.conf.template + ports: + - 80:80 + +volumes: + laravel-persist: + postgres-data: + secrets-config: diff --git a/docker/Dockerfile.api b/docker/Dockerfile.api new file mode 100644 index 000000000..318caa45d --- /dev/null +++ b/docker/Dockerfile.api @@ -0,0 +1,49 @@ +FROM php:8.3-fpm + +# syntax=docker/dockerfile:1.3-labs + +RUN apt-get update && apt-get install -y libzip-dev libpng-dev postgresql-client libpq-dev && apt-get clean + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer +ENV COMPOSER_ALLOW_SUPERUSER=1 +RUN docker-php-ext-install pdo pgsql pdo_pgsql gd bcmath zip && pecl install redis && docker-php-ext-enable redis + + +WORKDIR /usr/share/nginx/html/ +ADD composer.json composer.lock artisan ./ + +# NOTE: The project would build more reliably if all php files were added before running +# composer install. This would though introduce a dependency which would cause every +# dependency to be re-installed each time any php file is edited. It may be necessary in +# future to remove this 'optimisation' by moving the `RUN composer install` line after all +# the following ADD commands. + +# Running artisan requires the full php app to be installed so we need to remove the +# post-autoload command from the composer file if we want to run composer without +# adding a dependency to all the php files. +RUN sed 's_@php artisan package:discover_/bin/true_;' -i composer.json +ADD app/helpers.php app/helpers.php +RUN composer install --ignore-platform-req=php + +ADD app ./app +ADD bootstrap ./bootstrap +ADD config ./config +ADD database ./database +ADD public public +ADD routes routes +ADD tests tests +ADD resources resources +ADD storage ./storage +RUN chmod 777 -R storage + +# Manually run the command we deleted from composer.json earlier +RUN php artisan package:discover --ansi + +COPY docker/php-fpm-entrypoint /usr/local/bin/opnform-entrypoint +COPY docker/generate-api-secret.sh /usr/local/bin/ +RUN ln -s /secrets/api.env .env + +RUN chmod a+x /usr/local/bin/* + +ENTRYPOINT [ "/usr/local/bin/opnform-entrypoint" ] +CMD php-fpm diff --git a/docker/Dockerfile.client b/docker/Dockerfile.client new file mode 100644 index 000000000..97930e47f --- /dev/null +++ b/docker/Dockerfile.client @@ -0,0 +1,34 @@ +FROM node:20-alpine AS javascript-builder +WORKDIR /app + +# It's best to add as few files as possible before running the build commands +# as they will be re-run everytime one of those files changes. +# +# It's possible to run npm install with only the package.json and package-lock.json file. + +ADD ./client/package.json ./client/package-lock.json ./ + +# Install git and other necessary build tools +RUN apk add --no-cache git + +# Clear npm cache, remove existing node_modules, and install dependencies +RUN npm cache clean --force && \ + rm -rf node_modules && \ + npm install + +# Explicitly install the correct version of esbuild +# RUN npm install esbuild@0.21.5 + +ADD ./client/ /app/ +RUN npm run build + +FROM node:20-alpine +WORKDIR /app +COPY --from=javascript-builder /app/.output/ /app/ +RUN ls /app/ +RUN ln -s /secrets/client.env .env +ADD ./docker/node-entrypoint /entrypoint.sh +RUN chmod a+x /entrypoint.sh + +ENTRYPOINT [ "/entrypoint.sh" ] +CMD [ "node", "./server/index.mjs" ] diff --git a/docker/generate-api-secret.sh b/docker/generate-api-secret.sh index e33ed58f0..7ea95ed21 100644 --- a/docker/generate-api-secret.sh +++ b/docker/generate-api-secret.sh @@ -1,20 +1,21 @@ #!/bin/bash -e main() { - ( flock -n 100 || wait_for_other_instance; generate_api_secrets) 100> /var/lock/api_secret.lock + generate_api_secrets } generate_api_secrets() { if ! is_configured; then + echo "Generating shared secret..." SECRET="$(random_string)" - add_secret_to_env_file /app/client/.env NUXT_API_SECRET "$SECRET" - add_secret_to_env_file /app/.env FRONT_API_SECRET "$SECRET" + add_secret_to_env_file /secrets/client.env NUXT_API_SECRET "$SECRET" + add_secret_to_env_file /secrets/api.env FRONT_API_SECRET "$SECRET" fi } random_string() { array=() - for i in {a..z} {A..Z} {0..9}; + for i in {a..z} {A..Z} {0..9}; do array[$RANDOM]=$i done @@ -27,21 +28,15 @@ add_secret_to_env_file() { VAR=$2 VAL=$3 - grep "^$VAR=" "$FILE" || ( echo "$VAR=" >> "$FILE" ) + grep -q "^$VAR=" "$FILE" 2>/dev/null || ( echo "$VAR=" >> "$FILE" ) cp $FILE $TEMP_FILE sed "s/^$VAR=.*$/$VAR=$VAL/" -i $TEMP_FILE cat $TEMP_FILE > $FILE } -wait_for_other_instance() { - while ! is_configured; do - sleep 1; - done -} - is_configured() { - grep -q "FRONT_API_SECRET=.\+" /app/.env + grep -q "FRONT_API_SECRET=.\+" .env 2>/dev/null } main diff --git a/docker/nginx.conf b/docker/nginx.conf index 31b28ed23..746ee8e88 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -14,32 +14,27 @@ server { index index.html index.htm index.php; location / { - proxy_pass http://localhost:3000; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Port $server_port; + proxy_http_version 1.1; + proxy_pass http://ui:3000; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; } - location /api/ { - set $original_uri $uri; - try_files $uri $uri/ /index.php$is_args$args; - } - - location /local/temp/ { - set $original_uri $uri; - try_files $uri $uri/ /index.php$is_args$args; - } - - location /forms/assets/ { + location ~/(api|open|local\/temp|forms\/assets)/ { set $original_uri $uri; try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; - fastcgi_pass unix:/var/run/php-fpm-opnform-site.sock; + fastcgi_pass api:9000; fastcgi_index index.php; - include fastcgi.conf; + include fastcgi_params; + #fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/$fastcgi_script_name; + fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/public/index.php; fastcgi_param REQUEST_URI $api_uri; } } diff --git a/docker/node-entrypoint b/docker/node-entrypoint new file mode 100644 index 000000000..7ce865c38 --- /dev/null +++ b/docker/node-entrypoint @@ -0,0 +1,30 @@ +#!/bin/sh + +main() { + if [ "$1" == "bash" ]; then + "$@" + else + wait_for_api_secret + if [ ! -f .env ] && [ -f /secrets/client.env ]; then + ln -sf /secrets/client.env .env + fi + if [ -f .env ]; then + . .env + else + echo "Warning: .env file not found" + fi + run_server "$@" + fi +} +wait_for_api_secret() { + until [ -f /secrets/configured ]; do + echo "Waiting for api secret..." + sleep 1 + done +} +run_server() { + echo "Running " node "$@" + "$@" +} + +main "$@" diff --git a/docker/nuxt-wrapper.sh b/docker/nuxt-wrapper.sh deleted file mode 100644 index 8eb246c99..000000000 --- a/docker/nuxt-wrapper.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -e - -echo + . ~nuxt/.nvm/nvm.sh -. ~nuxt/.nvm/nvm.sh - -echo + nvm install --no-progress 20 -nvm install --no-progress 20 -echo + nvm use 20 -nvm use 20 - -cd /app/nuxt/server/ - -export NUXT_PRIVATE_API_BASE=http://localhost/api - -echo + . /app/client/.env -[ -f /app/client/.env ] && . /app/client/.env || echo "Environment file missing!" - -[ "x$NUXT_API_SECRET" != "x" ] || ( - echo + generate-api-secret.sh - generate-api-secret.sh -) - -echo + eval \$\(sed 's/^/export /' \< /app/client/.env\) -eval $(sed 's/^/export /' < /app/client/.env) - -echo + node index.mjs -node index.mjs diff --git a/docker/php-fpm-entrypoint b/docker/php-fpm-entrypoint new file mode 100644 index 000000000..aab78ee4a --- /dev/null +++ b/docker/php-fpm-entrypoint @@ -0,0 +1,115 @@ +#!/bin/bash + +main() { + read_env + prep_file_permissions + prep_storage + if is_master "$@"; then + prep_laravel_secrets + wait_for_db + apply_db_migrations + run_init_project + mark_ready + else + wait_for_ready + wait_for_db + fi + read_env + run_server "$@" +} +is_master() { + echo "$@" | grep -q php-fpm +} + +read_env() { + #set +x + [ -f .env ] || touch .env + . .env + #set -x +} +prep_file_permissions() { + chmod a+x ./artisan +} + +prep_laravel_secrets() { + read_env + + [ "x$APP_KEY" != "x" ] || { + echo "Generating Laravel key..." + grep -q "APP_KEY=" .env || { + echo "APP_KEY=" >> .env + } + ./artisan key:generate + read_env + } + [ "x$JWT_SECRET" != "x" ] || { + echo "Generating Laravel Secret..." + ./artisan jwt:secret -f + read_env + } + + [ "x$FRONT_API_SECRET" != "x" ] || { + echo "Generating Shared Client Secret..." + /usr/local/bin/generate-api-secret.sh + read_env + } + echo "Done with secrets" +} + +apply_db_migrations() { + echo "Running DB Migrations" + ./artisan migrate +} + +run_init_project() { + echo "Running app:init-project command" + ./artisan app:init-project +} + +wait_for_ready() { + echo "Checking keys have been generated" + until [ -f /secrets/configured ]; do + sleep 1; + echo "Waiting for keys to generate" + done +} + +mark_ready() { + touch /secrets/configured +} + +wait_for_db() { + until ./artisan migrate:status 2>&1 | grep -q -E "(Migration table not found|Migration name)"; do + echo "Waiting for DB to bootup" + sleep 1 + done +} + +run_server() { + echo "Booting $@" + read_env + /usr/local/bin/docker-php-entrypoint "$@" +} + +prep_storage() { + [ -L storage ] || { + echo "Backing up initial storage directory" + rm -rf /etc/initial-storage + mv ./storage /etc/initial-storage + } + + [ -d /persist/storage ] || { + echo "Initialising blank storage dir" + mkdir -p /persist + cp -a /etc/initial-storage /persist/storage + chmod 777 -R /persist/storage + } + + touch /var/log/opnform.log + chown www-data /var/log/opnform.log + + echo "Linking persistent storage into app" + ln -t . -sf /persist/storage +} + +main "$@" diff --git a/docker/php-fpm-wrapper.sh b/docker/php-fpm-wrapper.sh deleted file mode 100644 index 13186db64..000000000 --- a/docker/php-fpm-wrapper.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -ex - -[ -L /app/storage ] || { - echo "Backing up initial storage directory" - rm -rf /etc/initial-storage - mv /app/storage /etc/initial-storage -} - -[ -d /persist/storage ] || { - echo "Initialising blank storage dir" - mkdir -p /persist - cp -a /etc/initial-storage /persist/storage - chmod 777 -R /persist/storage -} - -touch /var/log/opnform.log -chown opnform /var/log/opnform.log - -echo "Linking persistent storage into app" -ln -t /app -sf /persist/storage - -read_env() { - set +x - . /app/.env - set -x -} -read_env - -[ "x$APP_KEY" != "x" ] || { - artisan key:generate - read_env -} -[ "x$JWT_SECRET" != "x" ] || { - artisan jwt:secret -f - read_env -} - -[ "x$FRONT_API_SECRET" != "x" ] || { - generate-api-secret.sh - read_env -} - -/usr/sbin/php-fpm8.1 - -tail -f /var/log/opnform.log diff --git a/docker/php-fpm.conf b/docker/php-fpm.conf deleted file mode 100644 index c40aa1894..000000000 --- a/docker/php-fpm.conf +++ /dev/null @@ -1,18 +0,0 @@ -[opnform] -user = opnform -group = opnform -listen = /var/run/php-fpm-opnform-site.sock -listen.owner = www-data -listen.group = www-data -php_admin_value[disable_functions] = exec,passthru,shell_exec,system -php_admin_flag[allow_url_fopen] = off -php_admin_value[error_log] = /var/log/opnform.log -; Choose how the process manager will control the number of child processes. -pm = dynamic -pm.max_children = 75 -pm.start_servers = 10 -pm.min_spare_servers = 5 -pm.max_spare_servers = 20 -pm.process_idle_timeout = 10s -clear_env = no - diff --git a/docker/postgres-wrapper.sh b/docker/postgres-wrapper.sh deleted file mode 100644 index 083d5171a..000000000 --- a/docker/postgres-wrapper.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -ex - -DATA_DIR=/persist/pgsql/data -CONFIG_FILE=/etc/postgresql/postgresql.conf -PG_BASE=/usr/lib/postgresql/15/ - -touch $CONFIG_FILE - -mkdir -p $DATA_DIR -chown postgres -R $DATA_DIR -chmod 0700 $DATA_DIR - -set +x -. /app/.env -set -x - -test -f $DATA_DIR/postgresql.conf || NEW_DB=true - -if [ "x$NEW_DB" != "x" ]; then - echo "No database files found. Initialising blank database" - sudo -u postgres $PG_BASE/bin/initdb -D $DATA_DIR -fi -sudo -u postgres $PG_BASE/bin/postgres -D $DATA_DIR -c config_file=$CONFIG_FILE & - -wait_for_database_to_be_ready() { - while ! (echo "select version()" | psql -U $DB_USERNAME); do - echo "Waiting 5 seconds for the database to come up" - sleep 5; - done -} - -if [ "x$NEW_DB" != "x" ]; then - echo "Creating database users" - wait_for_database_to_be_ready - psql -U postgres < 'auth:api'], function () { - Route::post('logout', [LoginController::class, 'logout']); + Route::post('logout', [LoginController::class, 'logout'])->name('logout'); + Route::post('update-credentials', [ProfileController::class, 'updateAdminCredentials'])->name('credentials.update'); Route::get('user', [UserController::class, 'current'])->name('user.current'); Route::delete('user', [UserController::class, 'deleteAccount']); @@ -252,7 +253,7 @@ }); Route::group(['middleware' => 'guest:api'], function () { - Route::post('login', [LoginController::class, 'login']); + Route::post('login', [LoginController::class, 'login'])->name('login'); Route::post('register', [RegisterController::class, 'register']); Route::post('password/email', [ForgotPasswordController::class, 'sendResetLinkEmail']);