From 75ceb46363e9fa6f9dc2dd6478b5363a2b2b63f7 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Thu, 13 Jun 2024 14:40:04 +0200 Subject: [PATCH 01/18] feat: add frankenphp library --- backend/docker/frankenphp/Caddyfile | 55 +++++++++++++++++ backend/docker/frankenphp/conf.d/app.dev.ini | 5 ++ backend/docker/frankenphp/conf.d/app.ini | 13 ++++ backend/docker/frankenphp/conf.d/app.prod.ini | 2 + .../docker/frankenphp/docker-entrypoint.sh | 60 +++++++++++++++++++ backend/docker/frankenphp/worker.Caddyfile | 3 + 6 files changed, 138 insertions(+) create mode 100644 backend/docker/frankenphp/Caddyfile create mode 100644 backend/docker/frankenphp/conf.d/app.dev.ini create mode 100644 backend/docker/frankenphp/conf.d/app.ini create mode 100644 backend/docker/frankenphp/conf.d/app.prod.ini create mode 100644 backend/docker/frankenphp/docker-entrypoint.sh create mode 100644 backend/docker/frankenphp/worker.Caddyfile diff --git a/backend/docker/frankenphp/Caddyfile b/backend/docker/frankenphp/Caddyfile new file mode 100644 index 00000000..83839304 --- /dev/null +++ b/backend/docker/frankenphp/Caddyfile @@ -0,0 +1,55 @@ +{ + {$CADDY_GLOBAL_OPTIONS} + + frankenphp { + {$FRANKENPHP_CONFIG} + } + + # https://caddyserver.com/docs/caddyfile/directives#sorting-algorithm + order mercure after encode + order vulcain after reverse_proxy + order php_server before file_server +} + +{$CADDY_EXTRA_CONFIG} + +{$SERVER_NAME:localhost} { + log { + # Redact the authorization query parameter that can be set by Mercure + format filter { + wrap console + fields { + uri query { + replace authorization REDACTED + } + } + } + } + + root * /app/public + encode zstd br gzip + + mercure { + # Transport to use (default to Bolt) + transport_url {$MERCURE_TRANSPORT_URL:bolt:///data/mercure.db} + # Publisher JWT key + publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG} + # Subscriber JWT key + subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG} + # Allow anonymous subscribers (double-check that it's what you want) + anonymous + # Enable the subscription API (double-check that it's what you want) + subscriptions + # Extra directives + {$MERCURE_EXTRA_DIRECTIVES} + } + + vulcain + + {$CADDY_SERVER_EXTRA_DIRECTIVES} + + # Disable Topics tracking if not enabled explicitly: https://github.com/jkarlin/topics + header ?Permissions-Policy "browsing-topics=()" + + php_server +} diff --git a/backend/docker/frankenphp/conf.d/app.dev.ini b/backend/docker/frankenphp/conf.d/app.dev.ini new file mode 100644 index 00000000..e50f43d0 --- /dev/null +++ b/backend/docker/frankenphp/conf.d/app.dev.ini @@ -0,0 +1,5 @@ +; See https://docs.docker.com/desktop/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host +; See https://github.com/docker/for-linux/issues/264 +; The `client_host` below may optionally be replaced with `discover_client_host=yes` +; Add `start_with_request=yes` to start debug session on each request +xdebug.client_host = host.docker.internal diff --git a/backend/docker/frankenphp/conf.d/app.ini b/backend/docker/frankenphp/conf.d/app.ini new file mode 100644 index 00000000..79a17dd8 --- /dev/null +++ b/backend/docker/frankenphp/conf.d/app.ini @@ -0,0 +1,13 @@ +expose_php = 0 +date.timezone = UTC +apc.enable_cli = 1 +session.use_strict_mode = 1 +zend.detect_unicode = 0 + +; https://symfony.com/doc/current/performance.html +realpath_cache_size = 4096K +realpath_cache_ttl = 600 +opcache.interned_strings_buffer = 16 +opcache.max_accelerated_files = 20000 +opcache.memory_consumption = 256 +opcache.enable_file_override = 1 diff --git a/backend/docker/frankenphp/conf.d/app.prod.ini b/backend/docker/frankenphp/conf.d/app.prod.ini new file mode 100644 index 00000000..3bcaa71e --- /dev/null +++ b/backend/docker/frankenphp/conf.d/app.prod.ini @@ -0,0 +1,2 @@ +opcache.preload_user = root +opcache.preload = /app/config/preload.php diff --git a/backend/docker/frankenphp/docker-entrypoint.sh b/backend/docker/frankenphp/docker-entrypoint.sh new file mode 100644 index 00000000..9823560f --- /dev/null +++ b/backend/docker/frankenphp/docker-entrypoint.sh @@ -0,0 +1,60 @@ +#!/bin/sh +set -e + +if [ "$1" = 'frankenphp' ] || [ "$1" = 'php' ] || [ "$1" = 'bin/console' ]; then + # Install the project the first time PHP is started + # After the installation, the following block can be deleted + if [ ! -f composer.json ]; then + rm -Rf tmp/ + composer create-project "symfony/skeleton $SYMFONY_VERSION" tmp --stability="$STABILITY" --prefer-dist --no-progress --no-interaction --no-install + + cd tmp + cp -Rp . .. + cd - + rm -Rf tmp/ + + composer require "php:>=$PHP_VERSION" runtime/frankenphp-symfony + composer config --json extra.symfony.docker 'true' + + if grep -q ^DATABASE_URL= .env; then + echo "To finish the installation please press Ctrl+C to stop Docker Compose and run: docker compose up --build -d --wait" + sleep infinity + fi + fi + + if [ -z "$(ls -A 'vendor/' 2>/dev/null)" ]; then + composer install --prefer-dist --no-progress --no-interaction + fi + + if grep -q ^DATABASE_URL= .env; then + echo "Waiting for database to be ready..." + ATTEMPTS_LEFT_TO_REACH_DATABASE=60 + until [ $ATTEMPTS_LEFT_TO_REACH_DATABASE -eq 0 ] || DATABASE_ERROR=$(php bin/console dbal:run-sql -q "SELECT 1" 2>&1); do + if [ $? -eq 255 ]; then + # If the Doctrine command exits with 255, an unrecoverable error occurred + ATTEMPTS_LEFT_TO_REACH_DATABASE=0 + break + fi + sleep 1 + ATTEMPTS_LEFT_TO_REACH_DATABASE=$((ATTEMPTS_LEFT_TO_REACH_DATABASE - 1)) + echo "Still waiting for database to be ready... Or maybe the database is not reachable. $ATTEMPTS_LEFT_TO_REACH_DATABASE attempts left." + done + + if [ $ATTEMPTS_LEFT_TO_REACH_DATABASE -eq 0 ]; then + echo "The database is not up or not reachable:" + echo "$DATABASE_ERROR" + exit 1 + else + echo "The database is now ready and reachable" + fi + + if [ "$( find ./migrations -iname '*.php' -print -quit )" ]; then + php bin/console doctrine:migrations:migrate --no-interaction --all-or-nothing + fi + fi + + setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX var + setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX var +fi + +exec docker-php-entrypoint "$@" diff --git a/backend/docker/frankenphp/worker.Caddyfile b/backend/docker/frankenphp/worker.Caddyfile new file mode 100644 index 00000000..eaea1892 --- /dev/null +++ b/backend/docker/frankenphp/worker.Caddyfile @@ -0,0 +1,3 @@ +worker { + file ./public/index.php +} From 645577748ec0139c5fbcb7e3506f0f52495d67cf Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Thu, 13 Jun 2024 14:41:21 +0200 Subject: [PATCH 02/18] feat: update composer --- backend/composer.json | 2 +- backend/composer.lock | 124 +++++++++++++++++++++--------------------- backend/symfony.lock | 30 +++++----- 3 files changed, 77 insertions(+), 79 deletions(-) diff --git a/backend/composer.json b/backend/composer.json index b63cb563..19bd2070 100644 --- a/backend/composer.json +++ b/backend/composer.json @@ -5,6 +5,7 @@ "prefer-stable": true, "require": { "php": ">=8.2", + "symfony/security-bundle": "7.0.*", "ext-ctype": "*", "ext-iconv": "*", "doctrine/dbal": "^4", @@ -38,7 +39,6 @@ "symfony/property-access": "7.0.*", "symfony/property-info": "7.1.*", "symfony/runtime": "7.0.*", - "symfony/security-bundle": "7.0.*", "symfony/serializer": "7.0.*", "symfony/stimulus-bundle": "^2.16", "symfony/string": "7.1.*", diff --git a/backend/composer.lock b/backend/composer.lock index 4e38b7be..5cc0bd23 100644 --- a/backend/composer.lock +++ b/backend/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": "40c969c46db458e74f78ce8ce021390f", + "content-hash": "73758e7ca9bdb4754e1b8a290cc0e43d", "packages": [ { "name": "composer/semver", @@ -268,16 +268,16 @@ }, { "name": "doctrine/dbal", - "version": "4.0.2", + "version": "4.0.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "61d79c6e379a39dc1fea6b4e50a23dfc3cd2076a" + "reference": "8edbce73bc1aa2251ba8c754fc440f8e02c661bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/61d79c6e379a39dc1fea6b4e50a23dfc3cd2076a", - "reference": "61d79c6e379a39dc1fea6b4e50a23dfc3cd2076a", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/8edbce73bc1aa2251ba8c754fc440f8e02c661bc", + "reference": "8edbce73bc1aa2251ba8c754fc440f8e02c661bc", "shasum": "" }, "require": { @@ -290,16 +290,16 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "1.10.58", - "phpstan/phpstan-phpunit": "1.3.15", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "10.5.9", - "psalm/plugin-phpunit": "0.18.4", + "phpstan/phpstan": "1.11.1", + "phpstan/phpstan-phpunit": "1.4.0", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "10.5.20", + "psalm/plugin-phpunit": "0.19.0", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.9.0", + "squizlabs/php_codesniffer": "3.9.2", "symfony/cache": "^6.3.8|^7.0", "symfony/console": "^5.4|^6.3|^7.0", - "vimeo/psalm": "5.21.1" + "vimeo/psalm": "5.24.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -356,7 +356,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.0.2" + "source": "https://github.com/doctrine/dbal/tree/4.0.3" }, "funding": [ { @@ -372,7 +372,7 @@ "type": "tidelift" } ], - "time": "2024-04-25T08:29:52+00:00" + "time": "2024-06-12T06:58:42+00:00" }, { "name": "doctrine/deprecations", @@ -1915,16 +1915,16 @@ }, { "name": "nelmio/api-doc-bundle", - "version": "v4.26.2", + "version": "v4.27.0", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioApiDocBundle.git", - "reference": "9379c44da4b4e6ef36a81f3135d3d158838a7c16" + "reference": "221a1febaf861435b51c80cffd1a78efb4168345" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/9379c44da4b4e6ef36a81f3135d3d158838a7c16", - "reference": "9379c44da4b4e6ef36a81f3135d3d158838a7c16", + "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/221a1febaf861435b51c80cffd1a78efb4168345", + "reference": "221a1febaf861435b51c80cffd1a78efb4168345", "shasum": "" }, "require": { @@ -1935,16 +1935,16 @@ "psr/cache": "^1.0 || ^2.0 || ^3.0", "psr/container": "^1.0 || ^2.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.4 || ^7.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.4 || ^7.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/framework-bundle": "^5.4.24 || ^6.0 || ^7.0", - "symfony/http-foundation": "^5.4 || ^6.0 || ^7.0", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", - "symfony/property-info": "^5.4.10 || ^6.0 || ^7.0", - "symfony/routing": "^5.4 || ^6.0 || ^7.0", + "symfony/framework-bundle": "^5.4.24 || ^6.4 || ^7.0", + "symfony/http-foundation": "^5.4 || ^6.4 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", + "symfony/property-info": "^5.4.10 || ^6.4 || ^7.0", + "symfony/routing": "^5.4 || ^6.4 || ^7.0", "zircote/swagger-php": "^4.6.1" }, "conflict": { @@ -1963,20 +1963,21 @@ "phpstan/phpstan-strict-rules": "^1.5", "phpstan/phpstan-symfony": "^1.3", "phpunit/phpunit": "^9.6 || ^10.5", - "symfony/asset": "^5.4 || ^6.0 || ^7.0", - "symfony/browser-kit": "^5.4 || ^6.0 || ^7.0", - "symfony/cache": "^5.4 || ^6.0 || ^7.0", - "symfony/dom-crawler": "^5.4 || ^6.0 || ^7.0", - "symfony/expression-language": "^5.4 || ^6.0 || ^7.0", - "symfony/form": "^5.4 || ^6.0 || ^7.0", + "symfony/asset": "^5.4 || ^6.4 || ^7.0", + "symfony/browser-kit": "^5.4 || ^6.4 || ^7.0", + "symfony/cache": "^5.4 || ^6.4 || ^7.0", + "symfony/dom-crawler": "^5.4 || ^6.4 || ^7.0", + "symfony/expression-language": "^5.4 || ^6.4 || ^7.0", + "symfony/form": "^5.4 || ^6.4 || ^7.0", "symfony/phpunit-bridge": "^6.4", - "symfony/property-access": "^5.4 || ^6.0 || ^7.0", - "symfony/security-csrf": "^5.4 || ^6.0 || ^7.0", - "symfony/serializer": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", - "symfony/templating": "^5.4 || ^6.0 || ^7.0", - "symfony/twig-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/property-access": "^5.4 || ^6.4 || ^7.0", + "symfony/security-csrf": "^5.4 || ^6.4 || ^7.0", + "symfony/serializer": "^5.4 || ^6.4 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0", + "symfony/templating": "^5.4 || ^6.4 || ^7.0", + "symfony/twig-bundle": "^5.4 || ^6.4 || ^7.0", + "symfony/uid": "^5.4 || ^6.4 || ^7.0", + "symfony/validator": "^5.4 || ^6.4 || ^7.0", "willdurand/hateoas-bundle": "^1.0 || ^2.0" }, "suggest": { @@ -2024,9 +2025,9 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioApiDocBundle/issues", - "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.26.2" + "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.27.0" }, - "time": "2024-05-29T07:12:15+00:00" + "time": "2024-06-12T23:47:19+00:00" }, { "name": "nelmio/cors-bundle", @@ -7224,16 +7225,16 @@ }, { "name": "symfony/stimulus-bundle", - "version": "v2.18.0", + "version": "v2.18.1", "source": { "type": "git", "url": "https://github.com/symfony/stimulus-bundle.git", - "reference": "9323437da427e123d8f9b76b19fa9a60a76d45a0" + "reference": "017b60e036c366c8ce0e77864d5aabab436ad73d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/9323437da427e123d8f9b76b19fa9a60a76d45a0", - "reference": "9323437da427e123d8f9b76b19fa9a60a76d45a0", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/017b60e036c366c8ce0e77864d5aabab436ad73d", + "reference": "017b60e036c366c8ce0e77864d5aabab436ad73d", "shasum": "" }, "require": { @@ -7273,7 +7274,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/stimulus-bundle/tree/v2.18.0" + "source": "https://github.com/symfony/stimulus-bundle/tree/v2.18.1" }, "funding": [ { @@ -7289,7 +7290,7 @@ "type": "tidelift" } ], - "time": "2024-06-01T17:50:20+00:00" + "time": "2024-06-11T13:21:54+00:00" }, { "name": "symfony/stopwatch", @@ -8925,16 +8926,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -8942,11 +8943,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -8972,7 +8974,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -8980,7 +8982,7 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nikic/php-parser", @@ -9483,16 +9485,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.2.0", + "version": "11.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "705eba0190afe04bc057f565ad843267717cf109" + "reference": "1b8775732e9c401bda32df3ffbdf90dec7533ceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/705eba0190afe04bc057f565ad843267717cf109", - "reference": "705eba0190afe04bc057f565ad843267717cf109", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1b8775732e9c401bda32df3ffbdf90dec7533ceb", + "reference": "1b8775732e9c401bda32df3ffbdf90dec7533ceb", "shasum": "" }, "require": { @@ -9563,7 +9565,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.2.0" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.2.1" }, "funding": [ { @@ -9579,7 +9581,7 @@ "type": "tidelift" } ], - "time": "2024-06-07T04:48:50+00:00" + "time": "2024-06-11T07:30:35+00:00" }, { "name": "sebastian/cli-parser", diff --git a/backend/symfony.lock b/backend/symfony.lock index 1fd1c0a5..79e74b95 100644 --- a/backend/symfony.lock +++ b/backend/symfony.lock @@ -1,6 +1,6 @@ { "doctrine/doctrine-bundle": { - "version": "2.11", + "version": "2.12", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -22,7 +22,7 @@ "ref": "1f5514cfa15b947298df4d771e694e578d4c204d" }, "files": [ - "./src/DataFixtures/AppFixtures.php" + "src/DataFixtures/AppFixtures.php" ] }, "doctrine/doctrine-migrations-bundle": { @@ -39,7 +39,7 @@ ] }, "lexik/jwt-authentication-bundle": { - "version": "2.20", + "version": "3.0", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -57,11 +57,7 @@ "branch": "main", "version": "3.0", "ref": "c8e0c38e1a280ab9e37587a8fa32b251d5bc1c94" - }, - "files": [ - "./config/packages/nelmio_api_doc.yaml", - "./config/routes/nelmio_api_doc.yaml" - ] + } }, "nelmio/cors-bundle": { "version": "2.4", @@ -76,7 +72,7 @@ ] }, "phpunit/phpunit": { - "version": "9.6", + "version": "11.2", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -105,12 +101,12 @@ ] }, "symfony/console": { - "version": "7.0", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "5.3", - "ref": "da0c8be8157600ad34f10ff0c9cc91232522e047" + "ref": "1781ff40d8a17d87cf53f8d4cf0c8346ed2bb461" }, "files": [ "bin/console" @@ -172,7 +168,7 @@ ] }, "symfony/maker-bundle": { - "version": "1.55", + "version": "1.60", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -217,7 +213,7 @@ ] }, "symfony/phpunit-bridge": { - "version": "7.0", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -258,7 +254,7 @@ ] }, "symfony/stimulus-bundle": { - "version": "2.16", + "version": "2.18", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -298,7 +294,7 @@ ] }, "symfony/ux-turbo": { - "version": "v2.16.0" + "version": "v2.18.0" }, "symfony/validator": { "version": "7.0", @@ -313,7 +309,7 @@ ] }, "symfony/web-profiler-bundle": { - "version": "7.0", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -326,6 +322,6 @@ ] }, "twig/extra-bundle": { - "version": "v3.8.0" + "version": "v3.10.0" } } From 30db0e265dad38bac8464627f9ee8e79c43fbb14 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Thu, 13 Jun 2024 14:42:27 +0200 Subject: [PATCH 03/18] feat: dockerize php with franken php --- backend/Dockerfile | 94 ++++++++++++++++++++++++++++++++++++++++++++ backend/compose.yaml | 54 +++++++++++++++++++------ 2 files changed, 136 insertions(+), 12 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index e69de29b..84701979 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -0,0 +1,94 @@ +#syntax=docker/dockerfile:1.4 + +# Versions +FROM dunglas/frankenphp:1-php8.3 AS frankenphp_upstream + +# The different stages of this Dockerfile are meant to be built into separate images +# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage +# https://docs.docker.com/compose/compose-file/#target + + +# Base FrankenPHP image +FROM frankenphp_upstream AS frankenphp_base + +WORKDIR /app + +VOLUME /app/var + +# persistent / runtime deps +# hadolint ignore=DL3008 +RUN apt-get update && apt-get install -y --no-install-recommends \ + acl \ + file \ + gettext \ + git \ + && rm -rf /var/lib/apt/lists/* + +RUN set -eux; \ + install-php-extensions \ + @composer \ + apcu \ + intl \ + opcache \ + zip \ + gd \ + ldap \ + pdo_mysql \ + ; + +# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser +ENV COMPOSER_ALLOW_SUPERUSER=1 + +###> recipes ### +###< recipes ### + +COPY --link docker/frankenphp/conf.d/app.ini $PHP_INI_DIR/conf.d/ +COPY --link --chmod=755 docker/frankenphp/docker-entrypoint.sh /usr/local/bin/docker-entrypoint +COPY --link docker/frankenphp/Caddyfile /etc/caddy/Caddyfile + +ENTRYPOINT ["docker-entrypoint"] + +HEALTHCHECK --start-period=60s CMD curl -f http://localhost:2019/metrics || exit 1 +CMD [ "frankenphp", "run", "--config", "/etc/caddy/Caddyfile" ] + +# Dev FrankenPHP image +FROM frankenphp_base AS frankenphp_dev + +#ENV APP_ENV=dev XDEBUG_MODE=off + +RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" + +RUN set -eux; \ + install-php-extensions \ + xdebug \ + ; + +COPY --link docker/frankenphp/conf.d/app.dev.ini $PHP_INI_DIR/conf.d/ + +CMD [ "frankenphp", "run", "--config", "/etc/caddy/Caddyfile", "--watch" ] + +# Prod FrankenPHP image +FROM frankenphp_base AS frankenphp_prod + +ENV APP_ENV=prod +#ENV FRANKENPHP_CONFIG="import worker.Caddyfile" + +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" + +COPY --link docker/frankenphp/conf.d/app.prod.ini $PHP_INI_DIR/conf.d/ +#COPY --link frankenphp/worker.Caddyfile /etc/caddy/worker.Caddyfile + +# prevent the reinstallation of vendors at every changes in the source code +COPY --link composer.* symfony.* ./ +RUN set -eux; \ + composer update --no-cache --prefer-dist --no-autoloader --no-scripts --no-progress + +# copy sources +COPY --link . ./ +RUN rm -Rf frankenphp/ + +RUN set -eux; \ + mkdir -p var/cache var/log; \ + composer dump-autoload --classmap-authoritative; \ + composer dump-env prod; \ + chmod +x bin/console; sync; diff --git a/backend/compose.yaml b/backend/compose.yaml index 1918653c..532fe357 100644 --- a/backend/compose.yaml +++ b/backend/compose.yaml @@ -1,27 +1,55 @@ -version: '3' - services: db: image: mysql:latest + container_name: 'mysql_db' ports: - "${BIND_PORT}:3306" volumes: - mysql_data:/var/lib/mysql + - ./docker/db/data:/var/lib/mysql:rw environment: MYSQL_ROOT_PASSWORD: ${SECRET_PASSWORD} MYSQL_DATABASE: schulbuchaktion MYSQL_USER: ${USERNAME} MYSQL_PASSWORD: ${SECRET_PASSWORD} - nuxt-nginx: + php: build: - context: ../frontend + context: ./ dockerfile: Dockerfile - container_name: nuxt-nginx - ports: - - "3001:3001" + image: ${IMAGES_PREFIX:-}backend_php + container_name: backend_php + restart: unless-stopped environment: - - BACKEND_API=http://localhost:8000/api/v1 + APP_ENV: ${APP_ENV} + SERVER_NAME: ${SERVER_NAME}, php:80 + MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} + MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} + TRUSTED_PROXIES: ${TRUSTED_PROXIES} + TRUSTED_HOSTS: ${TRUSTED_HOSTS} + # Run "composer require symfony/orm-pack" to install and configure Doctrine ORM + DATABASE_URL: ${DATABASE_URL} + # Run "composer require symfony/mercure-bundle" to install and configure the Mercure integration + MERCURE_URL: ${CADDY_MERCURE_URL} + MERCURE_PUBLIC_URL: ${CADDY_MERCURE_PUBLIC_URL} + MERCURE_JWT_SECRET: ${CADDY_MERCURE_JWT_SECRET} + # The two next lines can be removed after initial installation + SYMFONY_VERSION: ${SYMFONY_VERSION:-} + STABILITY: ${STABILITY:-stable} + volumes: + - caddy_data:/data + - caddy_config:/config + - ./:/app:rw + + ports: + # HTTP + - target: 80 + published: ${HTTP_PORT} + protocol: tcp + # HTTPS + - target: 443 + published: ${HTTPS_PORT} + protocol: tcp openldap: image: osixia/openldap:latest @@ -31,9 +59,9 @@ services: - "389:389" - "636:636" volumes: - - ./data/certificates:/container/service/slapd/assets/certs - - ./data/slapd/database:/var/lib/ldap - - ./data/slapd/config:/etc/ldap/slapd.d + - ./docker/data/certificates:/container/service/slapd/assets/certs + - ./docker/data/slapd/database:/var/lib/ldap + - ./docker/data/slapd/config:/etc/ldap/slapd.d environment: - LDAP_ORGANISATION=schulbuchaktion - LDAP_DOMAIN=schulbuchaktion.env @@ -55,7 +83,7 @@ services: container_name: phpldapadmin hostname: phpldapadmin ports: - - "80:80" + - "8080:80" environment: - PHPLDAPADMIN_LDAP_HOSTS=openldap - PHPLDAPADMIN_HTTPS=false @@ -66,6 +94,8 @@ services: volumes: mysql_data: + caddy_data: + caddy_config: networks: openldap: From 899f85c5e54edb95153876e38c726ca3a836f103 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Thu, 13 Jun 2024 14:42:44 +0200 Subject: [PATCH 04/18] chore: delete compose override --- backend/compose.override.yaml | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 backend/compose.override.yaml diff --git a/backend/compose.override.yaml b/backend/compose.override.yaml deleted file mode 100644 index 4e610211..00000000 --- a/backend/compose.override.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# TODO: Check if this is needed -#version: '3' -# -#services: -####> doctrine/doctrine-bundle ### -# database: -# ports: -# - "5432" -####< doctrine/doctrine-bundle ### -# -####> symfony/mailer ### -# mailer: -# image: axllent/mailpit -# ports: -# - "1025" -# - "8025" -# environment: -# MP_SMTP_AUTH_ACCEPT_ANY: 1 -# MP_SMTP_AUTH_ALLOW_INSECURE: 1 -####< symfony/mailer ### From d9855f77054c1385f28c2d4da64f0ab3afc000d6 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Thu, 13 Jun 2024 14:43:07 +0200 Subject: [PATCH 05/18] feat: update gitignore --- backend/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/.gitignore b/backend/.gitignore index c1d5f48f..b6ca0e93 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -27,4 +27,4 @@ ###> lexik/jwt-authentication-bundle ### /config/jwt/*.pem ###< lexik/jwt-authentication-bundle ### -/data/ +/docker From 5cb9452c4c8b2a49b568b0ff30b2099fe030b059 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Thu, 13 Jun 2024 14:43:32 +0200 Subject: [PATCH 06/18] feat: create docker compose for nginx --- frontend/compose.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 frontend/compose.yaml diff --git a/frontend/compose.yaml b/frontend/compose.yaml new file mode 100644 index 00000000..db8710d6 --- /dev/null +++ b/frontend/compose.yaml @@ -0,0 +1,10 @@ +services: + nuxt-nginx: + build: + context: ./ + dockerfile: Dockerfile + container_name: nuxt-nginx + ports: + - "3001:3001" + environment: + - BACKEND_API=http://localhost:8000/api/v1 From cb02d7d21f98ccb5912267f67f096763aeebf527 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Thu, 13 Jun 2024 14:43:48 +0200 Subject: [PATCH 07/18] feat: create main compose file in project root --- compose.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 compose.yaml diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 00000000..9614ed7b --- /dev/null +++ b/compose.yaml @@ -0,0 +1,8 @@ +include: + - path: frontend/compose.yaml + project_directory: frontend/ + env_file: frontend/.env + + - path: backend/compose.yaml + project_directory: backend/ + env_file: backend/.env From c0ee0b82624381ef00d9b25c6f0edfb4ae18014b Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Mon, 17 Jun 2024 15:33:22 +0200 Subject: [PATCH 08/18] feat: changed timezone to Europe/Vienna --- backend/docker/frankenphp/conf.d/app.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/docker/frankenphp/conf.d/app.ini b/backend/docker/frankenphp/conf.d/app.ini index 79a17dd8..958ae0db 100644 --- a/backend/docker/frankenphp/conf.d/app.ini +++ b/backend/docker/frankenphp/conf.d/app.ini @@ -1,5 +1,5 @@ expose_php = 0 -date.timezone = UTC +date.timezone = Europe/Vienna apc.enable_cli = 1 session.use_strict_mode = 1 zend.detect_unicode = 0 From 4938b666d82e9330e91b9e1a0114f5229b17f7bc Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Mon, 17 Jun 2024 15:33:52 +0200 Subject: [PATCH 09/18] feat: changed logging to a file and not into console --- backend/docker/frankenphp/Caddyfile | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/backend/docker/frankenphp/Caddyfile b/backend/docker/frankenphp/Caddyfile index 83839304..9901744f 100644 --- a/backend/docker/frankenphp/Caddyfile +++ b/backend/docker/frankenphp/Caddyfile @@ -15,16 +15,13 @@ {$SERVER_NAME:localhost} { log { - # Redact the authorization query parameter that can be set by Mercure - format filter { - wrap console - fields { - uri query { - replace authorization REDACTED - } - } - } - } + output file /var/log/caddy/access.log { + roll_size 10MB + roll_keep 10 + roll_keep_for 336h + } + level ERROR + } root * /app/public encode zstd br gzip From f93649b402d19c785bd2cc8e43149b951888fda0 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Mon, 17 Jun 2024 15:34:40 +0200 Subject: [PATCH 10/18] feat: every console output goes into dev/null --- backend/docker/frankenphp/docker-entrypoint.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/docker/frankenphp/docker-entrypoint.sh b/backend/docker/frankenphp/docker-entrypoint.sh index 9823560f..c4b37598 100644 --- a/backend/docker/frankenphp/docker-entrypoint.sh +++ b/backend/docker/frankenphp/docker-entrypoint.sh @@ -53,8 +53,6 @@ if [ "$1" = 'frankenphp' ] || [ "$1" = 'php' ] || [ "$1" = 'bin/console' ]; then fi fi - setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX var - setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX var fi -exec docker-php-entrypoint "$@" +exec docker-php-entrypoint "$@" > /dev/null 2>&1 From cbe320b0c1f1b27537b732c317bb7c791e13ef3f Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Mon, 17 Jun 2024 15:35:11 +0200 Subject: [PATCH 11/18] feat: adapt docker file --- backend/Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 84701979..0e6da06b 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -13,12 +13,9 @@ FROM frankenphp_upstream AS frankenphp_base WORKDIR /app -VOLUME /app/var - # persistent / runtime deps # hadolint ignore=DL3008 RUN apt-get update && apt-get install -y --no-install-recommends \ - acl \ file \ gettext \ git \ @@ -88,7 +85,6 @@ COPY --link . ./ RUN rm -Rf frankenphp/ RUN set -eux; \ - mkdir -p var/cache var/log; \ composer dump-autoload --classmap-authoritative; \ composer dump-env prod; \ chmod +x bin/console; sync; From a7c870b3359dfe35b939852db9f2d8d2ed5e7c7e Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Mon, 17 Jun 2024 15:35:42 +0200 Subject: [PATCH 12/18] feat: delete console log in config and add own channels to config file --- backend/config/packages/monolog.yaml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/backend/config/packages/monolog.yaml b/backend/config/packages/monolog.yaml index ee1fad06..a38d9f60 100644 --- a/backend/config/packages/monolog.yaml +++ b/backend/config/packages/monolog.yaml @@ -61,12 +61,18 @@ when@prod: path: php://stderr level: debug formatter: monolog.formatter.json - console: - type: console - process_psr_3_messages: false - channels: [ "!event", "!doctrine" ] deprecation: type: stream channels: [ deprecation ] path: php://stderr formatter: monolog.formatter.json + security: + level: notice + type: stream + path: '%kernel.logs_dir%/security.log' + channels: [ security ] + action: + level: notice + type: stream + path: '%kernel.logs_dir%/action.log' + channels: [ action ] From ad806813226751f883c29b4b52aa9902d3b86b6d Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Mon, 17 Jun 2024 15:37:23 +0200 Subject: [PATCH 13/18] feat: add shell verbosity level to env variables and create shared network for containers --- backend/compose.yaml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/compose.yaml b/backend/compose.yaml index 532fe357..505adb89 100644 --- a/backend/compose.yaml +++ b/backend/compose.yaml @@ -12,6 +12,8 @@ services: MYSQL_DATABASE: schulbuchaktion MYSQL_USER: ${USERNAME} MYSQL_PASSWORD: ${SECRET_PASSWORD} + networks: + - container_network php: build: @@ -22,6 +24,7 @@ services: restart: unless-stopped environment: APP_ENV: ${APP_ENV} + SHELL_VERBOSITY: ${SHELL_VERBOSITY} SERVER_NAME: ${SERVER_NAME}, php:80 MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} @@ -50,6 +53,8 @@ services: - target: 443 published: ${HTTPS_PORT} protocol: tcp + networks: + - container_network openldap: image: osixia/openldap:latest @@ -76,7 +81,7 @@ services: - LDAP_READONLY_USER_USERNAME=testuser - LDAP_READONLY_USER_PASSWORD=aaaAAA123 networks: - - openldap + - container_network phpldapadmin: image: osixia/phpldapadmin:latest @@ -90,7 +95,7 @@ services: depends_on: - openldap networks: - - openldap + - container_network volumes: mysql_data: @@ -98,5 +103,5 @@ volumes: caddy_config: networks: - openldap: + container_network: driver: bridge From 17ea697b7c0a606c7486a2735e255284196a88e8 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Mon, 17 Jun 2024 15:38:18 +0200 Subject: [PATCH 14/18] feat: adapt logic in middleware --- backend/src/Middleware/SecurityMiddleware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/Middleware/SecurityMiddleware.php b/backend/src/Middleware/SecurityMiddleware.php index 3d7c061e..255a25e2 100644 --- a/backend/src/Middleware/SecurityMiddleware.php +++ b/backend/src/Middleware/SecurityMiddleware.php @@ -46,7 +46,7 @@ public function onKernelRequest(RequestEvent $event): void $this->logger->warning('Permission denied!', ["token"=>$bearer, "ip"=>$request->getClientIp(), "route"=>$request->getRequestUri()]); $response = new Response('Not permitted for this Action', Response::HTTP_UNAUTHORIZED); $event->setResponse($response); - } else if (str_ends_with($request->getRequestUri(), "/")) { + } else if (!str_ends_with($request->getRequestUri(), "/")) { $this->logger->alert("Accessing Route: " . $request->getRequestUri(), ["token"=>$bearer, "route"=>"$requestUri"]); } } From e8654ff54798cfdbd8f337a0bbcf7f616c9dcad9 Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Tue, 18 Jun 2024 12:22:50 +0200 Subject: [PATCH 15/18] feat: optimized backend docker compose --- backend/compose.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/compose.yaml b/backend/compose.yaml index 505adb89..7745b9fd 100644 --- a/backend/compose.yaml +++ b/backend/compose.yaml @@ -17,9 +17,8 @@ services: php: build: - context: ./ + context: . dockerfile: Dockerfile - image: ${IMAGES_PREFIX:-}backend_php container_name: backend_php restart: unless-stopped environment: From ac0498406a12c06a91a1e17ad7e03a0605813bdb Mon Sep 17 00:00:00 2001 From: mploierMacBook Date: Wed, 19 Jun 2024 21:37:55 +0200 Subject: [PATCH 16/18] docs: add docs for dockerization of php and symfony --- docs/developers/setup.md | 48 +- docs/pnpm-lock.yaml | 1246 ++++++++++++++++++++------------------ 2 files changed, 692 insertions(+), 602 deletions(-) diff --git a/docs/developers/setup.md b/docs/developers/setup.md index e0aa40fb..9c846655 100644 --- a/docs/developers/setup.md +++ b/docs/developers/setup.md @@ -78,26 +78,34 @@ cd backend Create a `.env` file and checkout the `.env.example`. Copy the content into your `.env` and replace the following fields with your own. You may edit some existing fields aswell. -| Field | Description | -|---------------------------|--------------------------------------------------------------------------------------------| -| `APP_SECRET` | A secret key that's used to secure your application's services. | -| `SECRET_PASSWORD` | Database password | -| `USERNAME` | Database user | -| `BIND_PORT` | Database port | -| `DATABASE_URL` | The URL String to your database. It will use the env variables above. | -| `LDAP_PORT` | The port of your LDAP server. | -| `LDAP_URL` | The URL of your LDAP server. | -| `LDAP_BASE` | The base of your LDAP server. (`dc=schulbuchaktion,dc=env`) | -| `ROLES` | String of all roles seperated with commas (default `'SBA_ADMIN,SBA_LEHRER,SBA_FV,SBA_AV'`) | -| `SBA_ADMIN` | Group number of the admin group. (default `500`) | -| `SBA_LEHRER` | Group number of the teacher group. (default `501`) | -| `SBA_FV` | Group number of the subject responsible group. (default `502`) | -| `SBA_AV` | Group number of the head of department group. (default `503`) | -| `TOKEN_TIMEOUT` | How long a token is valid. (default `1800`) | -| `HOURS_AHEAD` | Timezone (default `2`) | -| `JWT_SECRET_ABSOLUT_PATH` | The absolute path to the private key for the JWT. | -| `CORS_ALLOW_ORIGIN` | The origin that is allowed to access the API. (default `localhost`) | -| `TOKEN_NAME` | Name of Cookie which contains bearer token (default `bearer`) | +| Field | Description | +|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------| +| `APP_SECRET` | A secret key that's used to secure your application's services. | +| `SECRET_PASSWORD` | Database password | +| `USERNAME` | Database user | +| `BIND_PORT` | Database port | +| `DATABASE_URL` | The URL String to your database. It will use the env variables above. | +| `LDAP_PORT` | The port of your LDAP server. | +| `LDAP_URL` | The URL of your LDAP server. | +| `LDAP_BASE` | The base of your LDAP server. (`dc=schulbuchaktion,dc=env`) | +| `ROLES` | String of all roles seperated with commas (default `'SBA_ADMIN,SBA_LEHRER,SBA_FV,SBA_AV'`) | +| `SBA_ADMIN` | Group number of the admin group. (default `500`) | +| `SBA_LEHRER` | Group number of the teacher group. (default `501`) | +| `SBA_FV` | Group number of the subject responsible group. (default `502`) | +| `SBA_AV` | Group number of the head of department group. (default `503`) | +| `TOKEN_TIMEOUT` | How long a token is valid. (default `1800`) | +| `HOURS_AHEAD` | Timezone (default `2`) | +| `JWT_SECRET_ABSOLUT_PATH` | The absolute path to the private key for the JWT. | +| `CORS_ALLOW_ORIGIN` | The origin that is allowed to access the API. (default `localhost`) | +| `TOKEN_NAME` | Name of Cookie which contains bearer token (default `bearer`) | +| `CADDY_MERCURE_JWT_SECRET` | Used to securely sign JWTs for client authentication and authorization in a Caddy server setup with Mercure. | +| `TRUSTED_PROXIES` | Specifies the IP addresses or ranges of proxies that are trusted to correctly set client-related headers in a server configuration. | +| `TRUSTED_HOSTS` | Specifies a list of hostnames or patterns that are considered trusted and allowed to make requests. | +| `CADDY_MERCURE_URL` | Specifies the URL of the Mercure hub used by the Caddy server. | +| `CADDY_MERCURE_PUBLIC_URL` | Specifies the publicly accessible URL of the Mercure hub. | +| `HTTP_PORT` | Port which will be open for http connections. (default `80`) | +| `HTTPS_PORT` | Port which will be open for https connections. (default `443`) | +| `SHELL_VERBOSITY` | Verbosity level of server and symfony. (default `0`) | ::: danger For the `APP_SECRET` checkout https://symfony.com/doc/current/reference/configuration/framework.html#secret to see the diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index f888f805..151c0b2b 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -1,211 +1,108 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -devDependencies: - vitepress: - specifier: 1.2.3 - version: 1.2.3(@algolia/client-search@4.23.3)(search-insights@2.13.0) +importers: + + .: + devDependencies: + vitepress: + specifier: 1.2.3 + version: 1.2.3(@algolia/client-search@4.23.3)(search-insights@2.13.0) packages: - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0): + '@algolia/autocomplete-core@1.9.3': resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - dev: true - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0): + '@algolia/autocomplete-plugin-algolia-insights@1.9.3': resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) - search-insights: 2.13.0 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - dev: true - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3): + '@algolia/autocomplete-preset-algolia@1.9.3': resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) - '@algolia/client-search': 4.23.3 - algoliasearch: 4.23.3 - dev: true - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3): + '@algolia/autocomplete-shared@1.9.3': resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/client-search': 4.23.3 - algoliasearch: 4.23.3 - dev: true - /@algolia/cache-browser-local-storage@4.23.3: + '@algolia/cache-browser-local-storage@4.23.3': resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} - dependencies: - '@algolia/cache-common': 4.23.3 - dev: true - /@algolia/cache-common@4.23.3: + '@algolia/cache-common@4.23.3': resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} - dev: true - /@algolia/cache-in-memory@4.23.3: + '@algolia/cache-in-memory@4.23.3': resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} - dependencies: - '@algolia/cache-common': 4.23.3 - dev: true - /@algolia/client-account@4.23.3: + '@algolia/client-account@4.23.3': resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} - dependencies: - '@algolia/client-common': 4.23.3 - '@algolia/client-search': 4.23.3 - '@algolia/transporter': 4.23.3 - dev: true - /@algolia/client-analytics@4.23.3: + '@algolia/client-analytics@4.23.3': resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} - dependencies: - '@algolia/client-common': 4.23.3 - '@algolia/client-search': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/transporter': 4.23.3 - dev: true - /@algolia/client-common@4.23.3: + '@algolia/client-common@4.23.3': resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} - dependencies: - '@algolia/requester-common': 4.23.3 - '@algolia/transporter': 4.23.3 - dev: true - /@algolia/client-personalization@4.23.3: + '@algolia/client-personalization@4.23.3': resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} - dependencies: - '@algolia/client-common': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/transporter': 4.23.3 - dev: true - /@algolia/client-search@4.23.3: + '@algolia/client-search@4.23.3': resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} - dependencies: - '@algolia/client-common': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/transporter': 4.23.3 - dev: true - /@algolia/logger-common@4.23.3: + '@algolia/logger-common@4.23.3': resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} - dev: true - /@algolia/logger-console@4.23.3: + '@algolia/logger-console@4.23.3': resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} - dependencies: - '@algolia/logger-common': 4.23.3 - dev: true - /@algolia/recommend@4.23.3: + '@algolia/recommend@4.23.3': resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} - dependencies: - '@algolia/cache-browser-local-storage': 4.23.3 - '@algolia/cache-common': 4.23.3 - '@algolia/cache-in-memory': 4.23.3 - '@algolia/client-common': 4.23.3 - '@algolia/client-search': 4.23.3 - '@algolia/logger-common': 4.23.3 - '@algolia/logger-console': 4.23.3 - '@algolia/requester-browser-xhr': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/requester-node-http': 4.23.3 - '@algolia/transporter': 4.23.3 - dev: true - /@algolia/requester-browser-xhr@4.23.3: + '@algolia/requester-browser-xhr@4.23.3': resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} - dependencies: - '@algolia/requester-common': 4.23.3 - dev: true - /@algolia/requester-common@4.23.3: + '@algolia/requester-common@4.23.3': resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} - dev: true - /@algolia/requester-node-http@4.23.3: + '@algolia/requester-node-http@4.23.3': resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} - dependencies: - '@algolia/requester-common': 4.23.3 - dev: true - /@algolia/transporter@4.23.3: + '@algolia/transporter@4.23.3': resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} - dependencies: - '@algolia/cache-common': 4.23.3 - '@algolia/logger-common': 4.23.3 - '@algolia/requester-common': 4.23.3 - dev: true - /@babel/helper-string-parser@7.24.1: + '@babel/helper-string-parser@7.24.1': resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.24.5: + '@babel/helper-validator-identifier@7.24.5': resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/parser@7.24.5: + '@babel/parser@7.24.5': resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.24.5 - dev: true - /@babel/types@7.24.5: + '@babel/types@7.24.5': resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 - dev: true - /@docsearch/css@3.6.0: + '@docsearch/css@3.6.0': resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} - dev: true - /@docsearch/js@3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0): + '@docsearch/js@3.6.0': resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} - dependencies: - '@docsearch/react': 3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0) - preact: 10.22.0 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - dev: true - /@docsearch/react@3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0): + '@docsearch/react@3.6.0': resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -221,512 +118,300 @@ packages: optional: true search-insights: optional: true - dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) - '@docsearch/css': 3.6.0 - algoliasearch: 4.23.3 - search-insights: 2.13.0 - transitivePeerDependencies: - - '@algolia/client-search' - dev: true - /@esbuild/aix-ppc64@0.20.2: + '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.20.2: + '@esbuild/android-arm64@0.20.2': resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.20.2: + '@esbuild/android-arm@0.20.2': resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.20.2: + '@esbuild/android-x64@0.20.2': resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.20.2: + '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.20.2: + '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.20.2: + '@esbuild/freebsd-arm64@0.20.2': resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.20.2: + '@esbuild/freebsd-x64@0.20.2': resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.20.2: + '@esbuild/linux-arm64@0.20.2': resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.20.2: + '@esbuild/linux-arm@0.20.2': resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.20.2: + '@esbuild/linux-ia32@0.20.2': resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.20.2: + '@esbuild/linux-loong64@0.20.2': resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.20.2: + '@esbuild/linux-mips64el@0.20.2': resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.20.2: + '@esbuild/linux-ppc64@0.20.2': resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.20.2: + '@esbuild/linux-riscv64@0.20.2': resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.20.2: + '@esbuild/linux-s390x@0.20.2': resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.20.2: + '@esbuild/linux-x64@0.20.2': resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.20.2: + '@esbuild/netbsd-x64@0.20.2': resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.20.2: + '@esbuild/openbsd-x64@0.20.2': resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.20.2: + '@esbuild/sunos-x64@0.20.2': resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.20.2: + '@esbuild/win32-arm64@0.20.2': resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.20.2: + '@esbuild/win32-ia32@0.20.2': resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.20.2: + '@esbuild/win32-x64@0.20.2': resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@jridgewell/sourcemap-codec@1.4.15: + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - /@rollup/rollup-android-arm-eabi@4.17.2: + '@rollup/rollup-android-arm-eabi@4.17.2': resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.17.2: + '@rollup/rollup-android-arm64@4.17.2': resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.17.2: + '@rollup/rollup-darwin-arm64@4.17.2': resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.17.2: + '@rollup/rollup-darwin-x64@4.17.2': resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.17.2: + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.17.2: + '@rollup/rollup-linux-arm-musleabihf@4.17.2': resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.17.2: + '@rollup/rollup-linux-arm64-gnu@4.17.2': resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.17.2: + '@rollup/rollup-linux-arm64-musl@4.17.2': resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.17.2: + '@rollup/rollup-linux-riscv64-gnu@4.17.2': resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-s390x-gnu@4.17.2: + '@rollup/rollup-linux-s390x-gnu@4.17.2': resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.17.2: + '@rollup/rollup-linux-x64-gnu@4.17.2': resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-musl@4.17.2: + '@rollup/rollup-linux-x64-musl@4.17.2': resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.17.2: + '@rollup/rollup-win32-arm64-msvc@4.17.2': resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.17.2: + '@rollup/rollup-win32-ia32-msvc@4.17.2': resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.17.2: + '@rollup/rollup-win32-x64-msvc@4.17.2': resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@shikijs/core@1.6.3: + '@shikijs/core@1.6.3': resolution: {integrity: sha512-QnJKHFUW95GnlJLJGP6QLx4M69HM0KlXk+R2Y8lr/x4nAx1Yb/lsuxq4XwybuUjTxbJk+BT0g/kvn0bcsjGGHg==} - dev: true - /@shikijs/transformers@1.6.3: + '@shikijs/transformers@1.6.3': resolution: {integrity: sha512-ptBuP/IIeqCzK3zZO/knFICZWs58uZWzbv7ND+bKOewe5NcCjZfSiMyzFwOyl23ewPJ1APjRBwLi6Asrodmmxw==} - dependencies: - shiki: 1.6.3 - dev: true - /@types/estree@1.0.5: + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - /@types/linkify-it@5.0.0: + '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - dev: true - /@types/markdown-it@14.1.1: + '@types/markdown-it@14.1.1': resolution: {integrity: sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==} - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - dev: true - /@types/mdurl@2.0.0: + '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - dev: true - /@types/web-bluetooth@0.0.20: + '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - dev: true - /@vitejs/plugin-vue@5.0.5(vite@5.2.13)(vue@3.4.27): + '@vitejs/plugin-vue@5.0.5': resolution: {integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 vue: ^3.2.25 - dependencies: - vite: 5.2.13 - vue: 3.4.27 - dev: true - /@vue/compiler-core@3.4.27: + '@vue/compiler-core@3.4.27': resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} - dependencies: - '@babel/parser': 7.24.5 - '@vue/shared': 3.4.27 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.0 - dev: true - /@vue/compiler-dom@3.4.27: + '@vue/compiler-dom@3.4.27': resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} - dependencies: - '@vue/compiler-core': 3.4.27 - '@vue/shared': 3.4.27 - dev: true - /@vue/compiler-sfc@3.4.27: + '@vue/compiler-sfc@3.4.27': resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} - dependencies: - '@babel/parser': 7.24.5 - '@vue/compiler-core': 3.4.27 - '@vue/compiler-dom': 3.4.27 - '@vue/compiler-ssr': 3.4.27 - '@vue/shared': 3.4.27 - estree-walker: 2.0.2 - magic-string: 0.30.10 - postcss: 8.4.38 - source-map-js: 1.2.0 - dev: true - /@vue/compiler-ssr@3.4.27: + '@vue/compiler-ssr@3.4.27': resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} - dependencies: - '@vue/compiler-dom': 3.4.27 - '@vue/shared': 3.4.27 - dev: true - /@vue/devtools-api@7.2.1(vue@3.4.27): + '@vue/devtools-api@7.2.1': resolution: {integrity: sha512-6oNCtyFOrNdqm6GUkFujsCgFlpbsHLnZqq7edeM/+cxAbMyCWvsaCsIMUaz7AiluKLccCGEM8fhOsjaKgBvb7g==} - dependencies: - '@vue/devtools-kit': 7.2.1(vue@3.4.27) - transitivePeerDependencies: - - vue - dev: true - /@vue/devtools-kit@7.2.1(vue@3.4.27): + '@vue/devtools-kit@7.2.1': resolution: {integrity: sha512-Wak/fin1X0Q8LLIfCAHBrdaaB+R6IdpSXsDByPHbQ3BmkCP0/cIo/oEGp9i0U2+gEqD4L3V9RDjNf1S34DTzQQ==} peerDependencies: vue: ^3.0.0 - dependencies: - '@vue/devtools-shared': 7.2.1 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - vue: 3.4.27 - dev: true - /@vue/devtools-shared@7.2.1: + '@vue/devtools-shared@7.2.1': resolution: {integrity: sha512-PCJF4UknJmOal68+X9XHyVeQ+idv0LFujkTOIW30+GaMJqwFVN9LkQKX4gLqn61KkGMdJTzQ1bt7EJag3TI6AA==} - dependencies: - rfdc: 1.3.1 - dev: true - /@vue/reactivity@3.4.27: + '@vue/reactivity@3.4.27': resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} - dependencies: - '@vue/shared': 3.4.27 - dev: true - /@vue/runtime-core@3.4.27: + '@vue/runtime-core@3.4.27': resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} - dependencies: - '@vue/reactivity': 3.4.27 - '@vue/shared': 3.4.27 - dev: true - /@vue/runtime-dom@3.4.27: + '@vue/runtime-dom@3.4.27': resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} - dependencies: - '@vue/runtime-core': 3.4.27 - '@vue/shared': 3.4.27 - csstype: 3.1.3 - dev: true - /@vue/server-renderer@3.4.27(vue@3.4.27): + '@vue/server-renderer@3.4.27': resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} peerDependencies: vue: 3.4.27 - dependencies: - '@vue/compiler-ssr': 3.4.27 - '@vue/shared': 3.4.27 - vue: 3.4.27 - dev: true - /@vue/shared@3.4.27: + '@vue/shared@3.4.27': resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} - dev: true - /@vueuse/core@10.10.0(vue@3.4.27): + '@vueuse/core@10.10.0': resolution: {integrity: sha512-vexJ/YXYs2S42B783rI95lMt3GzEwkxzC8Hb0Ndpd8rD+p+Lk/Za4bd797Ym7yq4jXqdSyj3JLChunF/vyYjUw==} - dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.10.0 - '@vueuse/shared': 10.10.0(vue@3.4.27) - vue-demi: 0.14.7(vue@3.4.27) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - /@vueuse/integrations@10.10.0(focus-trap@7.5.4)(vue@3.4.27): + '@vueuse/integrations@10.10.0': resolution: {integrity: sha512-vHGeK7X6mkdkpcm1eE9t3Cpm21pNVfZRwrjwwbrEs9XftnSgszF4831G2rei8Dt9cIYJIfFV+iyx/29muimJPQ==} peerDependencies: async-validator: '*' @@ -766,216 +451,102 @@ packages: optional: true universal-cookie: optional: true - dependencies: - '@vueuse/core': 10.10.0(vue@3.4.27) - '@vueuse/shared': 10.10.0(vue@3.4.27) - focus-trap: 7.5.4 - vue-demi: 0.14.7(vue@3.4.27) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - /@vueuse/metadata@10.10.0: + '@vueuse/metadata@10.10.0': resolution: {integrity: sha512-UNAo2sTCAW5ge6OErPEHb5z7NEAg3XcO9Cj7OK45aZXfLLH1QkexDcZD77HBi5zvEiLOm1An+p/4b5K3Worpug==} - dev: true - /@vueuse/shared@10.10.0(vue@3.4.27): + '@vueuse/shared@10.10.0': resolution: {integrity: sha512-2aW33Ac0Uk0U+9yo3Ypg9s5KcR42cuehRWl7vnUHadQyFvCktseyxxEPBi1Eiq4D2yBGACOnqLZpx1eMc7g5Og==} - dependencies: - vue-demi: 0.14.7(vue@3.4.27) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - /algoliasearch@4.23.3: + algoliasearch@4.23.3: resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} - dependencies: - '@algolia/cache-browser-local-storage': 4.23.3 - '@algolia/cache-common': 4.23.3 - '@algolia/cache-in-memory': 4.23.3 - '@algolia/client-account': 4.23.3 - '@algolia/client-analytics': 4.23.3 - '@algolia/client-common': 4.23.3 - '@algolia/client-personalization': 4.23.3 - '@algolia/client-search': 4.23.3 - '@algolia/logger-common': 4.23.3 - '@algolia/logger-console': 4.23.3 - '@algolia/recommend': 4.23.3 - '@algolia/requester-browser-xhr': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/requester-node-http': 4.23.3 - '@algolia/transporter': 4.23.3 - dev: true - /csstype@3.1.3: + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true - /entities@4.5.0: + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: true - /esbuild@0.20.2: + esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - dev: true - /estree-walker@2.0.2: + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true - /focus-trap@7.5.4: + focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - dependencies: - tabbable: 6.2.0 - dev: true - /fsevents@2.3.3: + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - requiresBuild: true - dev: true - optional: true - /hookable@5.5.3: + hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - dev: true - /magic-string@0.30.10: + magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /mark.js@8.11.1: + mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - dev: true - /minisearch@6.3.0: + minisearch@6.3.0: resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} - dev: true - /mitt@3.0.1: + mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - dev: true - /nanoid@3.3.7: + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true - /perfect-debounce@1.0.0: + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - dev: true - /picocolors@1.0.1: + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - dev: true - /postcss@8.4.38: + postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - dev: true - /preact@10.22.0: + preact@10.22.0: resolution: {integrity: sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==} - dev: true - /rfdc@1.3.1: + rfdc@1.3.1: resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true - /rollup@4.17.2: + rollup@4.17.2: resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 - fsevents: 2.3.3 - dev: true - /search-insights@2.13.0: + search-insights@2.13.0: resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} - dev: true - /shiki@1.6.3: + shiki@1.6.3: resolution: {integrity: sha512-lE1/YGlzFY0hQSyEfsZj18xGrTWxyhFQkaiILALqTBZPbJeYFWpbUhlmTGPOupYB/qC+H6sV4UznJzcEh3WMHQ==} - dependencies: - '@shikijs/core': 1.6.3 - dev: true - /source-map-js@1.2.0: + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - dev: true - /speakingurl@14.0.1: + speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} - dev: true - /tabbable@6.2.0: + tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: true - /to-fast-properties@2.0.0: + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: true - /vite@5.2.13: + vite@5.2.13: resolution: {integrity: sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -1002,15 +573,8 @@ packages: optional: true terser: optional: true - dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.17.2 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vitepress@1.2.3(@algolia/client-search@4.23.3)(search-insights@2.13.0): + vitepress@1.2.3: resolution: {integrity: sha512-GvEsrEeNLiDE1+fuwDAYJCYLNZDAna+EtnXlPajhv/MYeTjbNK6Bvyg6NoTdO1sbwuQJ0vuJR99bOlH53bo6lg==} hasBin: true peerDependencies: @@ -1021,6 +585,543 @@ packages: optional: true postcss: optional: true + + vue-demi@0.14.7: + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue@3.4.27: + resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + +snapshots: + + '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0)': + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) + search-insights: 2.13.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)': + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) + '@algolia/client-search': 4.23.3 + algoliasearch: 4.23.3 + + '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)': + dependencies: + '@algolia/client-search': 4.23.3 + algoliasearch: 4.23.3 + + '@algolia/cache-browser-local-storage@4.23.3': + dependencies: + '@algolia/cache-common': 4.23.3 + + '@algolia/cache-common@4.23.3': {} + + '@algolia/cache-in-memory@4.23.3': + dependencies: + '@algolia/cache-common': 4.23.3 + + '@algolia/client-account@4.23.3': + dependencies: + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/client-analytics@4.23.3': + dependencies: + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/client-common@4.23.3': + dependencies: + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/client-personalization@4.23.3': + dependencies: + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/client-search@4.23.3': + dependencies: + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/logger-common@4.23.3': {} + + '@algolia/logger-console@4.23.3': + dependencies: + '@algolia/logger-common': 4.23.3 + + '@algolia/recommend@4.23.3': + dependencies: + '@algolia/cache-browser-local-storage': 4.23.3 + '@algolia/cache-common': 4.23.3 + '@algolia/cache-in-memory': 4.23.3 + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/logger-console': 4.23.3 + '@algolia/requester-browser-xhr': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/requester-node-http': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/requester-browser-xhr@4.23.3': + dependencies: + '@algolia/requester-common': 4.23.3 + + '@algolia/requester-common@4.23.3': {} + + '@algolia/requester-node-http@4.23.3': + dependencies: + '@algolia/requester-common': 4.23.3 + + '@algolia/transporter@4.23.3': + dependencies: + '@algolia/cache-common': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.24.5': {} + + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/types@7.24.5': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + + '@docsearch/css@3.6.0': {} + + '@docsearch/js@3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0)': + dependencies: + '@docsearch/react': 3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0) + preact: 10.22.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0)': + dependencies: + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) + '@docsearch/css': 3.6.0 + algoliasearch: 4.23.3 + search-insights: 2.13.0 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@rollup/rollup-android-arm-eabi@4.17.2': + optional: true + + '@rollup/rollup-android-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-x64@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.17.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.17.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.17.2': + optional: true + + '@shikijs/core@1.6.3': {} + + '@shikijs/transformers@1.6.3': + dependencies: + shiki: 1.6.3 + + '@types/estree@1.0.5': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.1': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdurl@2.0.0': {} + + '@types/web-bluetooth@0.0.20': {} + + '@vitejs/plugin-vue@5.0.5(vite@5.2.13)(vue@3.4.27)': + dependencies: + vite: 5.2.13 + vue: 3.4.27 + + '@vue/compiler-core@3.4.27': + dependencies: + '@babel/parser': 7.24.5 + '@vue/shared': 3.4.27 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.27': + dependencies: + '@vue/compiler-core': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/compiler-sfc@3.4.27': + dependencies: + '@babel/parser': 7.24.5 + '@vue/compiler-core': 3.4.27 + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.27': + dependencies: + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/devtools-api@7.2.1(vue@3.4.27)': + dependencies: + '@vue/devtools-kit': 7.2.1(vue@3.4.27) + transitivePeerDependencies: + - vue + + '@vue/devtools-kit@7.2.1(vue@3.4.27)': + dependencies: + '@vue/devtools-shared': 7.2.1 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + vue: 3.4.27 + + '@vue/devtools-shared@7.2.1': + dependencies: + rfdc: 1.3.1 + + '@vue/reactivity@3.4.27': + dependencies: + '@vue/shared': 3.4.27 + + '@vue/runtime-core@3.4.27': + dependencies: + '@vue/reactivity': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/runtime-dom@3.4.27': + dependencies: + '@vue/runtime-core': 3.4.27 + '@vue/shared': 3.4.27 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.27(vue@3.4.27)': + dependencies: + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + vue: 3.4.27 + + '@vue/shared@3.4.27': {} + + '@vueuse/core@10.10.0(vue@3.4.27)': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.10.0 + '@vueuse/shared': 10.10.0(vue@3.4.27) + vue-demi: 0.14.7(vue@3.4.27) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/integrations@10.10.0(focus-trap@7.5.4)(vue@3.4.27)': + dependencies: + '@vueuse/core': 10.10.0(vue@3.4.27) + '@vueuse/shared': 10.10.0(vue@3.4.27) + focus-trap: 7.5.4 + vue-demi: 0.14.7(vue@3.4.27) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.10.0': {} + + '@vueuse/shared@10.10.0(vue@3.4.27)': + dependencies: + vue-demi: 0.14.7(vue@3.4.27) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + algoliasearch@4.23.3: + dependencies: + '@algolia/cache-browser-local-storage': 4.23.3 + '@algolia/cache-common': 4.23.3 + '@algolia/cache-in-memory': 4.23.3 + '@algolia/client-account': 4.23.3 + '@algolia/client-analytics': 4.23.3 + '@algolia/client-common': 4.23.3 + '@algolia/client-personalization': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/logger-console': 4.23.3 + '@algolia/recommend': 4.23.3 + '@algolia/requester-browser-xhr': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/requester-node-http': 4.23.3 + '@algolia/transporter': 4.23.3 + + csstype@3.1.3: {} + + entities@4.5.0: {} + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + estree-walker@2.0.2: {} + + focus-trap@7.5.4: + dependencies: + tabbable: 6.2.0 + + fsevents@2.3.3: + optional: true + + hookable@5.5.3: {} + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + mark.js@8.11.1: {} + + minisearch@6.3.0: {} + + mitt@3.0.1: {} + + nanoid@3.3.7: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.0.1: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + preact@10.22.0: {} + + rfdc@1.3.1: {} + + rollup@4.17.2: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 + fsevents: 2.3.3 + + search-insights@2.13.0: {} + + shiki@1.6.3: + dependencies: + '@shikijs/core': 1.6.3 + + source-map-js@1.2.0: {} + + speakingurl@14.0.1: {} + + tabbable@6.2.0: {} + + to-fast-properties@2.0.0: {} + + vite@5.2.13: + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + fsevents: 2.3.3 + + vitepress@1.2.3(@algolia/client-search@4.23.3)(search-insights@2.13.0): dependencies: '@docsearch/css': 3.6.0 '@docsearch/js': 3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0) @@ -1064,34 +1165,15 @@ packages: - terser - typescript - universal-cookie - dev: true - /vue-demi@0.14.7(vue@3.4.27): - resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true + vue-demi@0.14.7(vue@3.4.27): dependencies: vue: 3.4.27 - dev: true - /vue@3.4.27: - resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + vue@3.4.27: dependencies: '@vue/compiler-dom': 3.4.27 '@vue/compiler-sfc': 3.4.27 '@vue/runtime-dom': 3.4.27 '@vue/server-renderer': 3.4.27(vue@3.4.27) '@vue/shared': 3.4.27 - dev: true From a073fc860b2602e1befe9244b36c25d71bcd8eb9 Mon Sep 17 00:00:00 2001 From: Dino-Kupinic Date: Wed, 19 Jun 2024 21:53:08 +0200 Subject: [PATCH 17/18] feat: add docs --- README.md | 48 ++++++++++++++---------- backend/.env.example | 15 ++++++-- backend/composer.lock | 75 ++++++++++++++++++------------------- docs/de/developers/setup.md | 47 +++++++++++++---------- 4 files changed, 106 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index 5487b92f..c2f56978 100644 --- a/README.md +++ b/README.md @@ -85,25 +85,35 @@ cd ../backend Create a `.env` file and checkout the `.env.example`. Copy the content into your `.env` and replace the following fields with your own. You may edit some existing fields aswell. -| Field | Description | -|---------------------------|--------------------------------------------------------------------------------------------| -| `APP_SECRET` | A secret key that's used to secure your application's services. | -| `SECRET_PASSWORD` | Database password | -| `USERNAME` | Database user | -| `BIND_PORT` | Database port | -| `DATABASE_URL` | The URL String to your database. It will use the env variables above. | -| `LDAP_PORT` | The port of your LDAP server. | -| `LDAP_URL` | The URL of your LDAP server. | -| `LDAP_BASE` | The base of your LDAP server. (`dc=schulbuchaktion,dc=env`) | -| `ROLES` | String of all roles seperated with commas (default `'SBA_ADMIN,SBA_LEHRER,SBA_FV,SBA_AV'`) | -| `SBA_ADMIN` | Group number of the admin group. (default `500`) | -| `SBA_LEHRER` | Group number of the teacher group. (default `501`) | -| `SBA_FV` | Group number of the subject responsible group. (default `502`) | -| `SBA_AV` | Group number of the head of department group. (default `503`) | -| `TOKEN_TIMEOUT` | How long a token is valid. (default `1800`) | -| `HOURS_AHEAD` | Timezone (default `2`) | -| `JWT_SECRET_ABSOLUT_PATH` | The absolute path to the private key for the JWT. | -| `CORS_ALLOW_ORIGIN` | The origin that is allowed to access the API. (default `localhost`) | +| Field | Description | +|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------| +| `APP_SECRET` | A secret key that's used to secure your application's services. | +| `SECRET_PASSWORD` | Database password | +| `USERNAME` | Database user | +| `BIND_PORT` | Database port | +| `DATABASE_URL` | The URL String to your database. It will use the env variables above. | +| `LDAP_PORT` | The port of your LDAP server. | +| `LDAP_URL` | The URL of your LDAP server. | +| `LDAP_BASE` | The base of your LDAP server. (`dc=schulbuchaktion,dc=env`) | +| `ROLES` | String of all roles seperated with commas (default `'SBA_ADMIN,SBA_LEHRER,SBA_FV,SBA_AV'`) | +| `SBA_ADMIN` | Group number of the admin group. (default `500`) | +| `SBA_LEHRER` | Group number of the teacher group. (default `501`) | +| `SBA_FV` | Group number of the subject responsible group. (default `502`) | +| `SBA_AV` | Group number of the head of department group. (default `503`) | +| `TOKEN_TIMEOUT` | How long a token is valid. (default `1800`) | +| `HOURS_AHEAD` | Timezone (default `2`) | +| `JWT_SECRET_ABSOLUT_PATH` | The absolute path to the private key for the JWT. | +| `CORS_ALLOW_ORIGIN` | The origin that is allowed to access the API. (default `localhost`) | +| `TOKEN_NAME` | Name of Cookie which contains bearer token (default `BearerToken`) | +| `CADDY_MERCURE_JWT_SECRET` | Used to securely sign JWTs for client authentication and authorization in a Caddy server setup with Mercure. | +| `TRUSTED_PROXIES` | Specifies the IP addresses or ranges of proxies that are trusted to correctly set client-related headers in a server configuration. | +| `TRUSTED_HOSTS` | Specifies a list of hostnames or patterns that are considered trusted and allowed to make requests. | +| `CADDY_MERCURE_URL` | Specifies the URL of the Mercure hub used by the Caddy server. | +| `CADDY_MERCURE_PUBLIC_URL` | Specifies the publicly accessible URL of the Mercure hub. | +| `HTTP_PORT` | Port which will be open for http connections. (default `80`) | +| `HTTPS_PORT` | Port which will be open for https connections. (default `443`) | +| `SHELL_VERBOSITY` | Verbosity level of server and symfony. (default `0`) | + > [!IMPORTANT] > For the `APP_SECRET` checkout https://symfony.com/doc/current/reference/configuration/framework.html#secret to see the diff --git a/backend/.env.example b/backend/.env.example index ea376bb5..ca7b5c9f 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -62,10 +62,19 @@ JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem JWT_PASSPHRASE=841be9d41e8702c0447e23f599d10d6a6b9516bc04240029ed4445731054b02c TOKEN_TIMEOUT=1800 -TOKEN_NAME=bearer -#Timezone +TOKEN_NAME=BearerToken +# PHP +CADDY_MERCURE_JWT_SECRET=YOUR_SECRET +TRUSTED_PROXIES=YOUR_PROXY +TRUSTED_HOSTS=YOUR_HOST +CADDY_MERCURE_URL=YOUR_URL +CADDY_MERCURE_PUBLIC_URL=YOUR_PUBLIC_URL +HTTP_PORT=80 +HTTPS_PORT=443 +SHELL_VERBOSITY=0 +# Timezone HOURS_AHEAD=2 -#Define absolut path of private key +# Define absolut path of private key JWT_SECRET_ABSOLUT_PATH=ABSOLUT_PATH_TO_SECRET_KEY ###< lexik/jwt-authentication-bundle ### diff --git a/backend/composer.lock b/backend/composer.lock index 68bf5f4e..18736a35 100644 --- a/backend/composer.lock +++ b/backend/composer.lock @@ -5832,16 +5832,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -5890,7 +5890,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -5906,20 +5906,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" + "reference": "e76343c631b453088e2260ac41dfebe21954de81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e76343c631b453088e2260ac41dfebe21954de81", + "reference": "e76343c631b453088e2260ac41dfebe21954de81", "shasum": "" }, "require": { @@ -5974,7 +5974,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.30.0" }, "funding": [ { @@ -5990,20 +5990,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:12:16+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "shasum": "" }, "require": { @@ -6058,7 +6058,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" }, "funding": [ { @@ -6074,20 +6074,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -6139,7 +6139,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -6155,20 +6155,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -6219,7 +6219,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -6235,25 +6235,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.1" }, "type": "library", "extra": { @@ -6296,7 +6295,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" }, "funding": [ { @@ -6312,7 +6311,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:35:24+00:00" }, { "name": "symfony/process", diff --git a/docs/de/developers/setup.md b/docs/de/developers/setup.md index db491753..668a9d2b 100644 --- a/docs/de/developers/setup.md +++ b/docs/de/developers/setup.md @@ -80,25 +80,34 @@ Erstellen Sie eine `.env` Datei und schauen Sie sich das `.env.example` an. Kopi ersetze Sie die folgenden Felder durch Ihre eigenen. Sie können auch einige bestehende Felder bearbeiten. -| Feld | Beschreibung | -|---------------------------|----------------------------------------------------------------------------------------------------| -| `APP_SECRET` | Ein geheimer Schlüssel, der verwendet wird, um die Dienste Ihrer Anwendung zu sichern. | -| `SECRET_PASSWORD` | Datenbank-Passwort | -| `USERNAME` | Datenbank-Benutzer | -| `BIND_PORT` | Datenbank-Port | -| `DATABASE_URL` | Der URL-String zu Ihrer Datenbank. Es werden die oben genannten Umgebungsvariablen verwendet. | -| `LDAP_PORT` | Der Port Ihres LDAP-Servers. | -| `LDAP_URL` | Die URL Ihres LDAP-Servers. | -| `LDAP_BASE` | Die Basis Ihres LDAP-Servers. (`dc=schulbuchaktion,dc=env`) | -| `ROLES` | Zeichenkette getrennt mit Komma von allen Rollen (Standard `'SBA_ADMIN,SBA_LEHRER,SBA_FV,SBA_AV'`) | -| `SBA_ADMIN` | Gruppennummer der Admin-Gruppe. (Standard `500`) | -| `SBA_LEHRER` | Gruppennummer der Lehrergruppe. (Voreinstellung `501`) | -| `SBA_FV` | Gruppennummer der Fachverantwortlichen-Gruppe. (Voreinstellung `502`) | -| `SBA_AV` | Gruppennummer der Abteilungsvorstands-Gruppe. (Voreinstellung `503`) | -| `TOKEN_TIMEOUT` | Wie lange ein Token gültig ist. (Voreinstellung `1800`) | -| `HOURS_AHEAD` | Zeitzone (Voreinstellung `2`) | -| `JWT_SECRET_ABSOLUT_PATH` | Der absolute Pfad zum privaten Schlüssel für das JWT. | -| `CORS_ALLOW_ORIGIN` | Die Herkunft, die auf die API zugreifen darf. (Standardwert `localhost`) | +| Feld | Beschreibung | +|----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| +| `APP_SECRET` | Ein geheimer Schlüssel, der verwendet wird, um die Dienste Ihrer Anwendung zu sichern. | +| `SECRET_PASSWORD` | Datenbank-Passwort | +| `USERNAME` | Datenbank-Benutzer | +| `BIND_PORT` | Datenbank-Port | +| `DATABASE_URL` | Der URL-String zu Ihrer Datenbank. Es werden die oben genannten Umgebungsvariablen verwendet. | +| `LDAP_PORT` | Der Port Ihres LDAP-Servers. | +| `LDAP_URL` | Die URL Ihres LDAP-Servers. | +| `LDAP_BASE` | Die Basis Ihres LDAP-Servers. (`dc=schulbuchaktion,dc=env`) | +| `ROLES` | Zeichenkette getrennt mit Komma von allen Rollen (Standard `'SBA_ADMIN,SBA_LEHRER,SBA_FV,SBA_AV'`) | +| `SBA_ADMIN` | Gruppennummer der Admin-Gruppe. (Standard `500`) | +| `SBA_LEHRER` | Gruppennummer der Lehrergruppe. (Voreinstellung `501`) | +| `SBA_FV` | Gruppennummer der Fachverantwortlichen-Gruppe. (Voreinstellung `502`) | +| `SBA_AV` | Gruppennummer der Abteilungsvorstands-Gruppe. (Voreinstellung `503`) | +| `TOKEN_TIMEOUT` | Wie lange ein Token gültig ist. (Voreinstellung `1800`) | +| `HOURS_AHEAD` | Zeitzone (Voreinstellung `2`) | +| `JWT_SECRET_ABSOLUT_PATH` | Der absolute Pfad zum privaten Schlüssel für das JWT. | +| `CORS_ALLOW_ORIGIN` | Die Herkunft, die auf die API zugreifen darf. (Standardwert `localhost`) | +| `TOKEN_NAME` | Name des Cookies, der das Bearer-Token enthält (Standard BearerToken) | +| `CADDY_MERCURE_JWT_SECRET` | Wird verwendet, um JWTs sicher für die Client-Authentifizierung und -Autorisierung in einer Caddy-Server-Konfiguration mit Mercure zu signieren. | +| `TRUSTED_PROXIES` | Gibt die IP-Adressen oder Bereiche von Proxys an, denen vertraut wird, die clientbezogenen Header in einer Serverkonfiguration korrekt zu setzen. | +| `TRUSTED_HOSTS` | Gibt eine Liste von Hostnamen oder Mustern an, die als vertrauenswürdig gelten und Anfragen stellen dürfen. | +| `CADDY_MERCURE_URL` | Gibt die URL des von der Caddy-Server verwendeten Mercure-Hubs an. | +| `CADDY_MERCURE_PUBLIC_URL` | Gibt die öffentlich zugängliche URL des Mercure-Hubs an. | +| `HTTP_PORT` | Port, der für HTTP-Verbindungen geöffnet wird. (Standard `80`) | +| `HTTPS_PORT` | Port, der für HTTPS-Verbindungen geöffnet wird. (Standard `443`) | +| `SHELL_VERBOSITY` | Verbositätsgrad von Server und Symfony. (Standard `0`) | ::: danger GEFAHR Für das `APP_SECRET` schauen Sie bitte From 9b8dbfcca7be5c087d80f756ccffbfa8729a527f Mon Sep 17 00:00:00 2001 From: Dino-Kupinic Date: Wed, 19 Jun 2024 21:56:17 +0200 Subject: [PATCH 18/18] chore(release): v0.17.0 --- frontend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index 5eed666e..c5452d6f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -2,7 +2,7 @@ "name": "nuxt-app", "private": true, "type": "module", - "version": "0.16.3", + "version": "0.17.0", "scripts": { "build": "nuxt build", "dev": "nuxt dev",