diff --git a/.circleci/config.yml b/.circleci/config.yml index 4814a20c..dd679467 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -95,7 +95,7 @@ commands: if [[ $DRUPAL_ADMIN_PWD == *"not_secure_used_only_locally"* ]] \ || [[ $DRUPAL_CLIENT_SECRET == *"not_secure_used_only_locally"* ]] \ || [[ $DRUPAL_REVALIDATE_SECRET == *"not_secure_used_only_locally"* ]] \ - || [[ $NEXTAUTH_SECRET == *"not_secure_used_only_locally"* ]]; then + || [[ $AUTH_SECRET == *"not_secure_used_only_locally"* ]]; then echo echo "Example secrets detected in configuration, failing build." echo @@ -138,6 +138,7 @@ commands: next_domain=$next_release_name.$project_name.$CLUSTER_DOMAIN drupal_client_id=drupal-client-id drupal_client_viewer_id=drupal-client-viewer-id + elasticsearch_host=$drupal_release_name-es.$project_name if [ next_domain == "main-next" ]; then next_domain=$project_name.$CLUSTER_DOMAIN @@ -146,9 +147,10 @@ commands: echo "export NEXT_PUBLIC_DRUPAL_BASE_URL=https://$drupal_domain" >> "$BASH_ENV" echo "export NEXT_IMAGE_DOMAIN=$drupal_domain" >> "$BASH_ENV" echo "export NEXT_PUBLIC_FRONTEND_URL=https://$next_domain" >> "$BASH_ENV" - echo "export NEXTAUTH_URL=https://$next_domain" >> "$BASH_ENV" + echo "export AUTH_URL=https://$next_domain" >> "$BASH_ENV" echo "export DRUPAL_CLIENT_ID=$drupal_client_id" >> "$BASH_ENV" echo "export DRUPAL_CLIENT_VIEWER_ID=$drupal_client_viewer_id" >> "$BASH_ENV" + echo "export ES_HOST=$elasticsearch_host" >> "$BASH_ENV" echo "Expanding special variable DRUPAL_DOMAIN = $drupal_domain ..." sed -i -e "s/<|DRUPAL_DOMAIN|>/$drupal_domain/g" $envvars_file @@ -158,20 +160,23 @@ commands: echo "Expanding special variable DRUPAL_CLIENT_ID = $drupal_client_id ..." sed -i -e "s/<|DRUPAL_CLIENT_ID|>/$drupal_client_id/g" $envvars_file + + echo "Expanding special variable ES_HOST = $elasticsearch_host ..." + sed -i -e "s/<|ES_HOST|>/$elasticsearch_host/g" $envvars_file echo "Expanding special variable DRUPAL_CLIENT_VIEWER_ID = $drupal_client_viewer_id ..." sed -i -e "s/<|DRUPAL_CLIENT_VIEWER_ID|>/$drupal_client_viewer_id/g" $envvars_file - echo "Expanding secrets DRUPAL_CLIENT_SECRET, DRUPAL_REVALIDATE_SECRET, NEXTAUTH_SECRET & HASHSALT = ..." + echo "Expanding secrets DRUPAL_CLIENT_SECRET, DRUPAL_REVALIDATE_SECRET, AUTH_SECRET & HASHSALT = ..." escaped_drupal_revalidate_secret=$(printf '%s\n' "$DRUPAL_REVALIDATE_SECRET" | sed -e 's/[\/&]/\\&/g') escaped_drupal_client_secret=$(printf '%s\n' "$DRUPAL_CLIENT_SECRET" | sed -e 's/[\/&]/\\&/g') escaped_drupal_client_viewer_secret=$(printf '%s\n' "$DRUPAL_CLIENT_VIEWER_SECRET" | sed -e 's/[\/&]/\\&/g') - escaped_nextauth_secret=$(printf '%s\n' "$NEXTAUTH_SECRET" | sed -e 's/[\/&]/\\&/g') + escaped_nextauth_secret=$(printf '%s\n' "$AUTH_SECRET" | sed -e 's/[\/&]/\\&/g') escaped_hashsalt=$(printf '%s\n' "$HASHSALT" | sed -e 's/[\/&]/\\&/g') sed -i -e "s/\${DRUPAL_CLIENT_SECRET}/$escaped_drupal_client_secret/g" $envvars_file sed -i -e "s/\${DRUPAL_CLIENT_VIEWER_SECRET}/$escaped_drupal_client_viewer_secret/g" $envvars_file sed -i -e "s/\${DRUPAL_REVALIDATE_SECRET}/$escaped_drupal_revalidate_secret/g" $envvars_file - sed -i -e "s/\${NEXTAUTH_SECRET}/$escaped_nextauth_secret/g" $envvars_file + sed -i -e "s/\${AUTH_SECRET}/$escaped_nextauth_secret/g" $envvars_file sed -i -e "s/\${HASHSALT}/$escaped_hashsalt/g" $envvars_file echo "Expanding special variable DRUPAL_ADMIN_PWD = ..." diff --git a/.ddev/config.yaml b/.ddev/config.yaml index e5e14df0..4e62e1e0 100644 --- a/.ddev/config.yaml +++ b/.ddev/config.yaml @@ -36,11 +36,14 @@ web_environment: - NEXT_IMAGE_DOMAIN=next-drupal-starterkit.ddev.site - NEXT_PUBLIC_FRONTEND_URL=https://next-drupal-starterkit.ddev.site:3000 # Environment variables for next_auth: - - NEXTAUTH_SECRET=nextauth_secret_not_secure_used_only_locally - - NEXTAUTH_URL=https://next-drupal-starterkit.ddev.site:3000 - - # Environment variables for redis + - AUTH_SECRET=nextauth_secret_not_secure_used_only_locally + - AUTH_TRUST_HOST=true + - AUTH_URL=https://next-drupal-starterkit.ddev.site:3000 + # Environment variables for redis - REDIS_HOST=redis - REDIS_PASS=redis + # Environment variables for elasticsearch + - ES_HOST=elasticsearch corepack_enable: false web_extra_exposed_ports: diff --git a/.gitignore b/.gitignore index e644852e..939c4ed6 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ node_modules # Ignore start.sh script status file .last_successful_command_ddev .last_successful_command_lando + +Makefile diff --git a/.lando.yml b/.lando.yml index cbf1f8f0..cf1aac1f 100644 --- a/.lando.yml +++ b/.lando.yml @@ -48,10 +48,12 @@ tooling: user: www-data cmd: - appserver: "php /app/drupal/vendor/bin/phpunit -c /app/drupal/phpunit.xml --testdox" + regenerate-phpunit-config: description: "Regenerates fresh PHPUnit configuration." cmd: - appserver: /app/.lando/phpunit.sh + xdebug: description: "Loads Xdebug in the selected mode" cmd: @@ -153,10 +155,16 @@ services: NEXT_IMAGE_DOMAIN: next-drupal-starterkit.lndo.site NEXT_PUBLIC_FRONTEND_URL: https://frontend.lndo.site # Environment variables for next_auth: - NEXTAUTH_SECRET: nextauth_secret_not_secure_used_only_locally - NEXTAUTH_URL: https://frontend.lndo.site + # Environment variables for next_auth: + AUTH_SECRET: nextauth_secret_not_secure_used_only_locally + AUTH_TRUST_HOST: true + AUTH_URL: https://frontend.lndo.site REDIS_HOST: redis REDIS_PASS: "mypassword" + + ES_HOST: elasticsearch + # To enable nesh cache debugging + # NEXT_PRIVATE_DEBUG_CACHE: 1 build: - "cd next && npm ci" scanner: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cca9542..610953c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,49 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/). +## [3.0.0] 22.11.2024 + +New major release! ๐ŸŽ‰ + +Major kudos to @jekku123 that has done 99% of the work for this! ๐Ÿฅ‡ + +- Switch from "pages router" to "app router" in Next.js +- Update to drupal 10.3.9 +- Update contrib modules +- Update to latest version of next-drupal (beta2) both Drupal module and npm package +- Switch to Auth.js for authentication +- Changes to drupalClient to extend NextDrupalBase +- Switch to next-intl +- Refinements for the redis integration +- Implementation of Draft Mode +- Directory refactoring in the /next subfolder +- Revamped search functionality using searchkit +- Added dark mode + +## [2.7.0] 19.11.2024 + +- Add swrDelta config option for CDNs by @joshua-scott +- Bump webpack from 5.93.0 to 5.94.0 in /next by @dependabot +- NEX-172: Fix preview of previous revisions of nodes by @vermario +- NEX-173: Redirect to current page after exiting preview by @jekku123 +- NEX-174: Do not return anything from the api preview route by @vermario +- NEX-175: Add the possibility of running npx commands in lando by @vermario +- NEX-170: Make example content even more clearly example content by @vermario +- NEX-171: Upgrade the graphql_compose contrib module to version 2.2.1 by @vermario + +## [2.6.0] 10.8.2024 + +- Cleanup and simplify Drupal clients by @joshua-scott +- Bump ws from 8.17.0 to 8.17.1 in /next by @dependabot +- Bump braces from 3.0.2 to 3.0.3 in /drupal by @dependabot +- Update npm packages + Storybook config by @joshua-scott +- Caching Search results by @micahsuomi +- NEX-101: Improve data fetching and error handling by @joshua-scott +- NEX-101: Sitemap.xml improvements by @joshua-scott +- NEX-104: Add Redis for frontend caching by @vermario +- NEX-165: Add patch to graphql_compose to allow for nodes with unpublished translations by @vermario +- NEX-164: Upgrade to drupal 10.3.2, update contrib modules by @vermario + ## [2.5.0] 10.6.2024 - Add DDEV support diff --git a/README.md b/README.md index 3ebd15e4..040315a7 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ This is a starter template created by [Wunder](https://www.wunder.io) for a decoupled website using the open-source [Next.js for Drupal](https://next-drupal.org/) project by [Chapter Three](https://www.chapterthree.com) and contributors. +> โš ๏ธโš ๏ธ **Now using the App router in Next.js!** ๐ŸŽ‰ If you prefer using the pages router, we have kept the old version in the `pages-router` branch. + ## ๐Ÿช‚ Check out the running demo at https://next-drupal-starterkit.dev.wdr.io ! The aims of this template are: @@ -54,7 +56,8 @@ Follow this guide to get the backend and frontend up and running. You can either ```bash ./setup-lando.sh ``` -or + +or ```bash ./setup-ddev.sh @@ -78,9 +81,9 @@ After the setup is complete, you can access the site at the following URLs: Lando has two separate containers for the backend and frontend, so the URLs are different: -| Backend | Frontend | -|--|--| -| https://next-drupal-starterkit.lndo.site/ | https://frontend.lndo.site/ | +| Backend | Frontend | +| ----------------------------------------- | --------------------------- | +| https://next-drupal-starterkit.lndo.site/ | https://frontend.lndo.site/ | You can get a more detailed list of all the services and their urls with the command: @@ -92,9 +95,11 @@ lando info DDEV has a single container for both the backend and frontend, so the URLs differ only by the port: -| Backend | Frontend | -|--|--| -| https://next-drupal-starterkit.ddev.site| https://next-drupal-starterkit.ddev.site:3000 | +| Backend | Frontend | +| ---------------------------------------- | --------------------------------------------- | +| https://next-drupal-starterkit.ddev.site | https://next-drupal-starterkit.ddev.site:3000 | + +> NOTE: localhost:3000 does not work in DDEV, you need to use the URL provided by DDEV above. You can get a more detailed list of all the services and their urls with the command: @@ -108,7 +113,7 @@ We try to add to the template what we think are the most commonly requested feat ### Preview mode -The template is set up to allow editors to use [Preview mode](https://next-drupal.org/docs/reference/preview). Visit the node page on the Drupal side while the frontend is running to see a preview of the page. +The template is set up to allow editors to use [Draft mode](https://nextjs.org/docs/app/building-your-application/configuring/draft-mode). Visit the node page on the Drupal side while the frontend is running to see a preview of the page. ### On-demand revalidation @@ -122,10 +127,10 @@ The Next.js site will then create the metatags using a combination of these two ### Search indexing and frontend search interface The site is set up to work with Elasticsearch to provide a complete search experience. -The Lando setup includes spinning up an Elasticsearch instance with the required plugins. The content normalization and index handling is managed via the custom `wunder_search` module, which in turn makes use of the [Elasticsearch helper Drupal contrib module](https://www.drupal.org/project/elasticsearch_helper). +Both the Lando and DDEV setups include spinning up an Elasticsearch instance with the required plugins. The content normalization and index handling is managed via the custom `wunder_search` module, which in turn makes use of the [Elasticsearch helper Drupal contrib module](https://www.drupal.org/project/elasticsearch_helper). On the frontend side, the search user uses the [Elastic UI library](https://elastic.github.io/eui/). The frontend site queries Elasticsearch via a simple proxy controller in Drupal, also provided by the included `wunder_search` custom Drupal module. -The lando setup also includes [ElasticVue](https://elasticvue.com/), a tool to help you manage your Elasticsearch indexes. +The included frontend search UI is provided by [Searchkit](https://www.searchkit.co/). ### Importable demo content @@ -133,8 +138,8 @@ The template includes a Drupal migration to populate the site with a set of tran ### Multilanguage setup -This template is set up to use three languages: English (default), Finnish and Swedish. These languages are added in Drupal using the usual translation modules, and to the frontend using the [next-i18next](https://github.com/i18next/next-i18next) npm package. -The indexing in Elasticsearch takes into consideration the language of the content for analysis. The interface is translated. (Note: translations have mostly been done with Google Translate, so don't expect perfect Finnish or Swedish... or English for that matter. ๐Ÿ™‚ ) +This template is set up to use three languages: English (default), Finnish, and Swedish. These languages are added in Drupal using the standard translation modules and integrated into the frontend using the [Next-Intl](https://next-intl-docs.vercel.app/) module. +The Elasticsearch indexing takes the content language into account for analysis, and the interface is fully translated. (Note: Most translations were done using Google Translate, so please expect some inaccuracies in Finnish, Swedish, and even English. ๐Ÿ™‚) ### Webforms @@ -151,7 +156,7 @@ If the backend is not available momentarily, the frontend will try again to call ### Frontend user authentication and registration -The template includes the setup to allow users to log into the Drupal backend from the Next.js frontend, using [Next-Auth](https://next-auth.js.org/). +The template includes the setup to allow users to log into the Drupal backend from the Next.js frontend, using [Auth.js](https://authjs.dev/). - As an example, only registered users are allowed to post to the drupal `contact` webform, and parts of the interface in the frontend are available only for logged-in users. - Some test users are imported as part of the content migration (check the `users.csv' file for the credentials). @@ -171,10 +176,19 @@ When adding or modifying queries and fragments, the codegen script needs to be r Note that when there are changes on the GraphQL server schema itself, you will need to stop and start the command again to fetch the new schema definition (it will keep watching your changed files, but will only re-fetch the schema from the server when the codegen command first runs). Also, you might need to run `lando drush cr` or `ddev drush cr` to clear the Drupal cache. +##### VSCode extensions to work with GraphQL and TypeScript + +We have included a `.vscode/extensions.json` file that will suggest some useful extensions to work with GraphQL and TypeScript in VSCode with full autocomplete and syntax highlighting. You can install them by clicking on the notification that appears when you open the project in VSCode. + +Please note: +1. We suggest opening the project in VSCode using the `/next` directory as the root of the project. +2. The latest version of the "GraphQL: Language Feature Support" extension [currently has a bug](https://github.com/graphql/graphiql/issues/3620) that prevents it from working correctly with the `graphql-codegen` package. Make sure to install the v0.9.3 version instead. + #### Typesafe environment variables -The environment variables used by the frontend are also checked for type safety. If used correctly, a Zod error will prevent the frontend from building if the environment variables are not set according to the schema defined in `next/env.ts`. To add a new environment variable: +The environment variables used by the frontend are also checked for type safety. If used correctly, a Zod error will prevent the frontend from building if the environment variables are not set according to the schema defined in `next/env.ts`. +To add a new environment variable: 1. Add it to `.lando.yml`, under services > node > overrides > environment. or to `.ddev/config.yaml` for DDEV. 2. Add it to `next/env.ts`. Note that it must be added twice there - once under server/client to define its schema, and once under `runtimeEnv` to read the actual value. 3. Import it in the file where it's used with `import { env } from "@/env";` and use it like `env.MY_ENV_VAR`. At this point, your environment variable should be working locally. @@ -184,30 +198,7 @@ The environment variables used by the frontend are also checked for type safety. The Next.js frontend will query the Drupal backend to generate a `/sitemap.xml` path that can be submitted to search engines. -#### Redis caching - -The project is set up to use [Redis](https://redis.io/) if available to cache the responses from the backend. Both the ddev and lando setup include redis by default. -The connection between next.js and redis is handled by the [@neshca/cache-handler](https://www.npmjs.com/package/@neshca/cache-handler) package. We added custom logic to our cache handler -to handle prepopulating the cache from builds for ISR. Checl the `cache-handler.mjs` file in the `next` directory for more information. - -### Connecting to Redis in the local environment - -You can connect to Redis and interact with it using the [redis cli](https://redis.io/docs/latest/develop/connect/cli/) in the local environment by running the following command: - -If you are using Lando: - -```bash -lando redis-cli -``` - -If you are using DDEV: - -```bash -ddev redis -``` - - -### Testing with Cypress +### Testing with Cypress (Lando only) The template includes example tests to be run with Cypress. The Lando setup includes a headless browser and Cypress, so you can run the tests locally without the need to install anything else, but it won't be able to use the visual Cypress application. See below for more details. @@ -233,6 +224,23 @@ If you want to run the visual Cypress application, you will need to run cypress You can then run your tests inside the Cypress application. -### UI library +#### Redis caching + +The project is set up to use [Redis](https://redis.io/) if available to cache the responses from the backend. Both the ddev and lando setup include redis by default. +The connection between next.js and redis is handled by the [@neshca/cache-handler](https://www.npmjs.com/package/@neshca/cache-handler) package. + +### Connecting to Redis in the local environment + +You can connect to Redis and interact with it using the [redis cli](https://redis.io/docs/latest/develop/connect/cli/) in the local environment by running the following command: + +If you are using Lando: -The `ui/` directory contains some reusable UI components that are used in the frontend. These components are based on the [Wunder Component Library](https://www.figma.com/file/i0RIoStoPOZfcqS80DLbkD/The-Component-Library), which is a collection of reusable UI components designed to be used as a shared base for many projects. The components are meant to be used as a starting point, and should be modified, added and removed as required to fit the needs of the project. +```bash +lando redis-cli +``` + +If you are using DDEV: + +```bash +ddev redis +``` \ No newline at end of file diff --git a/drupal/.gitignore b/drupal/.gitignore index c8f079d1..5a3fa9a3 100644 --- a/drupal/.gitignore +++ b/drupal/.gitignore @@ -38,3 +38,6 @@ # Ignore testing directories. /web/sites/simpletest /web/tmp + +# Ignore configuration files. +/config/ diff --git a/drupal/composer.json b/drupal/composer.json index fd1932a9..1046b331 100644 --- a/drupal/composer.json +++ b/drupal/composer.json @@ -19,22 +19,23 @@ "composer/installers": "^2.1", "cweagans/composer-patches": "^1.7", "drupal/admin_toolbar": "^3.5", + "drupal/consumers": "^1.19", "drupal/core-composer-scaffold": "^10.3", "drupal/core-recommended": "^10.3", "drupal/elasticsearch_helper": "^8.1", "drupal/entity_reference_revisions": "^1.12", - "drupal/graphql": "^4.7", + "drupal/graphql": "^4.9", "drupal/graphql_compose": "^2.2", - "drupal/menu_link_attributes": "^1.3", + "drupal/menu_link_attributes": "^1.5", "drupal/metatag": "^2.0", "drupal/migrate_plus": "^6.0", "drupal/migrate_source_csv": "^3.5", "drupal/migrate_tools": "^6.0", "drupal/monolog": "^3.0@beta", - "drupal/next": "^1.6", + "drupal/next": "^2.0@beta", "drupal/paragraphs": "^1.18", "drupal/pathauto": "^1.13", - "drupal/redirect": "^1.9", + "drupal/redirect": "^1.10", "drupal/registration_role": "^2.0", "drupal/require_login": "^3.0", "drupal/restui": "^1.21", @@ -64,12 +65,13 @@ "allow-plugins": { "composer/installers": true, "cweagans/composer-patches": true, + "dealerdirect/phpcodesniffer-composer-installer": true, "drupal/core-composer-scaffold": true, "koodimonni/composer-dropin-installer": true, - "dealerdirect/phpcodesniffer-composer-installer": true, + "php-http/discovery": true, "phpro/grumphp": true, "phpstan/extension-installer": true, - "php-http/discovery": true + "tbachert/spi": true }, "process-timeout": 3000 }, diff --git a/drupal/composer.lock b/drupal/composer.lock index ac76329a..8cd4a718 100644 --- a/drupal/composer.lock +++ b/drupal/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "93bcd0c01d9912a57ed22d93a47beffd", + "content-hash": "1a82c9dc7b205461976557a5516aab4b", "packages": [ { "name": "asm89/stack-cors", @@ -269,24 +269,24 @@ }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -330,7 +330,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.2" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -346,7 +346,7 @@ "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "consolidation/annotated-command", @@ -1056,16 +1056,16 @@ }, { "name": "doctrine/annotations", - "version": "1.14.3", + "version": "1.14.4", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915", + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915", "shasum": "" }, "require": { @@ -1076,11 +1076,11 @@ }, "require-dev": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "~1.4.10 || ^1.10.28", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" }, "suggest": { "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" @@ -1126,9 +1126,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" + "source": "https://github.com/doctrine/annotations/tree/1.14.4" }, - "time": "2023-02-01T09:20:38+00:00" + "time": "2024-09-05T10:15:52+00:00" }, { "name": "doctrine/deprecations", @@ -1348,17 +1348,17 @@ }, { "name": "drupal/admin_toolbar", - "version": "3.5.0", + "version": "3.5.1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/admin_toolbar.git", - "reference": "3.5.0" + "reference": "3.5.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.5.0.zip", - "reference": "3.5.0", - "shasum": "099e8d4dc98e1d551b4f9cffdc39599eb8ad04e8" + "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.5.1.zip", + "reference": "3.5.1", + "shasum": "b5215109836f7fade374fef531231e36c1c9b945" }, "require": { "drupal/core": "^9.5 || ^10 || ^11" @@ -1369,8 +1369,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "3.5.0", - "datestamp": "1722639094", + "version": "3.5.1", + "datestamp": "1730409973", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -1412,7 +1412,7 @@ "homepage": "https://www.drupal.org/user/2320090" }, { - "name": "Musa.thomas", + "name": "musa.thomas", "homepage": "https://www.drupal.org/user/1213824" }, { @@ -1433,26 +1433,26 @@ }, { "name": "drupal/consumers", - "version": "1.17.0", + "version": "1.19.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/consumers.git", - "reference": "8.x-1.17" + "reference": "8.x-1.19" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/consumers-8.x-1.17.zip", - "reference": "8.x-1.17", - "shasum": "8e7efc2c8386ead8ca459a1a5e0558fb66cde142" + "url": "https://ftp.drupal.org/files/projects/consumers-8.x-1.19.zip", + "reference": "8.x-1.19", + "shasum": "3af0f9866524c40e78924343c319720e1d17c2ef" }, "require": { - "drupal/core": "^8 || ^9 || ^10" + "drupal/core": "^9.5 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.17", - "datestamp": "1679920063", + "version": "8.x-1.19", + "datestamp": "1721753030", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -1461,7 +1461,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0-or-later" + "GPL-2.0+" ], "authors": [ { @@ -1473,7 +1473,7 @@ "homepage": "https://www.drupal.org/user/79230" } ], - "description": "Declare all the consumers of your API", + "description": "Declare all the consumers of your API.", "homepage": "https://www.drupal.org/project/consumers", "support": { "source": "https://git.drupalcode.org/project/consumers" @@ -1481,16 +1481,16 @@ }, { "name": "drupal/core", - "version": "10.3.2", + "version": "10.3.9", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "10e79c67a903844bef02a5cf10475d9a8b623e7a" + "reference": "42a6516491b4793158542a2326dc6ad1fe2aa5bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/10e79c67a903844bef02a5cf10475d9a8b623e7a", - "reference": "10e79c67a903844bef02a5cf10475d9a8b623e7a", + "url": "https://api.github.com/repos/drupal/core/zipball/42a6516491b4793158542a2326dc6ad1fe2aa5bd", + "reference": "42a6516491b4793158542a2326dc6ad1fe2aa5bd", "shasum": "" }, "require": { @@ -1536,7 +1536,7 @@ "symfony/serializer": "^6.4", "symfony/validator": "^6.4", "symfony/yaml": "^6.4", - "twig/twig": "^3.9.3" + "twig/twig": "^3.14.2" }, "conflict": { "drush/drush": "<12.4.3" @@ -1639,22 +1639,22 @@ ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", "support": { - "source": "https://github.com/drupal/core/tree/10.3.2" + "source": "https://github.com/drupal/core/tree/10.3.9" }, - "time": "2024-08-08T09:23:57+00:00" + "time": "2024-11-20T17:59:45+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "10.3.2", + "version": "10.3.9", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", - "reference": "a1a186caeb89899143e0c6912ccee9d3d7181dbe" + "reference": "f58ab5c0d02d275c5aa226c4505b457e41b161cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/a1a186caeb89899143e0c6912ccee9d3d7181dbe", - "reference": "a1a186caeb89899143e0c6912ccee9d3d7181dbe", + "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/f58ab5c0d02d275c5aa226c4505b457e41b161cc", + "reference": "f58ab5c0d02d275c5aa226c4505b457e41b161cc", "shasum": "" }, "require": { @@ -1689,22 +1689,22 @@ "drupal" ], "support": { - "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.2" + "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.9" }, - "time": "2024-05-11T08:21:39+00:00" + "time": "2024-08-22T14:31:34+00:00" }, { "name": "drupal/core-recommended", - "version": "10.3.2", + "version": "10.3.9", "source": { "type": "git", "url": "https://github.com/drupal/core-recommended.git", - "reference": "18b7288d2e661afadfff4a714c5a166bf2554124" + "reference": "03da2860a10c12b86714e778178433b620bb890d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-recommended/zipball/18b7288d2e661afadfff4a714c5a166bf2554124", - "reference": "18b7288d2e661afadfff4a714c5a166bf2554124", + "url": "https://api.github.com/repos/drupal/core-recommended/zipball/03da2860a10c12b86714e778178433b620bb890d", + "reference": "03da2860a10c12b86714e778178433b620bb890d", "shasum": "" }, "require": { @@ -1713,7 +1713,7 @@ "doctrine/annotations": "~1.14.3", "doctrine/deprecations": "~1.1.3", "doctrine/lexer": "~2.1.1", - "drupal/core": "10.3.2", + "drupal/core": "10.3.9", "egulias/email-validator": "~4.0.2", "guzzlehttp/guzzle": "~7.8.1", "guzzlehttp/promises": "~2.0.2", @@ -1762,7 +1762,7 @@ "symfony/var-dumper": "~v6.4.7", "symfony/var-exporter": "~v6.4.7", "symfony/yaml": "~v6.4.7", - "twig/twig": "~v3.10.2" + "twig/twig": "~v3.14.2" }, "conflict": { "webflo/drupal-core-strict": "*" @@ -1774,9 +1774,9 @@ ], "description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.", "support": { - "source": "https://github.com/drupal/core-recommended/tree/10.3.2" + "source": "https://github.com/drupal/core-recommended/tree/10.3.9" }, - "time": "2024-08-08T09:23:57+00:00" + "time": "2024-11-20T17:59:45+00:00" }, { "name": "drupal/ctools", @@ -2063,32 +2063,39 @@ }, { "name": "drupal/graphql", - "version": "4.8.0", + "version": "4.9.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/graphql.git", - "reference": "8.x-4.8" + "reference": "8.x-4.9" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/graphql-8.x-4.8.zip", - "reference": "8.x-4.8", - "shasum": "fea701202918267c56791f68b09aa12907e8bfa4" + "url": "https://ftp.drupal.org/files/projects/graphql-8.x-4.9.zip", + "reference": "8.x-4.9", + "shasum": "8045e8f07e82a55f229235bb614ba7df87e718ef" }, "require": { - "drupal/core": "^10.1", - "drupal/typed_data": "*", - "php": ">=7.3", + "drupal/core": "^10.2 || ^11", + "drupal/typed_data": "^1.0 || ^2.0", + "php": ">=8.1", "webonyx/graphql-php": "^14.8.0" }, "require-dev": { - "drupal/node-node": "*" + "drupal/node-node": "*", + "drupal/redirect": "^1.0", + "jangregor/phpstan-prophecy": "^1.0.0", + "mglaman/phpstan-drupal": "^1.1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.11.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.0.0" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-4.8", - "datestamp": "1720100174", + "version": "8.x-4.9", + "datestamp": "1726057421", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -2113,7 +2120,7 @@ "homepage": "https://www.drupal.org/user/612814" }, { - "name": "Kingdutch", + "name": "kingdutch", "homepage": "https://www.drupal.org/user/1868952" }, { @@ -2215,26 +2222,26 @@ }, { "name": "drupal/menu_link_attributes", - "version": "1.3.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/menu_link_attributes.git", - "reference": "8.x-1.3" + "reference": "8.x-1.5" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/menu_link_attributes-8.x-1.3.zip", - "reference": "8.x-1.3", - "shasum": "431c7954cc614a1b9677173f0209f1df15592503" + "url": "https://ftp.drupal.org/files/projects/menu_link_attributes-8.x-1.5.zip", + "reference": "8.x-1.5", + "shasum": "ad1db596ad8a76ba95fbf2d0a42d4777056587d5" }, "require": { - "drupal/core": "^8 || ^9 || ^10" + "drupal/core": "^8 || ^9 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.3", - "datestamp": "1671026425", + "version": "8.x-1.5", + "datestamp": "1724848806", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -2246,6 +2253,14 @@ "GPL-2.0-or-later" ], "authors": [ + { + "name": "anybody", + "homepage": "https://www.drupal.org/user/291091" + }, + { + "name": "grevil", + "homepage": "https://www.drupal.org/user/3668491" + }, { "name": "jcnventura", "homepage": "https://www.drupal.org/user/122464" @@ -2595,21 +2610,20 @@ }, { "name": "drupal/next", - "version": "1.6.3", + "version": "2.0.0-beta1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/next.git", - "reference": "1.6.3" + "reference": "2.0.0-beta1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/next-1.6.3.zip", - "reference": "1.6.3", - "shasum": "e5ce08189ae47ceb6933407f53bfd43a24a9b05c" + "url": "https://ftp.drupal.org/files/projects/next-2.0.0-beta1.zip", + "reference": "2.0.0-beta1", + "shasum": "f60775bcdb4333dc28db85b2127abf14c97540b6" }, "require": { - "cweagans/composer-patches": "~1.0", - "drupal/core": "^9 || ^10", + "drupal/core": "^10 || ^11", "drupal/decoupled_router": "^2.0", "drupal/pathauto": "^1.11", "drupal/simple_oauth": "^5.0 || ^6.0", @@ -2622,16 +2636,16 @@ "drupal/jwt": "*", "drupal/jwt_auth_consumer": "*", "drupal/subrequests": "*", - "phpunit/phpunit": "^6.0 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9 || ^10" }, "type": "drupal-module", "extra": { "drupal": { - "version": "1.6.3", - "datestamp": "1681969041", + "version": "2.0.0-beta1", + "datestamp": "1728074311", "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" + "status": "not-covered", + "message": "Beta releases are not covered by Drupal security advisories." } } }, @@ -2642,15 +2656,15 @@ "authors": [ { "name": "shadcn", - "homepage": "https://shadcn.com" + "homepage": "https://www.chapterthree.com" }, { - "name": "minnur", - "homepage": "https://www.drupal.org/user/702026" + "name": "johnalbin", + "homepage": "https://www.drupal.org/user/32095" }, { - "name": "roaguicr", - "homepage": "https://www.drupal.org/user/2334450" + "name": "minnur", + "homepage": "https://www.drupal.org/user/702026" }, { "name": "rrrob", @@ -2661,7 +2675,7 @@ "homepage": "https://www.drupal.org/user/571032" } ], - "description": "Next.js + Drupal for Incremental Static Regeneration and Preview mode.", + "description": "Next.js + Drupal for Incremental Static Regeneration and Draft mode.", "homepage": "http://drupal.org/project/next", "support": { "source": "https://git.drupalcode.org/project/next" @@ -2821,26 +2835,26 @@ }, { "name": "drupal/redirect", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/redirect.git", - "reference": "8.x-1.9" + "reference": "8.x-1.10" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/redirect-8.x-1.9.zip", - "reference": "8.x-1.9", - "shasum": "2987de20f509e9f7cec8a0f81d3a6774f9b0ba3e" + "url": "https://ftp.drupal.org/files/projects/redirect-8.x-1.10.zip", + "reference": "8.x-1.10", + "shasum": "9d72d7e0717dbdea3ab3306c5d6840da5bd3024c" }, "require": { - "drupal/core": "^9.2 || ^10" + "drupal/core": "^9.2 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.9", - "datestamp": "1693393506", + "version": "8.x-1.10", + "datestamp": "1723277641", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -2857,7 +2871,7 @@ "homepage": "https://www.drupal.org/user/214652" }, { - "name": "Dave Reid", + "name": "dave reid", "homepage": "https://www.drupal.org/user/53892" }, { @@ -3784,7 +3798,7 @@ "version": "v8.12.0", "source": { "type": "git", - "url": "git@github.com:elastic/elasticsearch-php.git", + "url": "https://github.com/elastic/elasticsearch-php.git", "reference": "6f4a2ee4ff2cb9f75a6ee00f574aa2d9c1bb14fd" }, "dist": { @@ -4182,16 +4196,16 @@ }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -4245,7 +4259,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -4261,7 +4275,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", @@ -5271,16 +5285,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v4.19.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", "shasum": "" }, "require": { @@ -5289,7 +5303,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -5321,9 +5335,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" }, - "time": "2024-03-17T08:10:35+00:00" + "time": "2024-09-29T15:01:53+00:00" }, { "name": "paragonie/random_compat", @@ -5710,16 +5724,16 @@ }, { "name": "php-http/discovery", - "version": "1.19.4", + "version": "1.20.0", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "0700efda8d7526335132360167315fdab3aeb599" + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", - "reference": "0700efda8d7526335132360167315fdab3aeb599", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", "shasum": "" }, "require": { @@ -5783,22 +5797,22 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.4" + "source": "https://github.com/php-http/discovery/tree/1.20.0" }, - "time": "2024-03-29T13:00:05+00:00" + "time": "2024-10-02T11:20:13+00:00" }, { "name": "php-http/httplug", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", "shasum": "" }, "require": { @@ -5840,9 +5854,9 @@ ], "support": { "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" + "source": "https://github.com/php-http/httplug/tree/2.4.1" }, - "time": "2023-04-14T15:10:03+00:00" + "time": "2024-09-23T11:39:58+00:00" }, { "name": "php-http/promise", @@ -6385,16 +6399,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -6429,9 +6443,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psy/psysh", @@ -6669,16 +6683,16 @@ }, { "name": "symfony/console", - "version": "v6.4.10", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc" + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc", + "url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", "shasum": "" }, "require": { @@ -6743,7 +6757,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.10" + "source": "https://github.com/symfony/console/tree/v6.4.15" }, "funding": [ { @@ -6759,20 +6773,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.10", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb" + "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", - "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/70ab1f65a4516ef741e519ea938e6aa465e6aa36", + "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36", "shasum": "" }, "require": { @@ -6824,7 +6838,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.10" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.15" }, "funding": [ { @@ -6840,7 +6854,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T07:32:07+00:00" + "time": "2024-11-09T06:56:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6911,16 +6925,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.10", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" + "reference": "9e024324511eeb00983ee76b9aedc3e6ecd993d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/9e024324511eeb00983ee76b9aedc3e6ecd993d9", + "reference": "9e024324511eeb00983ee76b9aedc3e6ecd993d9", "shasum": "" }, "require": { @@ -6966,7 +6980,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/v6.4.10" + "source": "https://github.com/symfony/error-handler/tree/v6.4.14" }, "funding": [ { @@ -6982,20 +6996,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-11-05T15:34:40+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", "shasum": "" }, "require": { @@ -7046,7 +7060,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" }, "funding": [ { @@ -7062,7 +7076,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -7142,16 +7156,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3", + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", "shasum": "" }, "require": { @@ -7188,7 +7202,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.9" + "source": "https://github.com/symfony/filesystem/tree/v6.4.13" }, "funding": [ { @@ -7204,20 +7218,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/finder", - "version": "v6.4.10", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "af29198d87112bebdd397bd7735fbd115997824c" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c", - "reference": "af29198d87112bebdd397bd7735fbd115997824c", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -7252,7 +7266,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.10" + "source": "https://github.com/symfony/finder/tree/v6.4.13" }, "funding": [ { @@ -7268,20 +7282,20 @@ "type": "tidelift" } ], - "time": "2024-07-24T07:06:38+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.10", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b" + "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/117f1f20a7ade7bcea28b861fb79160a21a1e37b", - "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6", + "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6", "shasum": "" }, "require": { @@ -7291,12 +7305,12 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.3" + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3|^7.0", + "symfony/cache": "^6.4.12|^7.1.5", "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", @@ -7329,7 +7343,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.10" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.15" }, "funding": [ { @@ -7345,20 +7359,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:36:27+00:00" + "time": "2024-11-08T16:09:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.10", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "147e0daf618d7575b5007055340d09aece5cf068" + "reference": "b002a5b3947653c5aee3adac2a024ea615fd3ff5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/147e0daf618d7575b5007055340d09aece5cf068", - "reference": "147e0daf618d7575b5007055340d09aece5cf068", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b002a5b3947653c5aee3adac2a024ea615fd3ff5", + "reference": "b002a5b3947653c5aee3adac2a024ea615fd3ff5", "shasum": "" }, "require": { @@ -7443,7 +7457,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/v6.4.10" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.15" }, "funding": [ { @@ -7459,20 +7473,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T14:52:04+00:00" + "time": "2024-11-13T13:57:37+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45" + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", - "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", + "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", "shasum": "" }, "require": { @@ -7523,7 +7537,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.9" + "source": "https://github.com/symfony/mailer/tree/v6.4.13" }, "funding": [ { @@ -7539,20 +7553,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T07:59:05+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/mime", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7d048964877324debdcb4e0549becfa064a20d43" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43", - "reference": "7d048964877324debdcb4e0549becfa064a20d43", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -7608,7 +7622,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.9" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -7624,7 +7638,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/polyfill-ctype", @@ -8110,36 +8124,28 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, - "type": "library", + "type": "metapackage", "extra": { "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -8163,7 +8169,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" }, "funding": [ { @@ -8179,24 +8185,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -8243,7 +8249,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -8259,24 +8265,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -8319,7 +8325,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -8335,7 +8341,7 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", @@ -8416,16 +8422,16 @@ }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", "shasum": "" }, "require": { @@ -8457,7 +8463,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.15" }, "funding": [ { @@ -8473,20 +8479,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v6.4.10", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "89a24648d73e4eee30893b0da16abc454a65c53b" + "reference": "c9cf83326a1074f83a738fc5320945abf7fb7fec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/89a24648d73e4eee30893b0da16abc454a65c53b", - "reference": "89a24648d73e4eee30893b0da16abc454a65c53b", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c9cf83326a1074f83a738fc5320945abf7fb7fec", + "reference": "c9cf83326a1074f83a738fc5320945abf7fb7fec", "shasum": "" }, "require": { @@ -8540,7 +8546,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.10" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.13" }, "funding": [ { @@ -8556,20 +8562,20 @@ "type": "tidelift" } ], - "time": "2024-07-15T09:36:38+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/routing", - "version": "v6.4.10", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87" + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/aad19fe10753ba842f0d653a8db819c4b3affa87", - "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87", + "url": "https://api.github.com/repos/symfony/routing/zipball/640a74250d13f9c30d5ca045b6aaaabcc8215278", + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278", "shasum": "" }, "require": { @@ -8623,7 +8629,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.10" + "source": "https://github.com/symfony/routing/tree/v6.4.13" }, "funding": [ { @@ -8639,20 +8645,20 @@ "type": "tidelift" } ], - "time": "2024-07-15T09:26:24+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.10", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718" + "reference": "9d862d66198f3c2e30404228629ef4c18d5d608e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/9a67fcf320561e96f94d62bbe0e169ac534a5718", - "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718", + "url": "https://api.github.com/repos/symfony/serializer/zipball/9d862d66198f3c2e30404228629ef4c18d5d608e", + "reference": "9d862d66198f3c2e30404228629ef4c18d5d608e", "shasum": "" }, "require": { @@ -8721,7 +8727,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.4.10" + "source": "https://github.com/symfony/serializer/tree/v6.4.15" }, "funding": [ { @@ -8737,7 +8743,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T13:13:26+00:00" + "time": "2024-10-23T13:25:59+00:00" }, { "name": "symfony/service-contracts", @@ -8824,16 +8830,16 @@ }, { "name": "symfony/string", - "version": "v6.4.10", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ccf9b30251719567bfd46494138327522b9a9446" + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446", - "reference": "ccf9b30251719567bfd46494138327522b9a9446", + "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", "shasum": "" }, "require": { @@ -8890,7 +8896,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.10" + "source": "https://github.com/symfony/string/tree/v6.4.15" }, "funding": [ { @@ -8906,7 +8912,7 @@ "type": "tidelift" } ], - "time": "2024-07-22T10:21:14+00:00" + "time": "2024-11-13T13:31:12+00:00" }, { "name": "symfony/translation-contracts", @@ -8988,16 +8994,16 @@ }, { "name": "symfony/validator", - "version": "v6.4.10", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd" + "reference": "7541055cdaf54ff95f0735bf703d313374e8b20b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd", - "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd", + "url": "https://api.github.com/repos/symfony/validator/zipball/7541055cdaf54ff95f0735bf703d313374e8b20b", + "reference": "7541055cdaf54ff95f0735bf703d313374e8b20b", "shasum": "" }, "require": { @@ -9065,7 +9071,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.10" + "source": "https://github.com/symfony/validator/tree/v6.4.15" }, "funding": [ { @@ -9081,20 +9087,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-11-08T15:28:48+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.10", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4" + "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4", - "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", + "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", "shasum": "" }, "require": { @@ -9150,7 +9156,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.10" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.15" }, "funding": [ { @@ -9166,20 +9172,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-11-08T15:28:48+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" + "reference": "0f605f72a363f8743001038a176eeb2a11223b51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", - "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", + "reference": "0f605f72a363f8743001038a176eeb2a11223b51", "shasum": "" }, "require": { @@ -9227,7 +9233,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" }, "funding": [ { @@ -9243,20 +9249,20 @@ "type": "tidelift" } ], - "time": "2024-06-24T15:53:56+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9" + "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e99b4e94d124b29ee4cf3140e1b537d2dad8cec9", + "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9", "shasum": "" }, "require": { @@ -9299,7 +9305,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.8" + "source": "https://github.com/symfony/yaml/tree/v6.4.13" }, "funding": [ { @@ -9315,28 +9321,28 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "twig/twig", - "version": "v3.10.3", + "version": "v3.14.2", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "67f29781ffafa520b0bbfbd8384674b42db04572" + "reference": "0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572", - "reference": "67f29781ffafa520b0bbfbd8384674b42db04572", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a", + "reference": "0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22" + "symfony/polyfill-php81": "^1.29" }, "require-dev": { "psr/container": "^1.0|^2.0", @@ -9382,7 +9388,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.10.3" + "source": "https://github.com/twigphp/Twig/tree/v3.14.2" }, "funding": [ { @@ -9394,7 +9400,7 @@ "type": "tidelift" } ], - "time": "2024-05-16T10:04:27+00:00" + "time": "2024-11-07T12:36:22+00:00" }, { "name": "vlucas/phpdotenv", @@ -10202,16 +10208,16 @@ }, { "name": "behat/mink", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/minkphp/Mink.git", - "reference": "d8527fdf8785aad38455fb426af457ab9937aece" + "reference": "7e4edec6c335937029cb3569ce7ef81182804d0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/Mink/zipball/d8527fdf8785aad38455fb426af457ab9937aece", - "reference": "d8527fdf8785aad38455fb426af457ab9937aece", + "url": "https://api.github.com/repos/minkphp/Mink/zipball/7e4edec6c335937029cb3569ce7ef81182804d0a", + "reference": "7e4edec6c335937029cb3569ce7ef81182804d0a", "shasum": "" }, "require": { @@ -10262,9 +10268,9 @@ ], "support": { "issues": "https://github.com/minkphp/Mink/issues", - "source": "https://github.com/minkphp/Mink/tree/v1.11.0" + "source": "https://github.com/minkphp/Mink/tree/v1.12.0" }, - "time": "2023-12-09T11:23:23+00:00" + "time": "2024-10-30T18:48:14+00:00" }, { "name": "behat/mink-browserkit-driver", @@ -10334,6 +10340,66 @@ }, "time": "2023-12-09T11:30:50+00:00" }, + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, { "name": "colinodell/psr-testlogger", "version": "v1.3.0", @@ -10415,16 +10481,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.1", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" + "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", - "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2", + "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2", "shasum": "" }, "require": { @@ -10434,8 +10500,8 @@ }, "require-dev": { "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", @@ -10471,7 +10537,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.1" + "source": "https://github.com/composer/ca-bundle/tree/1.5.3" }, "funding": [ { @@ -10487,20 +10553,20 @@ "type": "tidelift" } ], - "time": "2024-07-08T15:28:20+00:00" + "time": "2024-11-04T10:15:26+00:00" }, { "name": "composer/class-map-generator", - "version": "1.3.4", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3" + "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", - "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783", + "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783", "shasum": "" }, "require": { @@ -10513,8 +10579,8 @@ "phpstan/phpstan-deprecation-rules": "^1", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6" }, "type": "library", "extra": { @@ -10544,7 +10610,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.3.4" + "source": "https://github.com/composer/class-map-generator/tree/1.4.0" }, "funding": [ { @@ -10560,52 +10626,52 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:13:04+00:00" + "time": "2024-10-03T18:14:00+00:00" }, { "name": "composer/composer", - "version": "2.7.7", + "version": "2.8.3", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "291942978f39435cf904d33739f98d7d4eca7b23" + "reference": "2a7c71266b2545a3bed9f4860734081963f6e688" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/291942978f39435cf904d33739f98d7d4eca7b23", - "reference": "291942978f39435cf904d33739f98d7d4eca7b23", + "url": "https://api.github.com/repos/composer/composer/zipball/2a7c71266b2545a3bed9f4860734081963f6e688", + "reference": "2a7c71266b2545a3bed9f4860734081963f6e688", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.3.3", + "composer/ca-bundle": "^1.5", + "composer/class-map-generator": "^1.4.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2.1 || ^3.1", + "composer/pcre": "^2.2 || ^3.2", "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^5.2.11", + "justinrainbow/json-schema": "^5.3", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8 || ^3", + "react/promise": "^2.11 || ^3.2", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11 || ^7", - "symfony/filesystem": "^5.4 || ^6.0 || ^7", - "symfony/finder": "^5.4 || ^6.0 || ^7", + "symfony/console": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/filesystem": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/finder": "^5.4.35 || ^6.3.12 || ^7.0.3", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4 || ^6.0 || ^7" + "symfony/process": "^5.4.35 || ^6.3.12 || ^7.0.3" }, "require-dev": { - "phpstan/phpstan": "^1.11.0", + "phpstan/phpstan": "^1.11.8", "phpstan/phpstan-deprecation-rules": "^1.2.0", "phpstan/phpstan-phpunit": "^1.4.0", "phpstan/phpstan-strict-rules": "^1.6.0", "phpstan/phpstan-symfony": "^1.4.0", - "symfony/phpunit-bridge": "^6.4.1 || ^7.0.1" + "symfony/phpunit-bridge": "^6.4.3 || ^7.0.1" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -10618,7 +10684,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.7-dev" + "dev-main": "2.8-dev" }, "phpstan": { "includes": [ @@ -10658,7 +10724,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.7.7" + "source": "https://github.com/composer/composer/tree/2.8.3" }, "funding": [ { @@ -10674,7 +10740,7 @@ "type": "tidelift" } ], - "time": "2024-06-10T20:11:12+00:00" + "time": "2024-11-17T12:13:04+00:00" }, { "name": "composer/metadata-minifier", @@ -10820,27 +10886,27 @@ }, { "name": "composer/pcre", - "version": "3.2.0", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/ea4ab6f9580a4fd221e0418f2c357cdd39102a90", - "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "conflict": { - "phpstan/phpstan": "<1.11.8" + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11.8", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", "phpunit/phpunit": "^8 || ^9" }, "type": "library", @@ -10879,7 +10945,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.2.0" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -10895,7 +10961,7 @@ "type": "tidelift" } ], - "time": "2024-07-25T09:36:02+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/spdx-licenses", @@ -11316,16 +11382,16 @@ }, { "name": "drupal/coder", - "version": "8.3.24", + "version": "8.3.25", "source": { "type": "git", "url": "https://github.com/pfrenssen/coder.git", - "reference": "1a59890f972db5da091354f0191dec1037f7c582" + "reference": "c58e5a0c44c0010bbc8a91fc468f4667e177b976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pfrenssen/coder/zipball/1a59890f972db5da091354f0191dec1037f7c582", - "reference": "1a59890f972db5da091354f0191dec1037f7c582", + "url": "https://api.github.com/repos/pfrenssen/coder/zipball/c58e5a0c44c0010bbc8a91fc468f4667e177b976", + "reference": "c58e5a0c44c0010bbc8a91fc468f4667e177b976", "shasum": "" }, "require": { @@ -11363,11 +11429,11 @@ "issues": "https://www.drupal.org/project/issues/coder", "source": "https://www.drupal.org/project/coder" }, - "time": "2024-04-21T06:13:24+00:00" + "time": "2024-09-22T19:02:16+00:00" }, { "name": "drupal/core-dev", - "version": "10.3.2", + "version": "10.3.9", "source": { "type": "git", "url": "https://github.com/drupal/core-dev.git", @@ -11417,7 +11483,7 @@ ], "description": "require-dev dependencies from drupal/drupal; use in addition to drupal/core-recommended to run tests from drupal/core.", "support": { - "source": "https://github.com/drupal/core-dev/tree/10.3.2" + "source": "https://github.com/drupal/core-dev/tree/10.3.9" }, "time": "2024-07-04T10:19:29+00:00" }, @@ -11595,16 +11661,16 @@ }, { "name": "google/protobuf", - "version": "v3.25.4", + "version": "v4.28.3", "source": { "type": "git", "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "749f6c8e99a7fe51d096c2db656a4af9a46a6b5e" + "reference": "c5c311e0f3d89928251ac5a2f0e3db283612c100" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/749f6c8e99a7fe51d096c2db656a4af9a46a6b5e", - "reference": "749f6c8e99a7fe51d096c2db656a4af9a46a6b5e", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/c5c311e0f3d89928251ac5a2f0e3db283612c100", + "reference": "c5c311e0f3d89928251ac5a2f0e3db283612c100", "shasum": "" }, "require": { @@ -11633,9 +11699,9 @@ "proto" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.25.4" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.28.3" }, - "time": "2024-07-24T17:10:25+00:00" + "time": "2024-10-22T22:27:17+00:00" }, { "name": "justinrainbow/json-schema", @@ -11884,16 +11950,16 @@ }, { "name": "mglaman/phpstan-drupal", - "version": "1.2.12", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/mglaman/phpstan-drupal.git", - "reference": "346bdddda169a56b6ebb7dc17893f0ac8f33a4f1" + "reference": "2bc25a59b53c8f3990f168efd71241d9c25ea0c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/346bdddda169a56b6ebb7dc17893f0ac8f33a4f1", - "reference": "346bdddda169a56b6ebb7dc17893f0ac8f33a4f1", + "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/2bc25a59b53c8f3990f168efd71241d9c25ea0c3", + "reference": "2bc25a59b53c8f3990f168efd71241d9c25ea0c3", "shasum": "" }, "require": { @@ -11902,7 +11968,7 @@ "phpstan/phpstan-deprecation-rules": "^1.1.4", "symfony/finder": "^4.2 || ^5.0 || ^6.0 || ^7.0", "symfony/yaml": "^4.2|| ^5.0 || ^6.0 || ^7.0", - "webflo/drupal-finder": "^1.2" + "webflo/drupal-finder": "^1.3.1" }, "require-dev": { "behat/mink": "^1.8", @@ -11968,7 +12034,7 @@ "description": "Drupal extension and rules for PHPStan", "support": { "issues": "https://github.com/mglaman/phpstan-drupal/issues", - "source": "https://github.com/mglaman/phpstan-drupal/tree/1.2.12" + "source": "https://github.com/mglaman/phpstan-drupal/tree/1.3.1" }, "funding": [ { @@ -11984,7 +12050,7 @@ "type": "tidelift" } ], - "time": "2024-08-07T21:15:21+00:00" + "time": "2024-09-27T08:54:16+00:00" }, { "name": "micheh/phpcs-gitlab", @@ -12040,23 +12106,24 @@ }, { "name": "mikey179/vfsstream", - "version": "v1.6.11", + "version": "v1.6.12", "source": { "type": "git", "url": "https://github.com/bovigo/vfsStream.git", - "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f" + "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", - "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", + "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^4.5|^5.0" + "phpunit/phpunit": "^7.5||^8.5||^9.6", + "yoast/phpunit-polyfills": "^2.0" }, "type": "library", "extra": { @@ -12087,20 +12154,20 @@ "source": "https://github.com/bovigo/vfsStream/tree/master", "wiki": "https://github.com/bovigo/vfsStream/wiki" }, - "time": "2022-02-23T02:02:42+00:00" + "time": "2024-08-29T18:43:31+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -12139,7 +12206,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -12147,7 +12214,7 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "netresearch/jsonmapper", @@ -12353,6 +12420,72 @@ }, "time": "2023-07-30T15:38:18+00:00" }, + { + "name": "nyholm/psr7-server", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7-server.git", + "reference": "4335801d851f554ca43fa6e7d2602141538854dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7-server/zipball/4335801d851f554ca43fa6e7d2602141538854dc", + "reference": "4335801d851f554ca43fa6e7d2602141538854dc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "nyholm/nsa": "^1.1", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^7.0 || ^8.5 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Nyholm\\Psr7Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "Helper classes to handle PSR-7 server requests", + "homepage": "http://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7-server/issues", + "source": "https://github.com/Nyholm/psr7-server/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2023-11-08T09:30:43+00:00" + }, { "name": "ondram/ci-detector", "version": "4.2.0", @@ -12433,33 +12566,36 @@ }, { "name": "open-telemetry/api", - "version": "1.0.3", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/api.git", - "reference": "87de95d926f46262885d0d390060c095af13e2e5" + "reference": "542064815d38a6df55af7957cd6f1d7d967c99c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/87de95d926f46262885d0d390060c095af13e2e5", - "reference": "87de95d926f46262885d0d390060c095af13e2e5", + "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/542064815d38a6df55af7957cd6f1d7d967c99c6", + "reference": "542064815d38a6df55af7957cd6f1d7d967c99c6", "shasum": "" }, "require": { "open-telemetry/context": "^1.0", - "php": "^7.4 || ^8.0", + "php": "^8.1", "psr/log": "^1.1|^2.0|^3.0", - "symfony/polyfill-php80": "^1.26", - "symfony/polyfill-php81": "^1.26", "symfony/polyfill-php82": "^1.26" }, "conflict": { - "open-telemetry/sdk": "<=1.0.4" + "open-telemetry/sdk": "<=1.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.0.x-dev" + "dev-main": "1.1.x-dev" + }, + "spi": { + "OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\HookManagerInterface": [ + "OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\ExtensionHookManager" + ] } }, "autoload": { @@ -12496,26 +12632,24 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2024-02-06T01:32:25+00:00" + "time": "2024-10-15T22:42:37+00:00" }, { "name": "open-telemetry/context", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/context.git", - "reference": "e9d254a7c89885e63fd2fde54e31e81aaaf52b7c" + "reference": "0cba875ea1953435f78aec7f1d75afa87bdbf7f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/context/zipball/e9d254a7c89885e63fd2fde54e31e81aaaf52b7c", - "reference": "e9d254a7c89885e63fd2fde54e31e81aaaf52b7c", + "url": "https://api.github.com/repos/opentelemetry-php/context/zipball/0cba875ea1953435f78aec7f1d75afa87bdbf7f3", + "reference": "0cba875ea1953435f78aec7f1d75afa87bdbf7f3", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", - "symfony/polyfill-php80": "^1.26", - "symfony/polyfill-php81": "^1.26", + "php": "^8.1", "symfony/polyfill-php82": "^1.26" }, "suggest": { @@ -12557,27 +12691,27 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2024-01-13T05:50:44+00:00" + "time": "2024-08-21T00:29:20+00:00" }, { "name": "open-telemetry/exporter-otlp", - "version": "1.0.4", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/exporter-otlp.git", - "reference": "342686bfce05867b56561a0af2fc8a4a8f27b3cc" + "reference": "9b6de12204f25f8ab9540b46d6e7b5151897ce18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/exporter-otlp/zipball/342686bfce05867b56561a0af2fc8a4a8f27b3cc", - "reference": "342686bfce05867b56561a0af2fc8a4a8f27b3cc", + "url": "https://api.github.com/repos/opentelemetry-php/exporter-otlp/zipball/9b6de12204f25f8ab9540b46d6e7b5151897ce18", + "reference": "9b6de12204f25f8ab9540b46d6e7b5151897ce18", "shasum": "" }, "require": { "open-telemetry/api": "^1.0", "open-telemetry/gen-otlp-protobuf": "^1.1", "open-telemetry/sdk": "^1.0", - "php": "^7.4 || ^8.0", + "php": "^8.1", "php-http/discovery": "^1.14" }, "type": "library", @@ -12621,25 +12755,25 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2024-02-28T21:57:02+00:00" + "time": "2024-04-30T18:28:30+00:00" }, { "name": "open-telemetry/gen-otlp-protobuf", - "version": "1.1.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/gen-otlp-protobuf.git", - "reference": "76e2a44357f8c3fdcabcb070ec8a59e52ae3e3c3" + "reference": "66c3b98e998a726691c92e6405a82e6e7b8b169d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/gen-otlp-protobuf/zipball/76e2a44357f8c3fdcabcb070ec8a59e52ae3e3c3", - "reference": "76e2a44357f8c3fdcabcb070ec8a59e52ae3e3c3", + "url": "https://api.github.com/repos/opentelemetry-php/gen-otlp-protobuf/zipball/66c3b98e998a726691c92e6405a82e6e7b8b169d", + "reference": "66c3b98e998a726691c92e6405a82e6e7b8b169d", "shasum": "" }, "require": { - "google/protobuf": "^3.3.0", - "php": "^7.4 || ^8.0" + "google/protobuf": "^3.22 || ^4.0", + "php": "^8.0" }, "suggest": { "ext-protobuf": "For better performance, when dealing with the protobuf format" @@ -12684,47 +12818,54 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2024-01-16T21:54:57+00:00" + "time": "2024-10-30T11:49:49+00:00" }, { "name": "open-telemetry/sdk", - "version": "1.0.8", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/sdk.git", - "reference": "1da4c0ca4f1a3c0fe84b81729dadec16f464fa77" + "reference": "fb0ff8d8279a3776bd604791e2531dd0cc147e8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/sdk/zipball/1da4c0ca4f1a3c0fe84b81729dadec16f464fa77", - "reference": "1da4c0ca4f1a3c0fe84b81729dadec16f464fa77", + "url": "https://api.github.com/repos/opentelemetry-php/sdk/zipball/fb0ff8d8279a3776bd604791e2531dd0cc147e8b", + "reference": "fb0ff8d8279a3776bd604791e2531dd0cc147e8b", "shasum": "" }, "require": { "ext-json": "*", - "open-telemetry/api": "^1.0", + "nyholm/psr7-server": "^1.1", + "open-telemetry/api": "~1.0 || ~1.1", "open-telemetry/context": "^1.0", "open-telemetry/sem-conv": "^1.0", - "php": "^7.4 || ^8.0", + "php": "^8.1", "php-http/discovery": "^1.14", "psr/http-client": "^1.0", "psr/http-client-implementation": "^1.0", "psr/http-factory-implementation": "^1.0", "psr/http-message": "^1.0.1|^2.0", "psr/log": "^1.1|^2.0|^3.0", + "ramsey/uuid": "^3.0 || ^4.0", "symfony/polyfill-mbstring": "^1.23", - "symfony/polyfill-php80": "^1.26", - "symfony/polyfill-php81": "^1.26", - "symfony/polyfill-php82": "^1.26" + "symfony/polyfill-php82": "^1.26", + "tbachert/spi": "^1.0.1" }, "suggest": { "ext-gmp": "To support unlimited number of synchronous metric readers", - "ext-mbstring": "To increase performance of string operations" + "ext-mbstring": "To increase performance of string operations", + "open-telemetry/sdk-configuration": "File-based OpenTelemetry SDK configuration" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.0.x-dev" + }, + "spi": { + "OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\HookManagerInterface": [ + "OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\ExtensionHookManager" + ] } }, "autoload": { @@ -12767,20 +12908,20 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2024-02-02T03:42:40+00:00" + "time": "2024-10-18T21:01:35+00:00" }, { "name": "open-telemetry/sem-conv", - "version": "1.25.0", + "version": "1.27.1", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/sem-conv.git", - "reference": "23f457ba390847647a17068e0095d9ffe9a4824c" + "reference": "1dba705fea74bc0718d04be26090e3697e56f4e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/23f457ba390847647a17068e0095d9ffe9a4824c", - "reference": "23f457ba390847647a17068e0095d9ffe9a4824c", + "url": "https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/1dba705fea74bc0718d04be26090e3697e56f4e6", + "reference": "1dba705fea74bc0718d04be26090e3697e56f4e6", "shasum": "" }, "require": { @@ -12824,7 +12965,7 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2024-04-09T23:31:35+00:00" + "time": "2024-08-28T09:20:31+00:00" }, { "name": "openlss/lib-array2xml", @@ -13217,16 +13358,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.4.1", + "version": "5.6.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f3558a4c23426d12bffeaab463f8a8d8b681193c", + "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c", "shasum": "" }, "require": { @@ -13235,17 +13376,17 @@ "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.5", + "mockery/mockery": "~1.3.5 || ~1.6.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.8", "phpstan/phpstan-mockery": "^1.1", "phpstan/phpstan-webmozart-assert": "^1.2", "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^5.13" + "psalm/phar": "^5.26" }, "type": "library", "extra": { @@ -13275,29 +13416,29 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.0" }, - "time": "2024-05-21T05:55:05+00:00" + "time": "2024-11-12T11:25:25+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.8.2", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", "php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" + "phpstan/phpdoc-parser": "^1.18|^2.0" }, "require-dev": { "ext-tokenizer": "*", @@ -13333,9 +13474,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" }, - "time": "2024-02-23T11:10:43+00:00" + "time": "2024-11-09T15:12:26+00:00" }, { "name": "phpro/grumphp", @@ -13457,26 +13598,27 @@ }, { "name": "phpspec/prophecy", - "version": "v1.19.0", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "67a759e7d8746d501c41536ba40cd9c0a07d6a87" + "reference": "a0165c648cab6a80311c74ffc708a07bb53ecc93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/67a759e7d8746d501c41536ba40cd9c0a07d6a87", - "reference": "67a759e7d8746d501c41536ba40cd9c0a07d6a87", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/a0165c648cab6a80311c74ffc708a07bb53ecc93", + "reference": "a0165c648cab6a80311c74ffc708a07bb53ecc93", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2 || ^2.0", - "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.*", + "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.* || 8.4.*", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0", "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { + "friendsofphp/php-cs-fixer": "^3.40", "phpspec/phpspec": "^6.0 || ^7.0", "phpstan/phpstan": "^1.9", "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0" @@ -13520,22 +13662,22 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.19.0" + "source": "https://github.com/phpspec/prophecy/tree/v1.20.0" }, - "time": "2024-02-29T11:52:51+00:00" + "time": "2024-11-19T13:12:41+00:00" }, { "name": "phpspec/prophecy-phpunit", - "version": "v2.2.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy-phpunit.git", - "reference": "16e1247e139434bce0bac09848bc5c8d882940fc" + "reference": "8819516c1b489ecee4c60db5f5432fac1ea8ac6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/16e1247e139434bce0bac09848bc5c8d882940fc", - "reference": "16e1247e139434bce0bac09848bc5c8d882940fc", + "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/8819516c1b489ecee4c60db5f5432fac1ea8ac6f", + "reference": "8819516c1b489ecee4c60db5f5432fac1ea8ac6f", "shasum": "" }, "require": { @@ -13543,6 +13685,9 @@ "phpspec/prophecy": "^1.18", "phpunit/phpunit": "^9.1 || ^10.1 || ^11.0" }, + "require-dev": { + "phpstan/phpstan": "^1.10" + }, "type": "library", "extra": { "branch-alias": { @@ -13572,28 +13717,28 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy-phpunit/issues", - "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.2.0" + "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.3.0" }, - "time": "2024-03-01T08:33:58+00:00" + "time": "2024-11-19T13:24:17+00:00" }, { "name": "phpstan/extension-installer", - "version": "1.4.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/phpstan/extension-installer.git", - "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203" + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f6b87faf9fc7978eab2f7919a8760bc9f58f9203", - "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", "shasum": "" }, "require": { "composer-plugin-api": "^2.0", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.0" + "phpstan/phpstan": "^1.9.0 || ^2.0" }, "require-dev": { "composer/composer": "^2.0", @@ -13614,38 +13759,42 @@ "MIT" ], "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/extension-installer/issues", - "source": "https://github.com/phpstan/extension-installer/tree/1.4.1" + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" }, - "time": "2024-06-10T08:20:49+00:00" + "time": "2024-09-04T20:21:43+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.29.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299", + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^5.3.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", "symfony/process": "^5.2" }, "type": "library", @@ -13663,22 +13812,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0" }, - "time": "2024-05-31T08:52:43+00:00" + "time": "2024-10-13T11:29:49+00:00" }, { "name": "phpstan/phpstan", - "version": "1.11.10", + "version": "1.12.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "640410b32995914bde3eed26fa89552f9c2c082f" + "reference": "0d1fc20a962a91be578bcfe7cf939e6e1a2ff733" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/640410b32995914bde3eed26fa89552f9c2c082f", - "reference": "640410b32995914bde3eed26fa89552f9c2c082f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d1fc20a962a91be578bcfe7cf939e6e1a2ff733", + "reference": "0d1fc20a962a91be578bcfe7cf939e6e1a2ff733", "shasum": "" }, "require": { @@ -13723,25 +13872,25 @@ "type": "github" } ], - "time": "2024-08-08T09:02:50+00:00" + "time": "2024-11-17T14:08:01+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26" + "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/fa8cce7720fa782899a0aa97b6a41225d1bb7b26", - "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/f94d246cc143ec5a23da868f8f7e1393b50eaa82", + "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.11" + "phpstan/phpstan": "^1.12" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", @@ -13768,27 +13917,27 @@ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.0" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.1" }, - "time": "2024-04-20T06:39:48+00:00" + "time": "2024-09-11T15:52:35+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "f3ea021866f4263f07ca3636bf22c64be9610c11" + "reference": "11d4235fbc6313ecbf93708606edfd3222e44949" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/f3ea021866f4263f07ca3636bf22c64be9610c11", - "reference": "f3ea021866f4263f07ca3636bf22c64be9610c11", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/11d4235fbc6313ecbf93708606edfd3222e44949", + "reference": "11d4235fbc6313ecbf93708606edfd3222e44949", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.11" + "phpstan/phpstan": "^1.12" }, "conflict": { "phpunit/phpunit": "<7.0" @@ -13820,41 +13969,41 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.4.0" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.4.1" }, - "time": "2024-04-20T06:39:00+00:00" + "time": "2024-11-12T12:43:59+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.31", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -13863,7 +14012,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -13892,7 +14041,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/9.2.31" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -13900,7 +14049,7 @@ "type": "github" } ], - "time": "2024-03-02T06:37:42+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -14145,16 +14294,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.20", + "version": "9.6.21", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "49d7820565836236411f5dc002d16dd689cde42f" + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", - "reference": "49d7820565836236411f5dc002d16dd689cde42f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", "shasum": "" }, "require": { @@ -14169,7 +14318,7 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.31", + "phpunit/php-code-coverage": "^9.2.32", "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.4", @@ -14228,7 +14377,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" }, "funding": [ { @@ -14244,7 +14393,188 @@ "type": "tidelift" } ], - "time": "2024-07-10T11:45:39+00:00" + "time": "2024-09-19T10:50:18+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" }, { "name": "react/promise", @@ -15449,33 +15779,34 @@ }, { "name": "slevomat/coding-standard", - "version": "8.15.0", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "7d1d957421618a3803b593ec31ace470177d7817" + "reference": "f2cc4c553eae68772624ffd7dd99022343b69c31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/7d1d957421618a3803b593ec31ace470177d7817", - "reference": "7d1d957421618a3803b593ec31ace470177d7817", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/f2cc4c553eae68772624ffd7dd99022343b69c31", + "reference": "f2cc4c553eae68772624ffd7dd99022343b69c31", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", - "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": "^1.23.1", - "squizlabs/php_codesniffer": "^3.9.0" + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^2.0", + "squizlabs/php_codesniffer": "^3.10.0" }, "require-dev": { - "phing/phing": "2.17.4", - "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.10.60", - "phpstan/phpstan-deprecation-rules": "1.1.4", - "phpstan/phpstan-phpunit": "1.3.16", - "phpstan/phpstan-strict-rules": "1.5.2", - "phpunit/phpunit": "8.5.21|9.6.8|10.5.11" - }, + "phing/phing": "3.0.0", + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/phpstan": "1.12.8", + "phpstan/phpstan-deprecation-rules": "1.2.1", + "phpstan/phpstan-phpunit": "1.4.0", + "phpstan/phpstan-strict-rules": "1.6.1", + "phpunit/phpunit": "9.6.8|10.5.38|11.4.3" + }, + "default-branch": true, "type": "phpcodesniffer-standard", "extra": { "branch-alias": { @@ -15498,7 +15829,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.15.0" + "source": "https://github.com/slevomat/coding-standard/tree/master" }, "funding": [ { @@ -15510,20 +15841,20 @@ "type": "tidelift" } ], - "time": "2024-03-09T15:20:58+00:00" + "time": "2024-11-08T15:15:07+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.2", + "version": "3.11.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" + "reference": "19473c30efe4f7b3cd42522d0b2e6e7f243c6f87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/19473c30efe4f7b3cd42522d0b2e6e7f243c6f87", + "reference": "19473c30efe4f7b3cd42522d0b2e6e7f243c6f87", "shasum": "" }, "require": { @@ -15590,20 +15921,20 @@ "type": "open_collective" } ], - "time": "2024-07-21T23:26:44+00:00" + "time": "2024-11-16T12:02:36+00:00" }, { "name": "symfony/browser-kit", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8" + "reference": "65d4b3fd9556e4b5b41287bef93c671f8f9f86ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/62ab90b92066ef6cce5e79365625b4b1432464c8", - "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/65d4b3fd9556e4b5b41287bef93c671f8f9f86ab", + "reference": "65d4b3fd9556e4b5b41287bef93c671f8f9f86ab", "shasum": "" }, "require": { @@ -15642,7 +15973,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.4.8" + "source": "https://github.com/symfony/browser-kit/tree/v6.4.13" }, "funding": [ { @@ -15658,7 +15989,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/config", @@ -15737,16 +16068,16 @@ }, { "name": "symfony/css-selector", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08" + "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4b61b02fe15db48e3687ce1c45ea385d1780fe08", - "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/cb23e97813c5837a041b73a6d63a9ddff0778f5e", + "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e", "shasum": "" }, "require": { @@ -15782,7 +16113,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.8" + "source": "https://github.com/symfony/css-selector/tree/v6.4.13" }, "funding": [ { @@ -15798,20 +16129,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "105b56a0305d219349edeb60a800082eca864e4b" + "reference": "ae074dffb018c37a57071990d16e6152728dd972" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/105b56a0305d219349edeb60a800082eca864e4b", - "reference": "105b56a0305d219349edeb60a800082eca864e4b", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ae074dffb018c37a57071990d16e6152728dd972", + "reference": "ae074dffb018c37a57071990d16e6152728dd972", "shasum": "" }, "require": { @@ -15849,7 +16180,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.8" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.13" }, "funding": [ { @@ -15865,7 +16196,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/dotenv", @@ -15943,16 +16274,16 @@ }, { "name": "symfony/lock", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "1387f50285c23607467c1f05b258bde65f1ab276" + "reference": "a69c3dd151ab7e14925f119164cfdf65d55392a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/1387f50285c23607467c1f05b258bde65f1ab276", - "reference": "1387f50285c23607467c1f05b258bde65f1ab276", + "url": "https://api.github.com/repos/symfony/lock/zipball/a69c3dd151ab7e14925f119164cfdf65d55392a4", + "reference": "a69c3dd151ab7e14925f119164cfdf65d55392a4", "shasum": "" }, "require": { @@ -16002,7 +16333,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v6.4.8" + "source": "https://github.com/symfony/lock/tree/v6.4.13" }, "funding": [ { @@ -16018,7 +16349,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-25T15:19:46+00:00" }, { "name": "symfony/options-resolver", @@ -16089,16 +16420,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.4.10", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "ad510515b11ba5291fdd59b25d70227bfac2d7ab" + "reference": "e6377bea5b114f70de6332fe935e160da5014ce8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/ad510515b11ba5291fdd59b25d70227bfac2d7ab", - "reference": "ad510515b11ba5291fdd59b25d70227bfac2d7ab", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e6377bea5b114f70de6332fe935e160da5014ce8", + "reference": "e6377bea5b114f70de6332fe935e160da5014ce8", "shasum": "" }, "require": { @@ -16151,7 +16482,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.10" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.13" }, "funding": [ { @@ -16167,24 +16498,24 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -16227,7 +16558,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -16243,24 +16574,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php82", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php82.git", - "reference": "77ff49780f56906788a88974867ed68bc49fae5b" + "reference": "5d2ed36f7734637dacc025f179698031951b1692" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/77ff49780f56906788a88974867ed68bc49fae5b", - "reference": "77ff49780f56906788a88974867ed68bc49fae5b", + "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/5d2ed36f7734637dacc025f179698031951b1692", + "reference": "5d2ed36f7734637dacc025f179698031951b1692", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -16303,7 +16634,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php82/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.31.0" }, "funding": [ { @@ -16319,7 +16650,59 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "tbachert/spi", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/Nevay/spi.git", + "reference": "2ddfaf815dafb45791a61b08170de8d583c16062" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nevay/spi/zipball/2ddfaf815dafb45791a61b08170de8d583c16062", + "reference": "2ddfaf815dafb45791a61b08170de8d583c16062", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "composer/semver": "^1.0 || ^2.0 || ^3.0", + "php": "^8.1" + }, + "require-dev": { + "composer/composer": "^2.0", + "infection/infection": "^0.27.9", + "phpunit/phpunit": "^10.5", + "psalm/phar": "^5.18" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-main": "0.2.x-dev" + }, + "class": "Nevay\\SPI\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Nevay\\SPI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Service provider loading facility", + "keywords": [ + "service provider" + ], + "support": { + "issues": "https://github.com/Nevay/spi/issues", + "source": "https://github.com/Nevay/spi/tree/v1.0.2" + }, + "time": "2024-10-04T16:36:12+00:00" }, { "name": "theseer/tokenizer", @@ -16684,6 +17067,7 @@ "minimum-stability": "dev", "stability-flags": { "drupal/monolog": 10, + "drupal/next": 10, "drupal/simplei": 10 }, "prefer-stable": true, diff --git a/drupal/recipes/wunder_base/config/menu_link_attributes.config.yml b/drupal/recipes/wunder_base/config/menu_link_attributes.config.yml index c5071469..9dca9c20 100644 --- a/drupal/recipes/wunder_base/config/menu_link_attributes.config.yml +++ b/drupal/recipes/wunder_base/config/menu_link_attributes.config.yml @@ -8,3 +8,6 @@ attributes: linkedin: Linkedin wunder: Wunder default_value: '' + container_class: + label: 'Container class(es)' + description: 'CSS class for the menu list item (<li>). Separate multiple classes by space.' diff --git a/drupal/recipes/wunder_next_setup/config/next.next_site.frontend.yml b/drupal/recipes/wunder_next_setup/config/next.next_site.frontend.yml index c0a92312..5c703242 100644 --- a/drupal/recipes/wunder_next_setup/config/next.next_site.frontend.yml +++ b/drupal/recipes/wunder_next_setup/config/next.next_site.frontend.yml @@ -4,7 +4,7 @@ dependencies: { } id: frontend label: 'Next.js frontend' base_url: 'http://localhost:3000' -preview_url: 'http://localhost:3000/api/preview' +preview_url: 'http://localhost:3000/api/draft' preview_secret: null revalidate_url: 'http://localhost:3000/api/revalidate' revalidate_secret: null diff --git a/drupal/web/modules/custom/phpunit_example/phpunit_example.info.yml b/drupal/web/modules/custom/phpunit_example/phpunit_example.info.yml deleted file mode 100644 index cd6abfe2..00000000 --- a/drupal/web/modules/custom/phpunit_example/phpunit_example.info.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: PHPUnit Example -type: module -description: Demontrates how to use PHPUnit-based tests. -package: Example modules -core_version_requirement: ^9 -dependencies: - - drupal:node diff --git a/drupal/web/modules/custom/phpunit_example/phpunit_example.module b/drupal/web/modules/custom/phpunit_example/phpunit_example.module deleted file mode 100644 index b02383de..00000000 --- a/drupal/web/modules/custom/phpunit_example/phpunit_example.module +++ /dev/null @@ -1,17 +0,0 @@ -assertEquals($sut->add(2, 3), 5); - } - - /** - * Test AddClass::add() with a data provider method. - * - * This method is very similar to testAdd(), but uses a data provider method - * to test with a wider range of data. - * - * You can tell PHPUnit which method is the data provider using the - * '@dataProvider' annotation. - * - * The data provider method just returns a big array of arrays of arguments. - * That is, for each time you want this test method run, the data provider - * should create an array of arguments for this method. In this case, it's - * $expected, $a, and $b. So one set of arguments would look a bit like this - * pseudocode: - * - * @code - * [ valueForExpected, valueForA, valueForB ] - * @endcode - * - * It would then wrap this up in a higher-level array, so that PHPUnit can - * loop through them, like this pseudocode: - * - * @code - * return [ [first, set], [next, set] ]; - * @endcode - * - * This test has a better methodology than testAdd(), because it can easily - * be adapted by other developers, and because it tries more than one data - * set. This test is much better than testAdd(), although it still only - * tests 'good' data. When combined with testAddWithBadDataProvider(), - * we get a better picture of the behavior of the method under test. - * - * @dataProvider addDataProvider - * - * @see self::addDataProvider() - */ - public function testAddWithDataProvider($expected, $a, $b) { - $sut = new AddClass(); - $this->assertEquals($expected, $sut->add($a, $b)); - } - - /** - * Test AddClass::add() with data that should throw an exception. - * - * This method is similar to testAddWithDataProvider(), but the data - * provider gives us data that should throw an exception. - * - * This test uses the setExpectedException() method to tell PHPUnit that - * a thrown exception should pass the test. You specify a - * fully-qualified exception class name. If you specify \Exception, PHPUnit - * will pass any exception, whereas a more specific subclass of \Exception - * will require that exception type to be thrown. - * - * Alternately, you can use try and catch blocks with assertions in order - * to test exceptions. We won't demonstrate that here; it's a much better - * idea to test your exceptions with setExpectedException(). - * - * @dataProvider addBadDataProvider - * - * @see self::addBadDataProvider() - */ - public function testAddWithBadDataProvider($a, $b) { - $sut = new AddClass(); - $this->expectException(\InvalidArgumentException::class); - $sut->add($a, $b); - } - - /** - * Data provider for testAddWithDataProvider(). - * - * Data provider methods take no arguments and return an array of data - * to use for tests. Each element of the array is another array, which - * corresponds to the arguments in the test method's signature. - * - * Note also that PHPUnit tries to run tests using methods that begin - * with 'test'. This means that data provider method names should not - * begin with 'test'. Also, by convention, they should end with - * 'DataProvider'. - * - * @return array - * Nested arrays of values to check: - * - $a - * - $b - * - $expected - * - * @see self::testAddWithDataProvider() - */ - public function addDataProvider() { - return [ - [5, 2, 3], - [50, 20, 30], - ]; - } - - /** - * Data provider for testAddWithBadDataProvider(). - * - * Since AddClass::add() can throw exceptions, it's time - * to give it some data that will cause these exceptions. - * - * add() should throw exceptions if either of it's arguments are - * not numeric, and we will generate some test data to prove that - * this is what it actually does. - * - * @see self::testAddWithBadDataProvider() - */ - public function addBadDataProvider() { - $bad_data = []; - // Set up an array with data that should cause add() - // to throw an exception. - $bad_data_types = ['string', FALSE, ['foo'], new \stdClass()]; - // Create some data where both $a and $b are bad types. - foreach ($bad_data_types as $bad_datum_a) { - foreach ($bad_data_types as $bad_datum_b) { - $bad_data[] = [$bad_datum_a, $bad_datum_b]; - } - } - // Create some data where $a is good and $b is bad. - foreach ($bad_data_types as $bad_datum_b) { - $bad_data[] = [1, $bad_datum_b]; - } - // Create some data where $b is good and $a is bad. - foreach ($bad_data_types as $bad_datum_a) { - $bad_data[] = [$bad_datum_a, 1]; - } - return $bad_data; - } - -} diff --git a/drupal/web/modules/custom/wunder_next/src/Commands/WunderNextCommands.php b/drupal/web/modules/custom/wunder_next/src/Commands/WunderNextCommands.php index 4f50ff4e..738294c5 100644 --- a/drupal/web/modules/custom/wunder_next/src/Commands/WunderNextCommands.php +++ b/drupal/web/modules/custom/wunder_next/src/Commands/WunderNextCommands.php @@ -3,8 +3,8 @@ namespace Drupal\wunder_next\Commands; use Consolidation\AnnotatedCommand\CommandError; -use Drupal\consumers\Entity\Consumer; use Drupal\Core\Entity\EntityStorageException; +use Drupal\consumers\Entity\Consumer; use Drupal\user\Entity\User; use Drush\Commands\DrushCommands; diff --git a/drupal/web/modules/custom/wunder_next/wunder_next.module b/drupal/web/modules/custom/wunder_next/wunder_next.module index bd8d8ccb..b74e448e 100644 --- a/drupal/web/modules/custom/wunder_next/wunder_next.module +++ b/drupal/web/modules/custom/wunder_next/wunder_next.module @@ -5,11 +5,11 @@ * Main module file for wunder_next. */ -use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Routing\TrustedRedirectResponse; use Drupal\Core\Site\Settings; use Drupal\Core\Url; +use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition; use Drupal\simple_oauth\Entities\AccessTokenEntity; use Drupal\user\Entity\User; @@ -27,7 +27,7 @@ function wunder_next_next_site_load($entities) { foreach ($entities as $next_site) { if ($next_site->id() == 'frontend') { $next_site->setBaseUrl($settings['frontend_url']); - $next_site->setPreviewUrl($settings['frontend_url'] . '/api/preview'); + $next_site->setPreviewUrl($settings['frontend_url'] . '/api/draft'); $next_site->setRevalidateUrl($settings['frontend_url'] . '/api/revalidate'); $next_site->setRevalidateSecret($settings['revalidate_secret']); } diff --git a/drupal/web/modules/custom/wunder_search/src/Controller/WunderSearchController.php b/drupal/web/modules/custom/wunder_search/src/Controller/WunderSearchController.php deleted file mode 100644 index f923b4c7..00000000 --- a/drupal/web/modules/custom/wunder_search/src/Controller/WunderSearchController.php +++ /dev/null @@ -1,70 +0,0 @@ -elasticsearchClient = $elasticsearch_client; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('elasticsearch_helper.elasticsearch_client') - ); - } - - /** - * Proxy the incoming search request from frontend client to elasticsearch. - */ - public function query(Request $request): JsonResponse { - $jsonRequest = $request->getContent(); - $params = json_decode($jsonRequest, TRUE); - // Get the index to query for depending on the language: - $current_language_id = $this->languageManager()->getCurrentLanguage()->getId(); - $index_name = "content-$current_language_id"; - try { - $results = $this->elasticsearchClient->search([ - 'index' => $index_name, - 'body' => $params, - ])->asObject(); - - // If we got results, return them in the response: - return new JsonResponse($results); - } - catch (ClientResponseException | ServerResponseException $e) { - $this->getLogger('wunder_search')->error($e->getMessage()); - return new JsonResponse([ - 'error' => $e->getMessage(), - ], 500); - } - } - -} diff --git a/drupal/web/modules/custom/wunder_search/wunder_search.routing.yml b/drupal/web/modules/custom/wunder_search/wunder_search.routing.yml deleted file mode 100644 index 722519ce..00000000 --- a/drupal/web/modules/custom/wunder_search/wunder_search.routing.yml +++ /dev/null @@ -1,8 +0,0 @@ -wunder_search.controller: - path: '/wunder_search/proxy' - methods: [POST,GET] - defaults: - _title: 'Elasticsearch proxy controller' - _controller: '\Drupal\wunder_search\Controller\WunderSearchController::query' - requirements: - _permission: 'access content' diff --git a/next/.eslintignore b/next/.eslintignore index bd041d2c..741fd006 100644 --- a/next/.eslintignore +++ b/next/.eslintignore @@ -1,4 +1,4 @@ storybook-static node_modules .next -lib/gql \ No newline at end of file +/src/lib/gql \ No newline at end of file diff --git a/next/.eslintrc.js b/next/.eslintrc.js index 69b5f84b..30e6aa40 100644 --- a/next/.eslintrc.js +++ b/next/.eslintrc.js @@ -28,7 +28,8 @@ module.exports = { files: ["**/*.{ts,tsx}"], parser: "@typescript-eslint/parser", parserOptions: { - project: "tsconfig.json", + project: "./tsconfig.json", + tsconfigRootDir: __dirname, }, env: { browser: true, @@ -56,6 +57,10 @@ module.exports = { "@typescript-eslint/no-unsafe-member-access": "off", "@typescript-eslint/no-unsafe-return": "off", "@typescript-eslint/restrict-template-expressions": "off", + "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/no-require-imports": "off", + "@typescript-eslint/no-unused-expressions": "off", + "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-misused-promises": [ "error", { @@ -81,18 +86,6 @@ module.exports = { }, ], - // Allow unused variables only if they start with `_` or `err`. - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - vars: "all", - varsIgnorePattern: "^_", - args: "after-used", - argsIgnorePattern: "^_|^err", - }, - ], - // Sort imports. "simple-import-sort/imports": [ "error", diff --git a/next/.gitignore b/next/.gitignore index 33096f5f..2a232e09 100644 --- a/next/.gitignore +++ b/next/.gitignore @@ -39,9 +39,7 @@ lerna-debug.log* # storybook /storybook-static -/cypress/screenshots/ -/cypress/videos/ # files generated by graphql-codegen -/lib/gql -/lib/graphql/schema.graphql +/src/lib/gql +/src/lib/graphql/schema.graphql diff --git a/next/.graphqlrc.yml b/next/.graphqlrc.yml index 5b83e6fa..0087fdba 100644 --- a/next/.graphqlrc.yml +++ b/next/.graphqlrc.yml @@ -1,3 +1,3 @@ # This file exposes the graphql schema and documents to the graphql.vscode-graphql and other compatible IDE extensions -schema: "./lib/graphql/schema.graphql" -documents: "lib/graphql/**/*.{js,ts,jsx,tsx}" +schema: "./src/lib/graphql/schema.graphql" +documents: "src/lib/graphql/**/*.{js,ts,jsx,tsx}" diff --git a/next/.storybook/i18n.ts b/next/.storybook/i18n.ts deleted file mode 100644 index 675d35b1..00000000 --- a/next/.storybook/i18n.ts +++ /dev/null @@ -1,11 +0,0 @@ -import i18n from "i18next"; -import Backend, { type HttpBackendOptions } from "i18next-http-backend"; - -import i18nConfig from "../next-i18next.config"; - -i18n.use(Backend).init({ - ...i18nConfig.i18n, - ...i18nConfig, -}); - -export default i18n; diff --git a/next/.storybook/main.ts b/next/.storybook/main.ts index 049828f6..ce111dff 100644 --- a/next/.storybook/main.ts +++ b/next/.storybook/main.ts @@ -1,11 +1,15 @@ import type { StorybookConfig } from "@storybook/nextjs"; const config: StorybookConfig = { - stories: ["../stories/**/*.mdx", "../stories/*.stories.@(js|jsx|ts|tsx)"], + stories: [ + "../src/stories/**/*.mdx", + "../src/stories/*.stories.@(js|jsx|ts|tsx)", + ], addons: [ "@storybook/addon-links", "@storybook/addon-essentials", "@storybook/addon-interactions", + "storybook-next-intl", ], framework: { name: "@storybook/nextjs", diff --git a/next/.storybook/next-intl.ts b/next/.storybook/next-intl.ts new file mode 100644 index 00000000..42561452 --- /dev/null +++ b/next/.storybook/next-intl.ts @@ -0,0 +1,12 @@ +import en from "../messages/en.json"; +import fi from "../messages/fi.json"; +import sv from "../messages/sv.json"; + +const messagesByLocale: Record = { en, fi, sv }; + +const nextIntl = { + defaultLocale: "en", + messagesByLocale, +}; + +export default nextIntl; diff --git a/next/.storybook/preview.tsx b/next/.storybook/preview.tsx index f892e114..907cac44 100644 --- a/next/.storybook/preview.tsx +++ b/next/.storybook/preview.tsx @@ -1,27 +1,8 @@ -import "../styles/globals.css"; +import "@/styles/globals.css"; -import React, { useEffect } from "react"; -import { type Preview, type StoryFn } from "@storybook/react"; -import { I18nextProvider } from "react-i18next"; +import { type Preview } from "@storybook/react"; -import i18n from "./i18n"; -import siteConfig from "../site.config"; - -/** Adapted from https://storybook.js.org/recipes/react-i18next */ -const withI18next = (Story, context) => { - const { locale } = context.globals; - - // When the locale global changes, set the new locale in i18n - useEffect(() => { - i18n.changeLanguage(locale); - }, [locale]); - - return ( - - - - ); -}; +import nextIntl from "./next-intl"; const preview: Preview = { parameters: { @@ -35,34 +16,16 @@ const preview: Preview = { date: /Date$/, }, }, - i18n, + nextIntl, }, - globalTypes: { - locale: { - name: "Locale", - description: "Internationalization locale", - toolbar: { - icon: "globe", - items: [ - { value: "en", title: "English" }, - { value: "fi", title: "Suomi" }, - { value: "sv", title: "Svenska" }, - ], - showName: true, - }, + initialGlobals: { + locale: "en", + locales: { + en: { icon: "๐Ÿ‡บ๐Ÿ‡ธ", title: "English", right: "EN" }, + fi: { icon: "๐Ÿ‡ซ๐Ÿ‡ฎ", title: "Finnish", right: "FI" }, + sv: { icon: "๐Ÿ‡ธ๐Ÿ‡ช", title: "Swedish", right: "SV" }, }, }, - globals: { - locale: siteConfig.defaultLocale, - locales: Object.entries(siteConfig.locales).reduce( - (acc, [key, { name }]) => { - acc[key] = name; - return acc; - }, - {}, - ), - }, - decorators: [withI18next], }; export default preview; diff --git a/next/.vscode/extensions.json b/next/.vscode/extensions.json index e221c11b..c2a396d4 100644 --- a/next/.vscode/extensions.json +++ b/next/.vscode/extensions.json @@ -4,7 +4,7 @@ "esbenp.prettier-vscode", "stylelint.vscode-stylelint", "bradlc.vscode-tailwindcss", - "graphql.vscode-graphql", + "graphql.vscode-graphql", // note: v0.9.3 is recommended for now, 0.11.0 has a bug: https://github.com/graphql/graphiql/issues/3620 "graphql.vscode-graphql-syntax" ] } diff --git a/next/cache-handler.mjs b/next/cache-handler.mjs index 64b057e4..7847fefb 100644 --- a/next/cache-handler.mjs +++ b/next/cache-handler.mjs @@ -4,30 +4,23 @@ import { CacheHandler } from "@neshca/cache-handler"; import createLruHandler from "@neshca/cache-handler/local-lru"; import createRedisHandler from "@neshca/cache-handler/redis-strings"; import { createClient } from "redis"; -import fs from "fs/promises"; -// We set this to a high value so redis will not automatically delete data on expiration, but keep it -// as stale for a long period. This way, Next will be able to use it for its stale-while-revalidate logic. -const defaultStaleAge = 3600 * 24 * 7; +// This should match the REVALIDATE_LONG value in src/lib/constants.ts +const defaultStaleAge = 60 * 10; -// This should be set to the same value of the constant of the same name in lib/constants.ts. -const REVALIDATE_LONG = 60 * 10; - -const REDIS_CACHE_PREPOPULATE_STATUS_KEY = "CACHE_PREPOPULATE_STATUS_"; -const REDIS_CACHE_PREPOPULATE_STATUS_VALUE_STARTED = "STARTED"; -const REDIS_CACHE_PREPOPULATE_STATUS_VALUE_COMPLETED = "COMPLETED"; -const REDIS_CACHE_PREPOPULATE_STATUS_VALUE_ERRORED = "ERRORED"; - -CacheHandler.onCreation(async ({ buildId, serverDistDir }) => { +CacheHandler.onCreation(async ({ buildId }) => { + /** @type {import("redis").RedisClientType | undefined} */ let client; + /** @type {import("@neshca/cache-handler").Handler | undefined} */ + let handler; if ( - // Ensure redis env vars are set: - process.env.REDIS_HOST && - process.env.REDIS_PASS && // Do not create the Redis handler during the build phase. // It has little benefit and can cause issues: https://github.com/caching-tools/next-shared-cache/issues/284 - process.env.NEXT_PHASE !== "phase-production-build" + process.env.NEXT_PHASE !== "phase-production-build" && + // Ensure redis env vars are set: + process.env.REDIS_HOST && + process.env.REDIS_PASS ) { try { // Create a Redis client. @@ -41,209 +34,70 @@ CacheHandler.onCreation(async ({ buildId, serverDistDir }) => { // Redis won't work without error handling. client.on("error", (e) => { - throw e; + console.error("Redis client error:", e); }); } catch (error) { console.warn("Failed to create Redis client:", error); } - } - - if (client) { - try { - console.info("Connecting Redis client..."); - - // Wait for the client to connect. - // Caveat: This will block the server from starting until the client is connected. - // And there is no timeout. Make your own timeout if needed. - await client.connect(); - console.info("Redis client connected."); - } catch (error) { - console.warn("Failed to connect Redis client:", error); - - console.warn("Disconnecting the Redis client..."); - // Try to disconnect the client to stop it from reconnecting. - client - .disconnect() - .then(() => { - console.info("Redis client disconnected."); - }) - .catch(() => { - console.warn( - "Failed to quit the Redis client after failing to connect.", - ); - }); - } - } - - /** @type {import("@neshca/cache-handler").Handler | undefined} */ - let handler; - - if (client?.isReady) { - /** @type {import("@neshca/cache-handler/redis-strings").CreateRedisStringsHandlerOptions} */ - const redisHandlerOptions = { - client, - keyPrefix: `cache-${buildId}:`, - sharedTagsKey: "_sharedTags_", - // timeout for the Redis client operations like `get` and `set` - // after this timeout, the operation will be considered failed and the `localHandler` will be used - timeoutMs: 3000, - }; - // Create the Redis Handler if the client is available and connected. - handler = await createRedisHandler(redisHandlerOptions); - - /** - * This code will run only when the cache handler is created, so it's a good place to populate the cache. - * We want to do this only once per deployment even if there are more than one nodejs container running, unless - * a previous attempt failed. For this reason we store in Redis a special key that stores the status of the cache population process, - * and use it to determine if the operation should be skipped. - */ - - // Get the status of the initial cache population from Redis: - const statusKey = REDIS_CACHE_PREPOPULATE_STATUS_KEY + buildId; - const prepopulateCacheStatus = await client - .get(REDIS_CACHE_PREPOPULATE_STATUS_KEY + buildId) - .catch((error) => { - console.error( - "Redis handler: error while reading from Redis. error:", - error.message, - ); - }); - - // If the cache population was already started or completed, we skip the operation altogether: - if ( - prepopulateCacheStatus && - prepopulateCacheStatus !== REDIS_CACHE_PREPOPULATE_STATUS_VALUE_ERRORED - ) { - console.log( - `Redis handler: Skipping initial cache population, because status is: ${prepopulateCacheStatus}`, - ); - } else { + if (client) { try { - // Set Redis switch to indicate that the initial cache population has started: - await client.set( - statusKey, - REDIS_CACHE_PREPOPULATE_STATUS_VALUE_STARTED, - ); - - // Pages files are stored in the `pages` folder in the build cache: - const pagesDir = serverDistDir + "/pages/"; - // Find all HTML files in the pages folder: - const pageHtmlFiles = await findAllHtmlFilesInFolder(pagesDir); - - console.log( - `Redis handler: ${pageHtmlFiles.length} HTML page files found in build cache`, - ); - - // Each HTML file corresponds to a cached page. We will read the HTML content, the modification date of the file, and the - // corresponding JSON file with the page data. With this information we can create a cache entry for each page. - pageHtmlFiles.forEach(async (file) => { - fs.readFile(pagesDir + file, "utf8").then(async (html) => { - // Get the modification time of the file: - const stats = await fs.stat(pagesDir + file); - const htmlFileLastModifiedTime = Math.round(stats.mtimeMs / 1000); - - // If the file was created more than REVALIDATE_LONG seconds ago, there's little value in caching it in REDIS, so we skip it: - if ( - htmlFileLastModifiedTime < - Math.round(Date.now() / 1000) - REVALIDATE_LONG - ) { - console.log( - `Redis handler: file ${file} was modified more than ${REVALIDATE_LONG} seconds ago, so it would need revalidation already, skipping it`, - ); - return; - } + console.info("Connecting Redis client..."); - const path = file.replace(".html", ""); - // The JSON file has the same path as the HTML file, but with a .json extension: - const jsonPath = path + ".json"; - console.log( - `Redis handler: creating a redis cache key for ${path}`, - ); - - // The redis key is the path of the page, with a leading slash: - await handler?.set("/" + path, { - value: { - kind: "PAGE", // hard coded value - html, - // For pageData, we need to read the contents of the JSON file to an object: - pageData: JSON.parse( - await fs.readFile(pagesDir + jsonPath, "utf8"), - ), - // We do not need to override these here, but they are required according to the types: - postponed: undefined, - headers: undefined, - status: undefined, - }, - tags: [], // No tags in pages - lastModified: htmlFileLastModifiedTime * 1000, // Unlike values below, this should be in milliseconds - lifespan: { - lastModifiedAt: htmlFileLastModifiedTime, - staleAge: defaultStaleAge, - expireAge: defaultStaleAge, - staleAt: htmlFileLastModifiedTime + defaultStaleAge, - expireAt: htmlFileLastModifiedTime + defaultStaleAge, - revalidate: REVALIDATE_LONG, - }, - }); - }); - }); - - // Set a switch in Redis to indicate that the initial cache population completed successfully: - await client.set( - statusKey, - REDIS_CACHE_PREPOPULATE_STATUS_VALUE_COMPLETED, - ); + // Wait for the client to connect. + // Caveat: This will block the server from starting until the client is connected. + // And there is no timeout. Make your own timeout if needed. + await client.connect(); + console.info("Redis client connected."); } catch (error) { - // Set a switch in Redis to indicate that the initial cache population errored: - await client - .set(statusKey, REDIS_CACHE_PREPOPULATE_STATUS_VALUE_ERRORED) - .catch((error) => { - console.error( - "Error while writing to redis. error:", - error.message, + console.warn("Failed to connect Redis client:", error); + + console.warn("Disconnecting the Redis client..."); + // Try to disconnect the client to stop it from reconnecting. + client + .disconnect() + .then(() => { + console.info("Redis client disconnected."); + }) + .catch(() => { + console.warn( + "Failed to quit the Redis client after failing to connect.", ); }); - - console.error( - "Error while populating initial redis cache. Error message:", - error.message, - ); } } - } - /** - * Fallback to LRU handler if Redis is not available. - * - * The application will "work", but the cache will be in memory only and not shared. - * If this happens in an environment with multiple containers, it will result - * in various issues such as 404s during clientside navigation due to missing page data. - * - * It's recommended to set up an automated alert here, so it can be fixed as soon as possible. - */ - if (!client?.isReady || !handler) { - handler = createLruHandler(); - console.warn( - "Falling back to LRU handler because Redis client is not available.", - ); + if (client?.isReady) { + /** @type {import("@neshca/cache-handler/redis-strings").CreateRedisStringsHandlerOptions} */ + const redisHandlerOptions = { + client, + keyPrefix: `cache-${buildId}:`, + sharedTagsKey: "_sharedTags_", + // timeout for the Redis client operations like `get` and `set` + // after this timeout, the operation will be considered failed and the `localHandler` will be used + timeoutMs: 3000, + }; + + // Create the Redis Handler if the client is available and connected. + handler = await createRedisHandler(redisHandlerOptions); + console.info("Redis handler created."); + } else { + // Fallback to LRU handler if Redis client is not available. + // The application will still work, but the cache will be in memory only and not shared. + handler = createLruHandler(); + console.warn( + "Falling back to LRU handler because Redis client is not available.", + ); + } } return { handlers: [handler], ttl: { defaultStaleAge, - estimateExpireAge: () => defaultStaleAge, + estimateExpireAge: (staleAge) => staleAge * 2, }, }; }); export default CacheHandler; - -// Helper function to find all HTML files in a folder recursively -const findAllHtmlFilesInFolder = async (folderPath) => { - const files = await fs.readdir(folderPath, { - recursive: true, - }); - return files.filter((file) => file.endsWith(".html")); -}; diff --git a/next/codegen.ts b/next/codegen.ts index 768e6983..f5d0e73b 100644 --- a/next/codegen.ts +++ b/next/codegen.ts @@ -22,16 +22,20 @@ const config: CodegenConfig = { }, }, ], - documents: ["lib/graphql/**/*.ts", "!./node_modules/**/*", "!./.next/**/*"], + documents: [ + "src/lib/graphql/**/*.ts", + "!./node_modules/**/*", + "!./.next/**/*", + ], ignoreNoDocuments: true, // for better experience with the watcher generates: { - "./lib/gql/": { + "./src/lib/gql/": { preset: "client", presetConfig: { fragmentMasking: false, }, }, - "./lib/graphql/schema.graphql": { + "./src/lib/graphql/schema.graphql": { plugins: ["schema-ast"], config: { includeDirectives: true, diff --git a/next/components.json b/next/components.json new file mode 100644 index 00000000..5118e427 --- /dev/null +++ b/next/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/styles/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/next/components/article/article-teaser.tsx b/next/components/article/article-teaser.tsx deleted file mode 100644 index b2570e68..00000000 --- a/next/components/article/article-teaser.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import Image from "next/image"; -import Link from "next/link"; -import { useRouter } from "next/router"; -import { useTranslation } from "next-i18next"; - -import type { FragmentArticleTeaserFragment } from "@/lib/gql/graphql"; -import { formatDateTimestamp } from "@/lib/utils"; -interface ArticleTeaserProps { - article: FragmentArticleTeaserFragment; -} - -export function ArticleTeaser({ article }: ArticleTeaserProps) { - const { t } = useTranslation(); - const author = article.author?.name; - const router = useRouter(); - const date = formatDateTimestamp(article.created.timestamp, router.locale); - return ( - -

- {article.title} -

-
- {author && <>{t("posted-by", { author })} - } - {date} -
- {article.image && ( - {article.image.alt} - )} - - ); -} diff --git a/next/components/article/article-teasers.tsx b/next/components/article/article-teasers.tsx deleted file mode 100644 index 314b0acd..00000000 --- a/next/components/article/article-teasers.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import Link from "next/link"; -import { useTranslation } from "next-i18next"; -import clsx from "clsx"; - -import { ArticleTeaser } from "@/components/article/article-teaser"; -import type { FragmentArticleTeaserFragment } from "@/lib/gql/graphql"; -import ArrowIcon from "@/styles/icons/arrow-down.svg"; - -import { buttonVariants } from "@/ui/button"; - -interface LatestArticlesProps { - articles?: FragmentArticleTeaserFragment[]; - heading: string; -} - -export function ArticleTeasers({ articles, heading }: LatestArticlesProps) { - const { t } = useTranslation(); - return ( - <> -

- {heading} -

-
    - {articles?.map((article) => ( -
  • - -
  • - ))} -
-
- {!articles?.length &&

{t("no-content-found")}

} - {articles?.length && ( - - {t("all-articles")} - - - )} -
- - ); -} diff --git a/next/components/article/articles-listing.tsx b/next/components/article/articles-listing.tsx deleted file mode 100644 index 6f4bfd29..00000000 --- a/next/components/article/articles-listing.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { useRouter } from "next/router"; -import { useTranslation } from "next-i18next"; -import { useQuery } from "@tanstack/react-query"; - -import { ArticleTeaser } from "@/components/article/article-teaser"; -import { LoadingSpinner } from "@/components/loading-spinner"; -import type { FragmentArticleTeaserFragment } from "@/lib/gql/graphql"; - -export function ArticlesListing({ - listingId, - limit, -}: { - listingId: string; - limit: number; -}) { - const { t } = useTranslation(); - const router = useRouter(); - - const { data, isLoading } = useQuery({ - queryKey: [`articles-${router.locale}-${listingId}`], - queryFn: async () => { - const response = await fetch( - `/api/articles-listing/${router.locale}?limit=${limit}`, - { - headers: { - "accept-language": router.locale, - }, - }, - ); - - return await response.json(); - }, - }); - - return ( - <> - {isLoading && } -
    - {!isLoading && - data?.map((article: FragmentArticleTeaserFragment) => ( -
  • - -
  • - ))} -
- {!data?.length && !isLoading && ( -

{t("no-content-found")}

- )} - - ); -} diff --git a/next/components/footer/footer.tsx b/next/components/footer/footer.tsx deleted file mode 100644 index 82676db8..00000000 --- a/next/components/footer/footer.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import Link from "next/link"; -import { useRouter } from "next/router"; - -import { SocialShare } from "@/components/footer/social-share"; -import Facebook from "@/styles/icons/facebook.svg"; -import LinkedIn from "@/styles/icons/linkedin.svg"; -import Twitter from "@/styles/icons/twitter.svg"; -import WunderCarrot from "@/styles/icons/wunder-carrot.svg"; -import type { MenuItemType, MenuType } from "@/types/graphql"; - -interface FooterProps { - menu: MenuType; -} - -export function Footer({ menu }: FooterProps) { - // Only show the menu items that match the current locale: - const { locale } = useRouter(); - const filteredItems = menu.items?.filter( - (link) => link.langcode?.id == locale, - ); - return ( -
-
- -
-
- ); -} - -interface FooterLinkProps { - href: MenuItemType["url"]; - icon?: MenuItemType["attributes"]["icon"]; - newTab?: boolean; - children: React.ReactNode; -} - -function FooterLink({ href, icon, newTab = false, children }: FooterLinkProps) { - const [target, rel] = newTab ? ["_blank", "noreferrer"] : []; - const Icon = { - facebook: Facebook, - linkedin: LinkedIn, - twitter: Twitter, - wunder: WunderCarrot, - }[icon]; - - return ( - - {icon && ( -
- -
- )} - {children} - - ); -} diff --git a/next/components/forms/contact-form.tsx b/next/components/forms/contact-form.tsx deleted file mode 100644 index 3dea3fdd..00000000 --- a/next/components/forms/contact-form.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { useRouter } from "next/router"; -import { useTranslation } from "next-i18next"; -import { useForm } from "react-hook-form"; - -import { AuthGate } from "@/components/auth-gate"; - -import { Button } from "@/ui/button"; -import { Input } from "@/ui/input"; -import { Label } from "@/ui/label"; -import { StatusMessage } from "@/ui/status-message"; -import { Textarea } from "@/ui/textarea"; - -type Inputs = { - name: string; - email: string; - subject: string; - message: string; -}; - -export function ContactForm() { - const router = useRouter(); - const { t } = useTranslation(); - const { - register, - handleSubmit, - reset, - formState: { isSubmitSuccessful }, - } = useForm(); - - const onSubmit = async (data: Inputs) => { - const response = await fetch(`/api/contact`, { - method: "POST", - body: JSON.stringify({ - name: data.name, - email: data.email, - message: data.message, - subject: data.subject, - }), - // This will record the submission with the right language: - headers: { - "accept-language": router.locale, - }, - }); - - if (!response.ok) { - alert("Error!"); - } - }; - - const onErrors = (errors) => console.error(errors); - - if (isSubmitSuccessful) { - return ( - -

{t("form-thank-you-message")}

- -
- ); - } - - return ( -
-

- {t("form-title")} -

- - <> -

{t("form-description")}

-
- - -
-
- - -
-
- - -
-
- -